Auf Event der Parent-Klasse reagieren (override)

Rund um die LCL und andere Komponenten
Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Auf Event der Parent-Klasse reagieren (override)

Beitrag von MitjaStachowiak »

Hallo,
ich habe gerade eine Komponente fertig, die von TForm abgeleitet wird.

Code: Alles auswählen

type TMeineKomponente = class(TForm)


Ich möchte jetzt eine Methode haben, die auf das Schließen des Fenster reagiert. Kein Problem mit OnClose - außer wenn jetzt von außerhalb jemand ebenfalls OnClose verwendet, also

Code: Alles auswählen

MeineKomponente.OnClose := EineMethode;
Dann würde meine interne Methode nichtmehr aufgerufen werden.

Ich kann OnClose nicht overriden - was soll man da am besten machen?

Ich habe in TCustomForm DoClose entdeckt - kann man damit was anfangen?

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Auf Event der Parent-Klasse reagieren (override)

Beitrag von MitjaStachowiak »

DoClose lässt sich auch nicht overriden.

Ist die einzige Möglichkeit, ein separates Close-Event einzuführen, das man in OnClose aufruft und das von Außerhalb unbedingt statt OnClose verwendet werden muss?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Auf Event der Parent-Klasse reagieren (override)

Beitrag von m.fuchs »

Genau, das DoClose kannst du überschreiben und da es als virtual deklariert ist wird es auch aufgerufen.
Mach dann da drin was immer du machen möchtest und vergiss nicht die ursprüngliche Methode mit inherited aufzurufen.

Code: Alles auswählen

type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  protected
    procedure DoClose(var CloseAction: TCloseAction); override;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  Application.MessageBox('OnClose des Forms.', 'X', 0);
end;
 
procedure TForm1.DoClose(var CloseAction: TCloseAction);
begin
  Application.MessageBox('Mein DoClose', 'X', 0);
  inherited DoClose(CloseAction);
end;
 
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Auf Event der Parent-Klasse reagieren (override)

Beitrag von m.fuchs »

MitjaStachowiak hat geschrieben:DoClose lässt sich auch nicht overriden.

Hm? Hab ich doch grad gemacht und es läuft.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Auf Event der Parent-Klasse reagieren (override)

Beitrag von MitjaStachowiak »

Ja, jetzt hat es bei mir auch geklappt.

Ich hatte aus Versehen

Code: Alles auswählen

procedure DoClose(var CloseEvent : TCloseEvent); override;

statt

Code: Alles auswählen

procedure DoClose(var CloseAction : TCloseAction); override;

geschrieben.

Die Fehlermeldung dazu heißt dann Unit1.pas(13,15) Error: There is no method in an ancestor class to be overridden: "TForm1.DoClose(var TCloseEvent);"

Wer kommt denn darauf, dass es TCloseAction und TCloseEvent gibt? :shock:

Antworten