AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Class Ereignisse vererben

Ein Thema von Hansa · begonnen am 28. Jan 2005 · letzter Beitrag vom 28. Jan 2005
Antwort Antwort
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Class Ereignisse vererben

  Alt 28. Jan 2005, 02:27
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 ?

ich kann // zwischen begin und end; schreiben. Dann geht alles. Aber das kanns wohl nicht sein.
Gruß
Hansa
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Class Ereignisse vererben

  Alt 28. Jan 2005, 08:39
Moin!

Könntest du vielleicht die relevanten Codestellen hier als Auszug posten? Ich habe keine Vorstellung was du meinst...

MfG
Muetze1
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Class Ereignisse vererben

  Alt 28. Jan 2005, 09:07
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;
Andreas
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Class Ereignisse vererben

  Alt 28. Jan 2005, 11:59
Wozu denn so kompliziert ?

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 ?

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 !!
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Class Ereignisse vererben

  Alt 28. Jan 2005, 12:38
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Class Ereignisse vererben

  Alt 28. Jan 2005, 13:24
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz