1

いくつかのプロパティをデータベースに保存してロードする必要がありますが、これで行き詰まります。いくつかのメソッドとボタンを備えたフォームがあります。button.onclickイベントは、フォームのメソッドの1つに割り当てられます。割り当てられたメソッドの名前を文字列として取得し(オブジェクトインスペクター「form1.proc1」のように)、データベースに保存する必要があります。後で、データベースからメソッド名を取得し、対応するフォームのメソッドにbutton.onclickを割り当てる必要があります。これは可能ですか?

Form1 = class(TForm)
...
procedure proc1(Sender: TObject);
procedure proc2(Sender: TObject);
procedure proc3(Sender: TObject);

Button1.OnClick = readMethodNameFromDatabase; 
...
saveMethodToDatabase(Button1.OnClick);
4

1 に答える 1

4

次のように、名前を指定してメソッドを取得できます。

function TForm1.MethodFromName(const Name: string): TNotifyEvent;
begin
  TMethod(Result).Data := Self;
  TMethod(Result).Code := MethodAddress(Name);
  if TMethod(Result).Code=nil then
    raise Exception.CreateFmt('Count not find method named %s', [Name]);
end;

これは、RTLが.dfmファイルを読み取るときに使用するメカニズムです。公開されているメソッドに依存します。

あなたはそれをこのように呼ぶことができます:

Button1.OnClick := TNotifyEvent(MethodFromName('Button1Click'));

当然、最終的なコードで読み取られたデータベースに置き換えます。


質問の2番目の部分については、次のコードでイベントハンドラーの名前を取得できます。

MethodName(@Button1.OnClick);
于 2012-09-11T10:40:01.290 に答える