Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Class Ereignisse vererben (https://www.delphipraxis.net/39068-class-ereignisse-vererben.html)

Hansa 28. Jan 2005 02:27


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.

Muetze1 28. Jan 2005 08:39

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

shmia 28. Jan 2005 09:07

Re: Class Ereignisse vererben
 
Zitat:

Zitat von Hansa
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.

Man kann Events, die einmal Public gemacht wurden in abgeleiteten Klassen nicht mehr unsichtbar machen.
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:
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;
In der abgeleiteten Klasse kannst du DoOnKeyDown überschreiben und so verhindern, dass das Event
ausgelöst wird.
Delphi-Quellcode:
procedure TAbgeleitetClass.DoOnKeyDown(var Key: Word; Shift: TShiftState);
begin
   // einfach nichts tun (und v.a. nicht inherited aufrufen)
end;

Hansa 28. Jan 2005 11:59

Re: Class Ereignisse vererben
 
Wozu denn so kompliziert ?

Zitat:

Zitat von shmia
Delphi-Quellcode:
procedure TAbgeleitetClass.DoOnKeyDown(var Key: Word; Shift: TShiftState);
begin
   // einfach nichts tun (und v.a. nicht inherited aufrufen)
end;

Wozu noch extra ein DoOnKeyDown verwenden ? :shock:

Delphi-Quellcode:
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;
So siehts momentan aus. Und daß der Trick mit dem "leer lassen" geht habe ich schon vorher gesagt. Und zwar einfach so :

Delphi-Quellcode:
procedure TfrmNrEin1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
//  inherited;
end;
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 !!

mirage228 28. Jan 2005 12:38

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

Muetze1 28. Jan 2005 13:24

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