![]() |
Class Ereignisse vererben
Hi,
ich habe eine Klasse, die wird weitervererbt (mehrfach). Nun ist in einer stark abgeleiteten Klasse das OnKeyDown-Ereignis ganz anders, als bei den Vorfahren. Es geht nur darum, dieses eine Ereignis auszuschalten. Alles ist als virtual deklariert. Erzeuge ich ein neues OnKeyDown, so wird es von Delphi automatisch entfernt, weil es eben leer ist. Es soll gerade nicht das machen, was im Vorgänger eingeführt wurde. Alle anderen Ereignissse sollen dabei aber erhalten bleiben. Override bringt dasselbe Ergebnis. Prozedur aus Form entfernt, wodurch dann wieder das vom Vorgänger zuschlägt. Was muß ich da noch machen ? :gruebel: ich kann // zwischen begin und end; schreiben. Dann geht alles. Aber das kanns wohl nicht sein. |
Re: Class Ereignisse vererben
Moin!
Könntest du vielleicht die relevanten Codestellen hier als Auszug posten? Ich habe keine Vorstellung was du meinst... MfG Muetze1 |
Re: Class Ereignisse vererben
Zitat:
Du kannst aber in der abgeleiteten Klasse verhindern, dass das Event ausgelöst wird. Dazu muss in der Basisklasse eine virtuelle Funktion existieren, über die das Event ausgelöst wird:
Delphi-Quellcode:
In der abgeleiteten Klasse kannst du DoOnKeyDown überschreiben und so verhindern, dass das Event
TBaseClass = class(TPersistent)
private FOnKeyDown : TKeyEvent; protected procedure DoOnKeyDown(var Key: Word; Shift: TShiftState);virtual; end; procedure TBaseClass.DoOnKeyDown(var Key: Word; Shift: TShiftState); begin if assigned(FOnKeyDown) then FOnKeyDown(self, Key, Shift); end; ausgelöst wird.
Delphi-Quellcode:
procedure TAbgeleitetClass.DoOnKeyDown(var Key: Word; Shift: TShiftState);
begin // einfach nichts tun (und v.a. nicht inherited aufrufen) end; |
Re: Class Ereignisse vererben
Wozu denn so kompliziert ?
Zitat:
Delphi-Quellcode:
So siehts momentan aus. Und daß der Trick mit dem "leer lassen" geht habe ich schon vorher gesagt. Und zwar einfach so :
TfrmNrEin = class(TForm)
... procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); // enthält Code ... private ... end; // noch einige Ableitungen mehr, bevor die relevante Class kommt : TfrmNrEin1 = class(TfrmNrEin) ... procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); // soll nichts machen ... end;
Delphi-Quellcode:
Mich stört nur, daß Delphi automatisch das OnKeyDown weg macht, sofern auch der Kommentar weg ist. Wenn jetzt jemand denkt, der leere Kommentar könne genauso gut gleich gelöscht werden, dann läuft das Programm nicht mehr und zwar, ohne daß irgendwo eine Fehlermeldung kommt ! Dann schlägt nämlich das Vorfahr-OnKeyDown ohne Vorwarnung zu !!
procedure TfrmNrEin1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin // inherited; end; |
Re: Class Ereignisse vererben
Hi Hansa,
Delphi entfernt automatisch alle leeren published-Methoden. Das ist z.B. auch so, wenn Du in Deinem Projekt eine unbenutzte (und leere) OnClick Methode hast und das Projekt compilierst -> Die Methode wird entfernt. Also musst Du in dem Fall einen Kommentar o.Ä. dazwischenschalten. mfG mirage228 |
Re: Class Ereignisse vererben
Moin!
Was willst du (Hansa) überhaupt erreichen? - Inherited in deinem Code - auch wenn Kommentar - ist eh nonsense - eine Ereignismethode zu zuweisen bei einer Form die man selber ableitet ist irgendwie unsinnig - dazu sollte man doch eher die DoKeyDown z.B. nutzen. Schliesslich kannst du nicht in TfrmNrEin und in TfrmNrEin1 gleichzeitig bei ein und dem selben Ereignis eine Methode zuweisen. Dies wird schliesslich mit vererbt, daher ist dabei der einzige vernünftige Weg DoXXX... (die überschrieben werden müssen) - Was willst du erreichen? Wenn der Code in TfrmNrEin nicht mehr ausgeführt werden soll, dann lass den inherited Aufruf weg - was aber wahrscheinlich noch andere Dinge entfernt die du vielleicht brauchst... MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 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