Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - wie vererbt/editiert man events richtig?


BeniSchindler - Mo 23.06.03 22:05
Titel: wie vererbt/editiert man events richtig?
Also ich habe ein TSQLQuery-Objekt. Dieses Objekt hat das Event "AfterScroll". Ich Leite nun mein eigenes Objekt von TSQLQuery ab und möchte das dieses Objekt immer bei AfterScroll eine bestimmte Sache ausführt. Wie mache ich das richtig ohne Das Event zu sperren.

Bis jetzt habe ich das ganze so realisiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type TMeineKlasse = class(TSQLQuery)
  constructor create(owner:Tcomponente); override;
  procedure MeinOnScrollEvent(sender:TDataSet);
end;

constructor TMeineKlasse;
begin
  AfterScroll := MeinOnScrollEvent(nil);
end;

procedure TMeineKlasse.MeinOnScrollEvent(sender:TDataSet);
begin
  // meine Aktionen.
end;


Diese Variante funktioniert jedoch nur solange bis jemand das AfterScroll Event benutzt um auch etwas zu machen. Dann wird meine Prozedure nicht mehr ausgeführt. Wie lautet der Code damit eine Instanz meiner Klasse auch noch das Event AfterScroll verwenden kann?

Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt (Bitte Signatur ändern, s. Richtlinien!)


maximus - Di 24.06.03 11:43

:roll: hmm... muss das nicht so aussehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type TMeineKlasse = class(TSQLQuery) 
  constructor create(owner:Tcomponente); override
  procedure MeinOnScrollEvent(sender:TDataSet); 
end

constructor TMeineKlasse.create(...); 
begin 
  OnAfterScroll := MeinOnScrollEvent; // <-- geändert
end

procedure TMeineKlasse.MeinOnScrollEvent(sender:TDataSet); 
begin 
  // meine Aktionen. 
end;


PS: erstell doch noch ein event, das du dann in 'MeinOnScrollEvent' aufrufst. Oder leite das objekt von einer ...custom klasse ab, dann kannst du die sichtbarkeit noch beeinflussen, sodass man nach aussen nur das neue event sieht :wink:


BeniSchindler - Di 24.06.03 12:30

Danke, aber das was du unter dem Delphicode geschrieben hast, war genau das was ich nicht weiss wie es geht. Ich habe jetzt jedoch eine andere Variante gefunden die funktioniert. Aber nochmal danke fürs drüber nachdenken.

Ich habe das ganze jetzt so gelöst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type TMeineKlasse = class(TSQLQuery)  
  procedure DataEvent(Event : TDataEvent; info : longint); override;  
end;

procedure TMeineKlasse.DataEvent(Event : TDataEvent; info : longint); override;  
begin
  inherited;
  if Event = deDataSetScroll then begin
    //hier steht der Code der Nach einem Scroll abgehandelt werden soll.
  end;
end;


maximus - Di 24.06.03 13:10

Noch besser :D Hätte ich dir auch vorgeschlagen, wusste aber nicht ob es da eine virtuelle-proc zum überschreiben gibt.


Tino - Di 24.06.03 14:02

Hallo,

ein Event kann man nicht überschreiben da es ja nur eine Eigenschaft eines Objekts ist. Eine Methode dagegen kann man (wenn diese entsprechend definiert ist) überschreiben.

In den meisten Fällen existiert aber neben dem Event auch eine entsprechende Methode die man ableiten kann um ebenfalls auf das Ereignis zu reagieren.

Gruß
Tino


maximus - Di 24.06.03 14:32

schön gesagt :roll: