TProc<TObject> zu TNotifyEvent
Weiter zu diesem post, deren akzeptierte Antwort bleibt sehr kryptisch:
@Button1.OnClick := pPointer(Cardinal(pPointer( procedure (sender: tObject) begin ((sender as TButton).Owner as TForm).Caption := 'Freedom to anonymous methods!' end )^ ) + $0C)^;
Frage ich mich, ob es möglich ist, erarbeiten die einfachste und elegante Weise, ähnlich:
Button.OnClick :=
AnonProc2NotifyEvent (
procedure (Sender: TObject)
begin
((Sender as TButton).Owner as TForm).Caption := 'Freedom to anonymous methods!'
end
);
so, wie Sie zu erreichen, den gleichen Zweck und wo AnonProc2NotifyEvent ist eine Methode, die Besitzer der Schaltfläche mit der folgenden Signatur:
TOwnerOfButton = class(TForm)
Button: TButton;
...
private
...
protected
function AnonProc2NotifyEvent(aProc: TProc<TObject>): TNotifyEvent;
public
...
end;
Ist das machbar und wenn ja, wie umsetzen ?
- Möchten Sie vielleicht einen Blick auf DSharp.Core.Veranstaltungen.pas.
- Glienke: Danke für die Erinnerung es mir, ich habe in der Tat DSharp installiert auf meiner Kiste und ich habe es (nach meinem entlassen, die ich nicht verwenden es oft so oft), aber glaube, ich Folge ihm seit seiner Gründung (Bwt-ich bin auch Mitglied der DelphiPraxis, nicht sehr gut Deutsch aber Sie versuchen im Auge zu behalten, um die lebhafte Deutsche Delphi-Szene). Sicher Generika ist mein Nächster Schritt. Vielen Dank Stevie 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser wird den job zu erledigen leicht genug:
Den
Owner
parameter inAnonProc2NotifyEvent
ist, so dass die Lebensdauer der wrapper-Objekt verwaltet werden können. Ohne sowas würden Sie Leck InstanzenTNotifyEventWrapper
.Pass als
Owner
, die Komponente, zu der Sie eine Verbindung herstellen der Veranstaltung. Zum Beispiel:So, wenn der button ist zerstört, die
TNotifyEventWrapper
wird auch zerstört werden. Das wrapper-Objekt Leben müssen, mindestens so lange wie das Objekt, dessen Ereignisse assoziiert ist. Und so ist die Wahl derButton1
als Eigentümer ist die Natürliche und offensichtliche ein.Referenz für das, was ich bin immer bei, ich studierte Barry Kelly's blog post verwiesen, in der vor SO post erwähnt und kam mit dieser Lösung:
Immer noch kryptisch, aber umhüllter, also die Erleichterung der Aufgabe der coder im Vergleich zu der ersten Methode.
Habe ich versucht in Ordnung zu bringen MethRefToMethPtr und MakeNotify und legen Sie Sie alle in einer Methode.
Bemerkt, dass es (leichte) änderung der Methodensignatur, das argument aProc wurde const.
TMethod.Data
. Sie würde nur daran denken müssen, verringern Sie den refcount, wenn die Komponente (Button1
) ist nicht mehr mit dem Ereignis, zB:type PInterface = ^IInterface; IInterface(TMethod(Result).Data) := PInterface(@aProc)^; ... IInterface(TMethod(Result).Data) := nil;