![]() |
Komponente ableiten: Ereignisse überschreiben
Hi,
bin gerade dabei, mir eine Komponente ableiten. Dabei möchte ich, dass bestimmte Ereignisse (z. B. OnMouseMove) im OI nicht verfügbar sein sollen, da ich sie bereits in der abgeleiteten Komponente für etwas anderes nutze (habe also diesem Ereinis schon etwas zugeordnet). Eine andere Möglichkeit wäre natürlich, bei OnMouseMove würden beide Ereignisse ausgeführt werden: Das was ich in der abgeleiteten Komponente habe und das was der User im OI hinzufügt. Dieses wäre natürlich eine bessere Lösung! Ist eines von beiden (oder beides?) irgendwie möglich? |
Re: Komponente ableiten: Ereignis löschen ???
du kannst die WIndowsmessage (WM_MOUSE oder so) selbst abfangen und dann zuerst dein eigenes event starten udn dann fOnMouseMove auslösen.
Du kannst natürlich auch nur in der Nachrichtenbehandlung deine Sache machen und dann die message einfach weiterleiten. Ich würde da wahrscheinlcih sogar die komplette Nachrichtenschleife "verschieben" und in meiner eigenen die nachrichten abfangen/weiterleiten, wenn du verstehst was ich meine. |
Re: Komponente ableiten: Ereignis löschen ???
Du musst die Methode MouseMove überschreiben. Sie hat folgende Deklaration:
Delphi-Quellcode:
Du kannst innerhalb von MouseMove zuerst dein eigenes Zeug ausführen und dann rufst du
procedure MouseMove(Shift: TShiftState; X, Y: Integer); dynamic;
den ursprünglichen Code auf:
Delphi-Quellcode:
inherited MouseMove(Shift, X, Y);
end; |
Re: Komponente ableiten: Ereignis löschen ???
warum einfach, wenns auch kompliziert geht... :oops:
|
Re: Komponente ableiten: Ereignis löschen ???
Zitat:
|
Re: Komponente ableiten: Ereignis löschen ???
Danke erstmal für den Code, sieht echt einfach aus :thumb:
Aberm muss ich dann nicht noch das Ereignis zuweisen?
Delphi-Quellcode:
OnMouseMove := MouseMove;
|
Re: Komponente ableiten: Ereignis löschen ???
Zitat:
Delphi-Quellcode:
Durch Überschreiben von MouseMove wird dein MouseMove aufgerufen.
procedure TControl.MouseMove(Shift: TShiftState; X, Y: Integer);
begin // Wenn Event OnMouseMove gesetzt, dann wird der Eventhandler aufgerufen if Assigned(FOnMouseMove) then FOnMouseMove(Self, Shift, X, Y); end; Du kannst also schön dein Ding ausführen und dann die Kontrolle über inherited wieder auf den Standardweg abgeben. |
Re: Komponente ableiten: Ereignis löschen ???
Okay, danke!
Dann werd ich's mal testen... |
Re: Komponente ableiten: Ereignis löschen ???
Als ich den Source noch nicht hatte hab ich sowas wie folgt gemacht:
Delphi-Quellcode:
Die Lösung mit dem Überschreiben ist zwar besser (vor allem wenn auf Vorgängerobjecte gecastet wird etc.) aber wenn es keine Methode zum Überschreiben gibt bzw. man diese nicht kennt ist dies eine annehmbare Lösung.
TMeinKlasse = class(TUrsprungsklasse)
private fOnMouseMove: TMouseMoveEvent; procedure FOnMouseMoveProc(Sender: TObject; Shift: TShiftState; X, Y: Integer); public constructor Create(AOwner: TComponent); override; published property OnMouseMove: TMouseMoveEvent read fOnMouseMove write fOnMouseMove; end; [...] constructor TMeinKlasse.Create(AOwner: TComponent); begin inherited Create(AOwner); inherited OnMouseMove := FOnMouseMoveProc; end; procedure TMeinKlasse.FOnMouseMoveProc(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin //Mein Zeugs if Assigned(fOnMouseMove) then fOnMouseMove(Sender, Shift, X, Y); end; |
Re: Komponente ableiten: Ereignis löschen ???
Hmm... irgendwie krieg ich's nich hin. :(
Wo muss ich denn die Prozedur
Delphi-Quellcode:
deklarieren? (nach dem Schema von Beitrag #3 !!!)
procedure MouseMove(Shift: TShiftState; X, Y: Integer); dynamic;
Zur Zeit steht sie im public Teil, aber sie wird einfach nicht ausgeführt :? Übrigens: Seit dem ich daran rumbastle kann ich Delphi nicht mehr neu starten, nur noch mit dem gerade geöffneten Delphi arbeiten. Wenn ich Delphi starten will, kommt diese Fehlermeldung: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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