喫茶XRAYトップページ

[スレッド全体
]

[11062] procedure手続きを手続き名で検索できますか返信 削除
2017/4/10 (月) 19:06:04 taki
動的にコンポーネントを生成しているのですが、text等に記録した文字列から生成したいのです。
TopとかLeftとかCaptionとかは文字列から値を代入できます。
MyButton.ParentはGetComponentByName()という関数を作って文字列'Panel1'からTWinControlを
得ることができたのですが、MyEvent手続きを手続き名'MyEvent'から探す方法が分かりません。

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;
    Panel1: TPanel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
    MyButton:TButton;
    procedure MyEvent(Sender: TObject);
    function GetComponentByName(AName:String):TComponent;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetComponentByName(AName:String):TComponent;
var
  i:integer;
begin
  result := self;     // 無かったらForm1に生成
  if Form1.ComponentCount = 0 then exit;
  for i := 0 to Form1.ComponentCount - 1 do begin
    if Form1.Components[i].Name = AName then begin
      result := Form1.Components[i];
      exit;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyButton := TButton.Create(Self);
  MyButton.Parent := GetComponentByName('Panel1') as TWinControl;
//Panel1上にボタンを生成している
  MyButton.Top := 20;
  MyButton.Left := 20;
  MyButton.Caption := '私のボタン';
  MyButton.OnClick := MyEvent;  // ← ここの値を'MyEvent'から得たい
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if MyButton <> nil then FreeAndNil(MyButton);
end;

procedure TForm1.MyEvent(Sender: TObject);
begin
  beep;
end;

end.


[11086] TWinControlを検索返信 削除
2017/4/11 (火) 19:51:16 Mr.XRAY
>   MyButton.OnClick := MyEvent;  // ← ここの値を'MyEvent'から得たい

ができるようになったところで,

  MyButton.Parent := GetComponentByName('Panel1') as TWinControl;

なんですが,以下のようにできる気がします.
親コントロール(コンテナ)になれるのは TWindControl だけですから,
FindControl は TWinControl だけを検索します.

  MyButton.Parent := FindControl(Panel2.Handle);

http://docwiki.embarcadero.com/Libraries/Berlin/ja/Vcl.Controls.FindControl

[追記]
つまり,こういう感じです.

type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    MyButton : TButton;
  public
    { Public 宣言 }
  published
    procedure MyEvent(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  LMethod : TMethod;
begin
  MyButton := TButton.Create(Self);
  MyButton.Parent := FindControl(Panel1.Handle);
  MyButton.Top := 20;
  MyButton.Left := 20;
  MyButton.Caption := '私のボタン';

  LMethod.Data := Self;
  LMethod.Code := Self.MethodAddress('MyEvent');
  if Assigned(LMethod.Code) then begin
    MyButton.OnClick := TNotifyEvent(LMethod);
  end;
end;

procedure TForm1.MyEvent(Sender: TObject);
begin
  ShowMessage('Clicked !!');
end;



[11089] Re:TWinControlを検索返信 削除
2017/4/12 (水) 00:18:46 Mr.XRAY
> なんですが,以下のようにできる気がします.
> 親コントロール(コンテナ)になれるのは TWindControl だけですから,
> FindControl は TWinControl だけを検索します.


あっ,ゴメンナさい.もしかして,これも名前で調べたいのですね.
失礼しました m(_ _)m


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