動的にコンポーネントを生成しているのですが、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.
|