2017/4/22 (土) 22:52:45 taki |
コンポーネントの登録先はFormなんですね。
複数個のコンポーネントを動的に生成する時、配列を用意して
PanelArray[i] := TPanel.Create(Self);
なんて記述するので、てっきり配列に登録するんだと思っていました。
複数個のコンポーネントを生成後、配列にnilを代入してもコンポーネントは
消えないし、クリックすると反応するし。
http://mrxray.on.coocan.jp/Delphi/plSamples/161_CreateComponent_List.htm の
02_複数のパネルを作成 ( 配列を使用 ) の一部を使いテストしました。
Button2はForm1のControlCountを表示します。
パネルを生成する前は4で、生成後は9になります。ここに登録されるんですね。
Button3は配列にnilを代入しています。
それでも、生成したpanelをクリックすると色が変わります。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private 宣言 }
//作成する個数が決まっている場合用の配列(静的配列)
FPanelArray1 : array[0..4] of TPanel;
procedure PanelClickEvent(Sender : TObject);
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
LWidth : Integer;
LHeight: Integer;
i : Integer;
begin
//パネルを作成
LWidth := 100;
LHeight := 28;
for i := 0 to High(FPanelArray1) do begin
FPanelArray1[i] := TPanel.Create(Self);
//Parent(配置場所)をSelf,つまりこのForm1とする
//これがないと配置場所不明で表示されない
FPanelArray1[i].Parent := Self;
FPanelArray1[i].Left := 90;
FPanelArray1[i].Width := LWidth;
FPanelArray1[i].Height := LHeight;
FPanelArray1[i].Top := 40 + (LHeight + 3) * (i - 1);
FPanelArray1[i].Color := clSilver;
FPanelArray1[i].Caption := 'Panel ' + IntToStr(i + 1);
//これがないとTPanelのColorプロパティの設定が反映されない場合がある
FPanelArray1[i].ParentBackground := False;
//OnClickイベントをPanelClickEventというメソッドに割当てる
FPanelArray1[i].OnClick := PanelClickEvent;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
label1.Caption := inttostr(Self.ControlCount);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to High(FPanelArray1) do begin
FPanelArray1[i] := nil;
end;
end;
procedure TForm1.PanelClickEvent(Sender: TObject);
begin
TPanel(Sender).Color := RGB(Random(255), Random(255), Random(255));
end;
end.
でも、Panelを簡単に操作するにはFPanelArray1はやはり必要ですね。
|
|