3

たとえば、独自のイベント プロシージャを割り当てたいとします。

procedure TSuperObject.DoSomething(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Yes, I am doing');
end;

フォーム上の任意の TWinControl に。通常、フォームに Panel1 (TPanel) がある場合は、簡単に実行できます。

Panel1.OnMouseDown:=SuperObject1.DoSomething;

しかし、それを普遍的にしたいのなら、どうすればそれを達成できるでしょうか? TWincontrol の保護されたメンバーにアクセスできないため、直感的な答え:

AnyWinControl.OnMouseDown:=SuperObject1.DoSomething;

単に機能しません。

RTTIでできますか?どのように?

ありがとう

4

1 に答える 1

8

RTTI は必要ありません。

すべてのコードは、同じ unit で宣言されたすべてのクラスの保護されたメンバーに暗黙的にアクセスできます。TWinControlそのクラスのメンバーにアクセスする必要があるユニットで新しい子孫を宣言することで、これを利用できます。宣言は非常に単純です。

type
  TProtectedWinControl = class(TWinControl);

次に、他のTWinControl子孫をその新しい型に型キャストすると、その保護されたフィールド、プロパティ、およびメソッドのいずれかにアクセスできるようになります。の保護されたメンバーは、 (継承によって)TWinControlの自動的に保護されたメンバーになるため、現在のユニットはそれらにアクセスできます。TProtectedWinControl

TProtectedWinControl(AnyWinControl).OnMouseDown := SuperObject1.DoSomething;

これは保護されたメンバーに適用さますが、厳密な保護されたメンバーには適用されないことに注意してください。

于 2013-08-05T21:05:59.047 に答える