Accesso all’evento protetto di TWinControl

immagina, vuoi assegnare la tua procedura evento:

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

a qualsiasi TWinControl sul modulo. Normalmente se hai il Panel1 (TPanel) nel modulo, puoi farlo facilmente:

 Panel1.OnMouseDown:=SuperObject1.DoSomething; 

Ma se vuoi farlo universalmente, come può essere realizzato? Non è ansible accedere ai membri protetti di TWincontrol, quindi una risposta intuitiva:

 AnyWinControl.OnMouseDown:=SuperObject1.DoSomething; 

semplicemente non funziona.

Può essere fatto da RTTI? Come?

    thanx

    Non hai bisogno di RTTI.

    Qualsiasi codice ha accesso implicito ai membri protetti di qualsiasi class dichiarata nella stessa unità . Puoi trarre vantaggio da ciò dichiarando un nuovo discendente TWinControl nell’unità che deve accedere ai membri di quella class. La dichiarazione è molto semplice:

     type TProtectedWinControl = class(TWinControl); 

    Quindi, digita tutti gli altri discendenti di TWinControl per quel nuovo tipo e avrai accesso a qualsiasi campo, proprietà e metodi protetti. I membri protetti di TWinControl sono membri protetti automaticamente di TProtectedWinControl (tramite ereditarietà), pertanto l’unità corrente può accedervi.

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

    Nota che questo si applica ai membri protetti , ma non ai membri protetti rigorosamente .