喫茶XRAYトップページ

[スレッド全体
]

[11075] Re2:procedure手続きを手続き名で検索できますか返信 削除
2017/4/11 (火) 13:08:56 taki
▼ snailさん
> ▼ takiさん
>
> >   MyButton.OnClick := MyEvent;  // ← ここの値を'MyEvent'から得たい
>
>
> この意味が理解手せきません。おせーて


分かりにくくてすみません。

「MyButton.OnClick := MyEvent;」

はOnClickイベントにMyEvent手続きを関連付け(登録?)することで、
たぶん、手続きのポインタが渡されるんだろうなと想像してました。

「// ← ここの値を'MyEvent'から得たい」

は'MyEvent'文字列でポインタを探す方法がないかなと言う意味です。

えっと…、基本的な間違いがありますか? (^_^;


[11080] Re3:procedure手続きを手続き名で検索できますか返信 削除
2017/4/11 (火) 14:56:15 taki
▼ snailさん

 >   MyButton.OnClick := MyEvent;  // ← ここの値を'MyEvent'から得たい

これって、変ですよね。
たまたまOnClickだったからコンパイラーが許してくれたのかも。


[11083] Re4:procedure手続きを手続き名で検索できますか返信 削除
2017/4/11 (火) 16:09:08 taki
>  >   MyButton.OnClick := MyEvent;  // ← ここの値を'MyEvent'から得たい
>
> これって、変ですよね。
> たまたまOnClickだったからコンパイラーが許してくれたのかも。


すみません。

MyButton.OnClick := TNotifyEvent(method);

と勘違いしました。


[11084] Re5:procedure手続きを手続き名で検索できますか返信 削除
2017/4/11 (火) 16:36:23 snail
インターネットで検索するとメソッドアドレス取り出し方法として
MethodAddress が利用できる山本さんやStackOverflowなどで
紹介されていたので実際に試してみました。

// サンプルソース抜粋
function TForm9.MethodFromName(const Name: string): TNotifyEvent;
begin
  TMethod(Result).Data := Self;
  TMethod(Result).Code := Self.MethodAddress(Name);
  if TMethod(Result).Code=nil then
    Memo1.Lines.Add('Not find ' + Name )
   else
    Memo1.Lines.Add('Find ' + Name );
end;

結果、メソッドが定義されている場所が private や public だと駄目でした。
なぜ駄目かは?

[11085] Re6:procedure手続きを手続き名で検索できますか返信 削除
2017/4/11 (火) 18:23:22 igy
▼ snailさん
> 結果、メソッドが定義されている場所が private や public だと駄目でした。
> なぜ駄目かは?


上のほうでも、書きましたが、

Delphi7のヘルプでは、

> MethodAddress メソッドは,パブリッシュメソッドのアドレスを返します。

とありますので、publish以外では、ダメみたいですね。


[11087] Re7:procedure手続きを手続き名で検索できますか返信 削除
2017/4/11 (火) 20:32:28 snail
▼ igyさん

> > MethodAddress メソッドは,パブリッシュメソッドのアドレスを返します。
>
> とありますので、publish以外では、ダメみたいですね。


ヘルプを改めてみると
> published メンバについては、コンパイラにより実行時型情報が生成されます。
> published プロパティは、設計時に[オブジェクト インスペクタ]に表示されます。


snailは1つ賢くなった。が、2つ忘れた。



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