喫茶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.


[11063] Re:procedure手続きを手続き名で検索できますか返信 削除
2017/4/10 (月) 19:42:08 taki
Form1.MethodAddress()が使えそうな…。
しかし、よくわからん。


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