喫茶XRAYトップページ

[スレッド全体
]

[11137] コンポーネントの登録先はForm … 何を今さら。返信 削除
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はやはり必要ですね。


[11139] Re:コンポーネントの登録先はForm … 何を今さら。返信 削除
2017/4/23 (日) 08:41:14 Mr.XRAY
▼ takiさん
> Button3は配列にnilを代入しています。
> それでも、生成したpanelをクリックすると色が変わります。


ですね.
配列はあくまで管理用です.
コンポーネントのインスタンス(実体) そのものは存在しますから.

> でも、Panelを簡単に操作するにはFPanelArray1はやはり必要ですね。

です.
いちいちループで操作目的のコンポーネントを探すよりは便利かと.


[11140] Re2:コンポーネントの登録先はForm … 何を今さら。返信 削除
2017/4/23 (日) 10:18:20 taki
▼ Mr.XRAYさん
> ▼ takiさん
> > Button3は配列にnilを代入しています。
> > それでも、生成したpanelをクリックすると色が変わります。
>
> ですね.
> 配列はあくまで管理用です.
> コンポーネントのインスタンス(実体) そのものは存在しますから.
>
> > でも、Panelを簡単に操作するにはFPanelArray1はやはり必要ですね。
>
> です.
> いちいちループで操作目的のコンポーネントを探すよりは便利かと.


Formという教室があり、そこにはコンポーネントという学生が存在する。
そこへ転入生という学生が入ってくる。
Formの名簿はControls[]であり、転入生の名簿はFPanelArray1[]という感じ
でしょうか。
両方ともただの名簿なんですね。学生はそこにいるのだから。

まあ、大学の講義には実体の無い学生もいましたがね。


[11142] Re3:コンポーネントの登録先はForm … 何を今さら。返信 削除
2017/4/23 (日) 11:15:20 Mr.XRAY
▼ takiさん

> Formの名簿はControls[]であり、転入生の名簿はFPanelArray1[]という感じ

へへへっ,これ使える.
サンプルの記事の説明用に使わせてね.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82