![]() |
In das Event einer Komponente einhacken.
Hier ein kleines Beispiel: ich möchte meiner Klasse eine Komponente zuweisen und mit ihr arbeiten. Es soll eine Klasse bleiben, keine neue Komponente. Nun kam ich auf die Idee, dass ich noch mehr machen könnte und auch auf Ereignisse der Komponente reagieren könnte. Hier das Ergebnis meiner vorläufigen Überlegung in einer Beispielklasse:
Delphi-Quellcode:
Zuerst das Positive: es funktioniert (zumindest zum Teil), es gefällt mir aber nicht. Das sieht mir zu sehr gebastelt aus. Außerdem, wenn einer Panel1 zwischendurch von Hand den OnClick neu zuweist, ist die ganze Anpassung in der Klasse Geschichte. Letztendlich funktioniert das ganze nur, ist aber keine wirkliche Lösung.
type
TIrgendwas = class private FPanel: TPanel; FPanelOnClick: TNotifyEvent; procedure PanelClick(Sender: TObject); public constructor Create(APanel: TPanel); destructor Destroy; override; end; procedure TIrgendwas.PanelClick(Sender: TObject); begin //Beispiel für irgendeine Aktion FPanel.Color := RGB(Random(256), Random(256), Random(256)); //Hier den Klick an Panel weitergeben FPanel.OnClick := FPanelOnClick; //Zuerst alten Zustand herstellen, sonst Schleife FPanel.OnClick(Sender); //Originalereignis ausführen FPanel.OnClick := PanelClick; //Wieder auf eigene Prozedur umleiten end; constructor TIrgendwas.Create(APanel: TPanel); begin FPanel := APanel; FPanelOnClick := FPanel.OnClick; //Alten Zustand merken FPanel.OnClick := PanelClick; //Auf eigene Prozedur umleiten end; destructor TIrgendwas.Destroy; begin FPanel.OnClick := FPanelOnClick; end; var Irgendwas: TIrgendwas; procedure TForm1.FormCreate(Sender: TObject); begin Irgendwas := TIrgendwas.Create(Panel1); end; procedure TForm1.FormDestroy(Sender: TObject); begin Irgendwas.Free; end; procedure TForm1.Panel1Click(Sender: TObject); begin ShowMessage('Und weiter mit PanelClick.'); end; Gibt es eine elegantere Methode sich in ein Ereignis einzuklinken? Ich will das Ereignis nicht übernehmen, ich will mich nur einhacken. Am besten bevor die eigentliche Prozedur ausgeführt wird, damit ich einige Manipulationen ausführen kann. |
AW: In das Event einer Komponente einhacken.
Du könntest ggf. ein TMyPanel ableiten und Click überschreiben.
Etwa so:
Delphi-Quellcode:
Du müsstest dann natürlich eine TMyPanel-Instanz zuweisen.
procedure TMyPanel.Click;
begin TuEtwasPrivates; if Assigned(OnClick) then OnClick(Self); end; |
AW: In das Event einer Komponente einhacken.
Zitat:
Delphi-Quellcode:
aufrufen.
if Assigned(FPanelOnClick) then
FPanelOnClick(Sender) |
AW: In das Event einer Komponente einhacken.
Ok, beides sieht schon mal eleganter aus. Man könnte damit sogar schon leben.
Bleibt aber das Problem, dass eine manuelle Umstellung der OnClick Prozedur im Code, das Ganze unwirksam macht. |
AW: In das Event einer Komponente einhacken.
Zitat:
Was vermutlich auch noch ginge: Die virtuelle Click Methode von TPanel in der V-Table auf eine eigene Funktion umlenken. Ist aber ziemlich hacky. |
AW: In das Event einer Komponente einhacken.
Du kannst auch eine
![]()
Delphi-Quellcode:
unit uMyPanel;
interface uses System.SysUtils, System.Classes, Vcl.ExtCtrls; type TPanel = class(Vcl.ExtCtrls.TPanel) private FOnBeforeClick: TNotifyEvent; protected procedure BeforeClick; virtual; procedure Click; override; public property OnBeforeClick: TNotifyEvent read FOnBeforeClick write FOnBeforeClick; end; implementation procedure TPanel.BeforeClick; begin if Assigned(FOnBeforeClick) then FOnBeforeClick(Self) end; procedure TPanel.Click; begin BeforeClick; inherited; end; end. |
AW: In das Event einer Komponente einhacken.
Du kannst Dich auch in die MessageQueue der ParentForm einklinken und dann mit Hilfe des Handles des Panels, welches ja Deiner Klasse bekannt ist, auswerten, ob dieses angeklickt wurde.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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