![]() |
Delphi-Version: XE4
Mehrfachbehandlung von Events
Hi zusammen
Hintergrund ist: Ich habe mehrere Frames, die miteinander über Events kommunizieren:
Ausgehend von dieser Annahme war ich der Meinung, dass verschiedene, auch vedeckte(weil auf verschiedenen Tabsheets), SyneditFrames auf diesen Event aus dem Toolboxframe reagieren würden. Das wäre sehr problematisch gewesen. Zum Glück haben mich ![]() Soweit, so gut, es funktioniert so, wie ich will - oder eben doch nicht ganz so gut, da ich im Moment nicht wirklich nachvollziehen kann, weshalb dies so ist.Hier mal einige meiner beteiligten Events:
Delphi-Quellcode:
Obiger Event könnte ein simpler TNotifyevent sein, zur Kontrolle wollte ich aber einen Parameter mitgeben, der mir die Quelle im Synedit ausgibt, da ich in Eventprogrammmierung noch nicht wirklich sattelfest bin..
procedure TToolBoxWebFrame.TLB_CopyClick(Sender: TObject);
var Event: String; begin if Assigned(FCopyOnClipBoard) then begin //procedure DoCopyOnClipBoard(Event: String); Event := 'TLB_CopyClick'; FCopyOnClipBoard(Event); TLB_Einfuegen.Enabled := True; TLB_Ausschneiden.Enabled := True; TLB_Copy.Enabled:= False; end; end; Der Eventhandler im Syneditframe:
Delphi-Quellcode:
Ausserdem:
procedure THTMLFrame.DoCopyOnClipBoard(const Event: String);
begin if SynEdit1.SelText.Length > 0 then begin SynEdit1.CopyToClipboard; end; SynEdit1.Lines.Add(Event); end;
Delphi-Quellcode:
und der Eventhandler:
procedure THTMLFrame.SynEdit1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if Synedit1.SelText <> '' then begin if assigned(FOnSelectText) then FOnSelectText(Self); end; end;
Delphi-Quellcode:
Und natürlich, um es nicht zu vergessen:
procedure TToolBoxWebFrame.DoOnSelectText(Sender: TObject);
begin Self.TLB_Copy.Enabled := True; Self.TLB_Ausschneiden.Enabled := True; end;
Delphi-Quellcode:
Im Moment nachvollziehbar ist: das Frame auf dem ActiveTabsheet ist wegen seines Parenmts Enabled und kann deshalb das Event empfangen; die Edits auf den andern Tabsheets sind nicht enabled und deren Eventhandler desshalb nicht assigned. Soweit so gut?
{***************************************************************************}
procedure TDelborWebServerMain.FormCreate(Sender: TObject); var Event: String; begin SideBarWebFrame1.FileTreeFrame1.OnFileFound := DoOnFileFound; ToolBoxWebFrame1.OnPCtrlActivePage := DoOnPCtrlActivePage; SideBarWebFrame1.FileTreeFrame1.OnPathlist := DoOnPathList; ManageEvents; end; procedure TDelborWebServerMain.ManageEvents; begin ToolBoxWebFrame1.OnCutOnClipBoard := SynEditFrame1.DoCutOnClipBoard; ToolBoxWebFrame1.OnCopyOnClipBoard := SynEditFrame1.DoCopyOnClipBoard; ToolBoxWebFrame1.OnPasteFromClipBoard := SynEditFrame1.DoPasteFromClipBoard; ToolBoxWebFrame1.OnOnSafe := SynEditFrame1.DoOnSafeSynedit; ToolBoxWebFrame1.OnOnOpen := SynEditFrame1.DoOnOpenSynedit; ToolBoxWebFrame1.OnOnNew := SynEditFrame1.DoOnNewSynedit; SynEditFrame1.OnSelectText := ToolBoxWebFrame1.DoOnSelectText; end; Nun kommt aber die Sache mit der Liste aus dem verlinkten Thread ins Spiel: Zitat:
Hier die Eventtypen, die in meinem ToolbarFrame definiert sind (wie schon gesagt: alle könnten auch TNotifyEvent sein):
Delphi-Quellcode:
Wenn ich das mit der Liste richtig verstanden habe, müsste eine solche nun für jeden Typen, der von mehreren Zielen/Eventhandlern empfangen werden soll, eine solche Liste anlegen.
type
TCutOnClipBoard = procedure(const Event: string)of object; TCopyOnClipBoard = procedure(const Event: string) of object; TPasteFromClipBoard = procedure(const Event: string) of object; TOnSafe = procedure(const Event: string) of object; TOnOpen = procedure(const Event: string) of object; TOnNew = procedure(const Event: string) of object; Und da ist nun mein gordischer Knoten: In der Liste sind die Eventtypen mehrfach aufgelistet, aber diese Typen kennen ja ihr Ziel nicht?? Oder hab ich jetzt die Antwort gefunden: ein abgefeuertes Event kann genau von einem Eventhandler behandelt werden und muss deshalb per Liste mehrmals abgefeuert werden? Gruss Delbor |
AW: Mehrfachbehandlung von Events
Ja, genau. Das nennt sich Multicastevent. Ich habe dafür eine von TList<T> abgeleitete generische Klasse gebaut, die die registrierten Eventhandler dann alle auslöst.
Ich schreibe auf der Autobahn im Auto, ein Beispiel folgt bei Bedarf später... |
AW: Mehrfachbehandlung von Events
Als Fahrer? :shock:
Aber im Notfall gibt es hier und da auch schon mehrere Beispiele zum finden. (bin mir fast sicher, daß es das schon mehrmals in der DP gibt, wenn man nach dem Begriff sucht) @Captnemo: Er fährt bestimmt ein Googleselbstfahrauto. :zwinker: |
AW: Mehrfachbehandlung von Events
Zitat:
|
AW: Mehrfachbehandlung von Events
|
AW: Mehrfachbehandlung von Events
Zitat:
Derjenige, der etwas (ein Event) mitzuteilen hat, meldet sich und den Eventtyp beim Controller an. Diejenigen, die benachrichtigt werden wollen, melden sich und den Eventtyp, über den sie benachrichtigt werden wollen, ebenfalls dort an. So hast Du eine lose Bindung und eine einzige Klasse, die alle Events verwaltet. |
AW: Mehrfachbehandlung von Events
Zitat:
Ich habe einfach das nicht als Eventcontroller implementiert, sondern lieber die Liste entsprechend. Sprich:
Delphi-Quellcode:
public
property OnTest: TMulticastEvent<T> read FOnTest; ... Example.OnTest.Add(procedure(const ATest: string) begin ... end); |
AW: Mehrfachbehandlung von Events
Zitat:
Das klingt mir aber sehr nach einem Singleton - ne tolle lose Binding :shock: Und ![]() |
AW: Mehrfachbehandlung von Events
Wie kommst Du auf Singleton? :gruebel:
|
AW: Mehrfachbehandlung von Events
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz