2

そのため、ボタンをダブルクリックしてボタンクリック手順をオートコンプリートすると、関数がどのボタンにリンクされているかをコンパイラがどのように認識しているかに興味があります。たとえば、TForm1.Button1Click(Sender: TObject); を作成します。

では、コンパイラはどのボタンがリンクされているかをどのように認識するのでしょうか? プロシージャ名を解析して、それがどのボタンであるかを確認するだけですか?

4

2 に答える 2

10

メソッドには任意の名前を付けることができ、Delphiはメソッド名を解析または使用して、関連付けられているコンポーネントまたはイベントを識別しません。

設計時にこれを行うと、イベントハンドラーとのイベントの関連付けがDFMファイルに保存され、次のようになります。

  object Button1: TButton
    Left = 104
    Top = 64
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end

これOnClick = Button1Clickにより、プログラムは、フォームの作成時に、実行時にメソッド(イベントハンドラーとも呼ばれます)をオブジェクトのイベント(特別な種類のプロパティ)に関連付けます。

たとえば、次のコードを使用して、実行時に任意の準拠メソッドにイベントを関連付けることもできます。

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    procedure MyClick(Sender: TObject);
    procedure MyOtherClick(Sender: TObject);


  ....

procedure TForm1.AssociateClickHandler;
begin
  Button1.OnClick := MyClick;
end;

procedure TForm1.MyClick(Sender: TObject);
begin
  Button1.OnClick := MyOtherClick; //from now, the other method with handle the event.
end;

任意の名前を使用してください

設計時に、イベントハンドラーに必要な名前をObjectInspectorに直接記述し、Enterキーを押すと、Delphiがその名前のメソッドを作成します。名前を指定しない場合、Delphiは、コンポーネント名と「オン」のないイベント名を使用して、メソッドの名前を自動生成します。メソッドがすでに存在する場合、IDEはイベントをそのメソッドに関連付けるだけです。

目的のメソッド名を記述します。

ここに画像の説明を入力してください

Enterキーを押します。

ここに画像の説明を入力してください

同じメソッドを、同じオブジェクトの異なるイベント、または異なるオブジェクトの同じイベントに関連付けることができます。

たとえば、上記のMyOwnMethodNameを任意の数のボタンのOnClickに関連付けることができます。通常、Senderパラメーターには、イベントを発生させているオブジェクトへの参照が含まれています。

于 2013-01-11T19:26:58.423 に答える
4

コンパイラはこれには関与しません。代わりに、IDEがすべてを処理します。

デザイン時にコントロールをダブルクリックすると、フォームデザイナは、メモリ内のライブオブジェクトであるため、どのコントロールがクリックされているかを認識します。

フォームデザイナは、コントロールのRTTIと登録されTComponentEditorた実装(ユーザー定義の実装が登録されていない場合はVCLがデフォルトの実装を提供します)を使用して、そのクラスタイプのどのイベントがデフォルトのイベントであるかを判断します(の場合TButton、それはOnClickイベントです) 。次に、RTTIを使用して、そのイベントにハンドラーがすでに割り当てられているかどうかを確認します。

ハンドラーがまだ割り当てられていない場合、フォームデザイナーはRTTIを使用してコントロールのNameプロパティとイベントの宣言された名前を読み取り、それらを連結して(イベント名の一部を削除On)、ソースコードでその名前のプロシージャを探します。コントロールのOwner。そのプロシージャが見つからない場合は、その時点で作成されます。

フォームデザイナはプロシージャを見つけると、RTTIを使用して、プロシージャがイベントの署名と一致することを検証し、必要に応じてプロシージャを新しいイベントハンドラとして割り当ててから、最終的にコードエディタのプロシージャ実装にジャンプします。

オブジェクトインスペクターでコントロールのイベントをクリックしてハンドラーの名前を変更すると、ソースコード内の対応するプロシージャの名前が新しい名前に一致するように変更され、同じプロシージャにリンクされている他のコンポーネントのイベントも更新されます。 RTTIを介して、新しい名前にも一致させます。

プロジェクトをコンパイルするとき、IDEは最初にRTTIと登録済みコンポーネントストリーミングルーチンを利用して、さまざまなコンポーネントプロパティ/イベント値のすべてを含む.DFMファイルを作成します。次に、コンパイラを呼び出します。コンパイラは、.DFMファイル内のソースコードとリンクをバイナリリソースとして最終的な実行可能ファイルにコンパイルします。

実行時に、RTLはRTTIと登録済みのカスタムコンポーネントストリーミングルーチンを使用してDFMリソースを解析し、さまざまなコンポーネントを見つけて、必要に応じてそれらのプロパティ/イベント値をフックします。

于 2013-01-11T20:27:57.280 に答える