unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, extctrls; type tGetFruit = class W : tGroupBox; Objs : Array of TObject; Constructor Create( X : tObject; l,t : Word ); Destructor Destroy; //Procedure Refresh; End; tFruit = class Juiciness : Extended; Name : String; Size : LongInt; Inp : tGetFruit; Tmr : TTimer; Constructor Create(N:String; l,t : Word ); virtual; // Procedure View( X : TImage ); virtual; Procedure Time ( Sender : TObject ); virtual; Procedure Squish ( Sender : TObject ); virtual; Procedure Eat ( Sender : TObject ); virtual; Procedure Rename ( Sender : TObject ); Destructor Destroy ( Sender : TObject ); // Procedure Fin ( Sender : TObject ); End; tCitrus = class (tFruit) Peeled : Boolean; Procedure Time ( Sender : TObject ); override; Procedure Squish ( Sender : TObject ); override; Procedure Eat ( Sender : TObject ); override; Procedure Peel ( Sender : TObject ); Constructor Create( N : String; l,t : Word ); override; End; tOrange = class (tCitrus) Seeds : Byte; Procedure Time ( Sender : TObject ); override; Procedure Squish ( Sender : TObject ); override; Procedure Eat ( Sender : TObject ); override; Constructor Create( N : String; l,t : Word ); override; End; TForm1 = class(TForm) Button1: TButton; RadioGroup1: TRadioGroup; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure CreateFruit(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure CreateCitrus(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure CreateOrange(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); // Procedure private { Private declarations } public { Public declarations } end; var Form1: TForm1; // Inp : tGetFruit; Fruits : Array of tFruit; implementation Constructor tFruit.Create(N:String; l,t : Word); Begin Juiciness := 1; Name := N; Inp := tGetFruit.Create(self,l,t); Tmr := TTimer.Create( Form1 ); // Tmr.Parent := Form1; Tmr.Enabled := True; Tmr.Interval := 667; Tmr.OnTimer := Time; End; Constructor tCitrus.Create( N : String ; l,t : Word); Begin inherited; Peeled := False; End; Constructor tOrange.Create( N : String ; l,t : Word); Begin inherited; Seeds := 0; End; Constructor tGetFruit.Create ( X : tobject; l,t : Word ); Var I : Byte; Begin W := tGroupBox.Create( Form1 ); W.Parent := Form1; W.Left := l; W.Top :=t; W.Width := 150; W.Height := 200; w.Caption := tFruit(X).Name; SetLength( Objs, 4); For I := 0 to high(objs) Do Begin Objs[i] := TButton.Create( W ); With Objs[i] as TButton Do Begin Parent := W; Left := W.Width div 2 - 50; Width := 100; Top := W.Height - 25*i - 35; Height := 20; //Caption := 'Update Fruit'; End; End; TButton(Objs[0]).Caption := 'Peel'; If (X is tCitrus) Then TButton(Objs[0]).OnClick := tCitrus(X).Peel Else TButton(Objs[0]).Enabled := False; TButton(Objs[1]).Caption := 'Squish'; TButton(Objs[1]).OnClick := tFruit(X).Squish; TButton(Objs[2]).Caption := 'Eat'; TButton(Objs[2]).OnClick := tFruit(X).Eat; TButton(Objs[3]).Caption := 'Rename'; TButton(Objs[3]).OnClick := tFruit(X).Rename; SetLength( Objs, 5 ); Objs[4] := tLabel.Create(W); With Objs[i] as TLabel Do Begin Parent := W; Left := 20; Width := 100; Top := 30; Height := 20; //Caption := 'Update Fruit'; End; End; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin Case RadioGroup1.ItemIndex Of 0: OnMouseDown := CreateFruit; 1: OnMouseDown := CreateCitrus; 2: OnMouseDown := CreateOrange; End; end; procedure TForm1.CreateFruit(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetLength( Fruits, Length(Fruits)+1 ); Fruits[high(fruits)] := tFruit.Create('Fruit #'+IntToStr(high(fruits)), x, y); end; procedure TForm1.CreateCitrus(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetLength( Fruits, Length(Fruits)+1 ); Fruits[high(fruits)] := tCitrus.Create('Fruit #'+IntToStr(high(fruits)), x, y); end; procedure TForm1.CreateOrange(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetLength( Fruits, Length(Fruits)+1 ); Fruits[high(fruits)] := tOrange.Create('Fruit #'+IntToStr(high(fruits)), x, y); end; procedure TForm1.FormCreate(Sender: TObject); begin OnMouseDown := nil; end; Procedure tFruit.Time ( Sender : TObject ); Begin Inc(Size,Random(2)+1); Juiciness := Juiciness*(Random(10)+1) / 10; Inp.W.Caption := Name; TLabel(Inp.Objs[4]).Caption := 'Size: '+IntToStr(Size)+' Juice: '+FloatToStr(Juiciness); End; Procedure tFruit.Squish ( Sender : TObject ); Begin Juiciness := 1; Size := Size div 2; End; Procedure tFruit.Eat ( Sender : TObject ); Begin Size := 1; Juiciness := 1; End; Procedure tCitrus.Eat ( Sender : TObject ); Begin if Peeled then inherited; End; Procedure tCitrus.Time ( Sender : TObject ); Begin inherited; If peeled then TLabel(Inp.Objs[4]).Caption := TLabel(Inp.Objs[4]).Caption + ' no peel remaining '; End; Procedure tOrange.Time ( Sender : TObject ); Begin inherited; TLabel(Inp.Objs[4]).Caption := TLabel(Inp.Objs[4]).Caption + ' Seeds: ' + IntToStr(Seeds); End; Procedure tOrange.Squish ( Sender : TObject ); Begin inherited; End; Procedure tCitrus.Squish ( Sender : TObject ); Begin inherited; End; Procedure tOrange.Eat ( Sender : TObject ); Begin inherited; If peeled then Seeds := 0; End; Destructor tFruit.Destroy ( Sender : TObject ); Begin Inp.W.Free; Tmr.Free; Inp.Free; End; { Procedure tFruit.Fin ( Sender : TObject ); Begin //Inp.W.Free; Tmr.Free; Inp.Destroy; //Destroy(Sender); End; } Procedure tFruit.Rename ( Sender : TObject ); Begin Name := InputBox( 'Rename fruit','Type new name:',Name); End; Procedure tCitrus.Peel ( Sender : TObject ); Begin Peeled := True; End; Destructor tGetFruit.Destroy; Begin // W.Free; End; end.