点灯游戏--一个动态创建组件的示例

2019-04-14 16:57发布

{点灯游戏--一个动态创建组件的示例Tips : 在动态创建组件时, Parent属性设定很重要, 如果不设定, 组件是不能显示的~~ 呵呵, 这个是易犯的低级错误, 至少对我来说.}unit ULamp; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TFormLamp = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } protected procedure PanelClickHandle(Sender: TObject); end; function IsFinished: Boolean; var FormLamp: TFormLamp; LampPanel : array[0..24] of TPanel; implementation {$R *.dfm} function IsFinished: Boolean; var i: Integer; begin Result := True; for i := 0 to 24 do begin if (LampPanel[i].Color = $006060) then Result := Result and False; end; end; procedure TFormLamp.PanelClickHandle(Sender: TObject); var X,Y: Integer; ThisTag: Integer; begin { 上: (X,Y-1); 下: (X,Y+1), 左: (X-1,Y), 右: (X+1,Y); } ThisTag := (Sender as TPanel).Tag; X := ThisTag div 5; Y := ThisTag mod 5; LampPanel[ThisTag].Color := $ffffff - LampPanel[ThisTag].Color; if (Y>0) then LampPanel[X*5+Y-1].Color := $ffffff - LampPanel[X*5+Y-1].Color; if (X>0) then LampPanel[(X-1)*5+Y].Color := $ffffff - LampPanel[(X-1)*5+Y].Color; if (Y<4) then LampPanel[X*5+Y+1].Color := $ffffff - LampPanel[X*5+Y+1].Color; if (X<4) then LampPanel[(X+1)*5+Y].Color := $ffffff - LampPanel[(X+1)*5+Y].Color; // 检查是否都点亮 if IsFinished then ShowMessage('你真行, 所有的灯都点亮了!!'); //(Sender as TPanel).Color := $ffffff - (Sender as TPanel).Color; end; procedure TFormLamp.FormCreate(Sender: TObject); var i,j: Integer; begin Position := poScreenCenter; for i := 0 to 4 do for j := 0 to 4 do begin LampPanel[i * 5 + j] := TPanel.Create(Self); with LampPanel[i * 5 + j] do begin Tag := i * 5 + j; Caption := IntToStr(Tag); Parent := Self; Top := 70 + i * 60; Left := 100 + j * 50; Width := 55; Height := 55; Color := $006060; OnClick := PanelClickHandle; end; end; end; procedure TFormLamp.FormDestroy(Sender: TObject); var i : Integer; begin for i := 0 to 24 do if LampPanel[i] <> nil then LampPanel[i].Free; end; end.