![]() |
PopupMenu dynamisch EventHandler zuweisen - Observer pattern?
So, neues Problem :-D
Ich möchte das PopupMenu einer Komponente beim öffnen des Popups um einige Menupunkte erweitern. Dies soll unabhängig davon geschehen wie das PopUpMenu geöffnet wurde. Nun bietet das Vcl PopupMenu ein OnOpen Event. Das wäre ja eigentlich genau das Richtige. Leider gibt es Fälle, in denen ein einfache Zuweisung einer Ereignisbehandlung fehlschlägt.
Delphi-Quellcode:
Zack, schon ist die Ereignisbehandlung weg.
//In der Komponentendefinition
constructor TMyComp.Create; begin [...] PopupMenu.OnOpen := myOnOpenProc; end; [...] //irgendwo in einer Unit, die TMyComp verwendet procedure Form1.Init; begin FMyComp := TMyComp.Create; FMyComp.PopupMenu := anotherPopup; Von anderer Stelle habe ich den Tip erhalten, hier was mit nem Observer Pattern zu machen. Die Frage ist, wer soll hier was observieren? Was ich hier im wesentlichen erreichen möchte, ist jedem Popup-Menü, welches der PopupMenu Variable von MyComp gerade zugeteilt ist, die eine gleiche Ereignisbehandlung fürs OnPopup zuzuweisen. Eine Idee wäre es, den Setter der PopupMenu property zu überschreiben (mein Delphi-Lieblingsthema...). Das ist bisher allerdings daran gescheitert, dass ich es nicht schaffe, den originalen Setter im override-Setter aufzurufen. |
AW: PopupMenu dynamisch EventHandler zuweisen - Observer pattern?
Du könntest bei der Zuweisung einer Methode für die Ereignisbehandlung diese Methode Dir merken und zusätzlich zur eigentlichen (also Deiner eigenen) Methode ausführen...
Sherlock |
AW: PopupMenu dynamisch EventHandler zuweisen - Observer pattern?
Ich verstehe dein Problem noch nicht.
Zitat:
Willst du dir das alte OnPopUp merken und dann wieder zurücksetzen wenn du ein Neues zugewiesen bekommst? Oder soll dein Neues und das Alte aufgerufen werden? |
AW: PopupMenu dynamisch EventHandler zuweisen - Observer pattern?
So, wie ich es verstand:
Er will an das registrierte Popup der Komponente etwas anhängen (ihm ist egal was das für ein Popup ist) und wenn später irgenwo im Code ein anderes Popup der Komponente zugewiesen wird, soll das dann halt an diesem anderen Popup dranhängen (seine zusätzlichen MenuItems). |
AW: PopupMenu dynamisch EventHandler zuweisen - Observer pattern?
Vielleicht so?
Delphi-Quellcode:
type
TMyComp = class(TControl) private function GetPopupMenu: TPopupMenu; procedure myOnPopupMethod(Sender: TObject); procedure SetPopupMenu(const Value: TPopupMenu); protected procedure Loaded; override; published property PopupMenu: TPopupMenu read GetPopupMenu write SetPopupMenu; end; procedure TMyComp.Loaded; begin inherited; if PopupMenu <> nil then begin PopupMenu.OnPopup := myOnPopupMethod; end; end; procedure TMyComp.myOnPopupMethod(Sender: TObject); begin // ... end; function TMyComp.GetPopupMenu: TPopupMenu; begin Result := inherited PopupMenu; end; procedure TMyComp.SetPopupMenu(const Value: TPopupMenu); begin inherited PopupMenu := Value; if PopupMenu <> nil then begin PopupMenu.OnPopup := myOnPopupMethod; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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-2025 by Thomas Breitkreuz