Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Event ist nicht sichtbar und wird nie ausgelöst (https://www.delphipraxis.net/31271-event-ist-nicht-sichtbar-und-wird-nie-ausgeloest.html)

Dani 6. Okt 2004 22:54


Event ist nicht sichtbar und wird nie ausgelöst
 
Guten Abend,

eigentlich wollte ich ein zusätzliches Ereignis in einen TForm-Nachfahren einbauen. Das Ereignis sollte nach OnCloseQuery, aber vor OnClose stattfinden, daher "OnBeforeClose". Das Problem: Das Ereignis ist im Objektinspektor nicht sichtbar, und es wird auch nie ausgelöst, wenn man es zur Laufzeit überschreibt. Die Ereignisse sind genau gleich deklariert wie z.B. in der TCustomForm Klasse. Hat jemand eine Ahnung warum es nichtmal im Inspektor angezeigt wird?

Delphi-Quellcode:
type
 TSomeForm = class(TForm)
  private
    FOnBeforeClose: TCloseEvent;
  public
    procedure DoClose(var Action: TCloseAction); override;
  published
    property OnBeforeClose: TCloseEvent read FOnBeforeClose write FOnBeforeClose;
 end;

{...}

procedure TSomeForm.DoClose(var Action: TCloseAction);
begin
 If Assigned(FOnBeforeClose) then FOnBeforeClose(Self, Action);
  inherited;
end;

Dani 7. Okt 2004 15:08

Re: Event ist nicht sichtbar und wird nie ausgelöst
 
Sorry, ich steh immer noch auf dem Schlauch :|

Stevie 7. Okt 2004 15:19

Re: Event ist nicht sichtbar und wird nie ausgelöst
 
Durch deine Frage hast du mich auf die Idee gebracht, ein Tutorial über dieses Thema zu schreiben, guck's dir doch mal an.

Dani 7. Okt 2004 15:34

Re: Event ist nicht sichtbar und wird nie ausgelöst
 
Ahhh danke, das erklärt natürlich warum das Ereignis im Objektinspektor nicht angezeigt wird! Aber wie kommt es, dass es niemals aufgerufen wird?

PS: Wie hast du das in zwei Minuten alles geschafft? *g*

Stevie 7. Okt 2004 15:58

Re: Event ist nicht sichtbar und wird nie ausgelöst
 
Das es nicht aufgerufen wird, hat einen anderen Grund:
Deine überschrieben Methode wird nicht vom Formular aufgerufen, weil sie an dieser Stelle ja nicht weiß, dass in einem Nachfahren diese Prozedur überschrieben wird!
Mein Vorschlag:
Delphi-Quellcode:
type
TSomeForm = class(TForm)
  private
    FOnBeforeClose: TNotifyEvent;
    procedure WMClose(var Message: TMessage); message WM_CLOSE;
  published
    property OnBeforeClose: TNotifyEvent read FOnBeforeClose write FOnBeforeClose;
end;

{...}

procedure TSomeForm.WMClose(var Message: TMessage);
begin
  if Assigned(FOnBeforeClose) then
    FOnBeforeClose(Self);
  inherited;
end;
Wenn du allerdings an dieser Stelle auch die CloseAction haben willst, dann musst du dir das in der Prozedur zusammenpulen.
Btw. Es gibt das Event CloseQuery, das ist quasi das BeforeClose-Event. Dort kannst du das Schließen des Fensters noch verhindern, wenn du das willst.

Dani 7. Okt 2004 16:09

Re: Event ist nicht sichtbar und wird nie ausgelöst
 
Meinst du damit, dass diese überschriebene DoClose Prozedur nicht weitervererbt wird? Sorry, meine Leitung scheint heute wieder Überlänge zu haben :wiejetzt:

Wenn uns die OH nicht anlügt, wäre DoClose eigentlich der richtige Ansatzpunkt (?!):
Zitat:

Die Methode DoClose generiert ein OnClose-Ereignis.

type TCloseAction = (caNone, caHide, caFree, caMinimize);
procedure DoClose(var Action: TCloseAction); dynamic;

Beschreibung

DoClose wird automatisch aufgerufen, wenn das Formular geschlossen wird. Anschließend wird die Ereignisbehandlungsroutine für OnClose aufgerufen, sofern sie definiert wurde.

Überschreiben Sie diese Methode, um das OnClose-Ereignis zu unterdrücken oder klassenspezifische Aktionen beim Schließen des Formulars hinzuzufügen. Geben Sie im Parameter Action an, wie das Formular geschlossen werden soll. Informationen zu den möglichen Werten finden Sie in der Beschreibung des Ereignisses OnClose.

Stevie 7. Okt 2004 16:18

Re: Event ist nicht sichtbar und wird nie ausgelöst
 
Sorry, mein Fehler, sie ist ja dynamic, dann stimmt das nicht, was ich eben von mir gegeben habe. :oops:
Also bei funktioniert das sogar (mit dem DoClose mein ich)!!

P.S. Wie kommst du eigentlich auf 2 Minuten?? :gruebel:

Dani 7. Okt 2004 16:25

Re: Event ist nicht sichtbar und wird nie ausgelöst
 
Es funktioniert? Dann wird es wohl an der Modularisierung liegen... mal schaun... danke für den Hinweis!

PS: Bei den 2 Minuten hab ich mich verguckt :blind:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 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