AGB  ·  Datenschutz  ·  Impressum  







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

Eigene Komponente mit OnClose-Event

Ein Thema von Jasocul · begonnen am 1. Jun 2015 · letzter Beitrag vom 1. Jun 2015
Antwort Antwort
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#1

Eigene Komponente mit OnClose-Event

  Alt 1. Jun 2015, 09:18
Ich stehe gerade auf dem Schlauch oder habe ein Brett vor dem Kopf. ganz wie ihr wollt.
Ich habe eine Komponente programmiert, die jetzt ein OnCreate- und ein OnDestroy-Ereignis bekommen soll.

Die Komponente ist abgeleitet von TComponent.
Das OnCreate funktioniert inzwischen, nachdem ich den üblichen Standard-Source in die protected Methode Loaded eingebaut (AfterConstruction war zu früh) habe:
Delphi-Quellcode:
procedure TMyComp.Loaded;
begin
  inherited;

  if Assigned(FOnCreate) then
  begin
    FOnCreate(self);
  end;
Aber OnDestroy bereitet mir noch Probleme.
BeforeDestruction ist zu spät.
Mache ich es mit Message-Handling, ist die Applikation offensichtlich schon nicht mehr verfügbar. Zumindest habe ich keinen Zugriff mehr. Ein einfaches ShowMessage wird schon nicht mehr angezeigt, obwohl fehlerfrei durch den Source gelaufen wird (Debugger).

Google spuckt auch nichts Brauchbares aus (oder ich stelle die falsche Frage).

Weiß jemand, wie es richtig geht und kann mir das verraten?
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Eigene Komponente mit OnClose-Event

  Alt 1. Jun 2015, 11:39
Ich habe es jetzt erstmal im BeforeDestruction eingebaut.
Damit sollte die Komponente zumindest die zur Zeit geplanten Routinen im OnDestroy abarbeiten können. Anwender-Benachrichtigungen mit ShowMessage gehen so allerdings leider nicht.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.313 Beiträge
 
Delphi 12 Athens
 
#3

AW: Eigene Komponente mit OnClose-Event

  Alt 1. Jun 2015, 12:12
Bei einer Komponente ist BeforeDestruction das Früheste, was es gibt.
Ausnahme, wenn z.B. in der Form ein Code eingebaut wurde, welcher die Komponente rechtzeitig informiert. (leider gibt es kein TComponent.BeforeClose, zu dem TComponent.Loaded und TObject.BeforeDestruction)

Bei Forms gibt es noch OnCloseQuery und OnClose, aber das wird natürlich nicht aufgerufen, wenn im Programm Form.Free azfgerufen wird, sondern nur beim Form.Close.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Eigene Komponente mit OnClose-Event

  Alt 1. Jun 2015, 12:17
Danke himitsu.
Dann bin ich also doch nicht zu blöd, etwas entsprechendes zu finden.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Eigene Komponente mit OnClose-Event

  Alt 1. Jun 2015, 12:24
Man kann durchaus in so einem OnDestroy Event mit ShowMessage arbeiten ... wenn man etwas beachtet:
Delphi-Quellcode:
procedure TFooForm.MyComponentDestroy( Sender: TObject );
begin
  if not csDestroying in Application.ComponentState then
    ShowMessage( 'Bin dann mal weg!' );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Eigene Komponente mit OnClose-Event

  Alt 1. Jun 2015, 12:45
Nette Idee, funktioniert aber nicht. Ich habe es vorsichtshalber auch nochmal getestet. ShowMessage wird auf keinen Fall ausgeführt.

Eigentlich ist das Verhalten auch korrekt. Wenn die Form zerstört wird, bekommen alle Komponenten, deren Owner die Form ist, die Nachricht, sich zu zerstören. Wenn eine Komponente jetzt im eigenen Destroy einen Event-Handler bekommt, kann es zu merkwürdigen Nebeneffekten kommen. Allein der Zugriff auf andere Komponenten, die auf der Form liegen, kann zu unkontrollierbaren Zugriffsverletzungen führen. Klar kann man die Erstellungsfolge beeinflussen, aber eine Komponente sollte schon richtig gekapselt sein.
Dieses Problem kann mich natürlich auch im BeforeDestruction treffen, aber es handelt sich um eine firmeninterne Komponente, die dann entsprechend dokumentiert ist.

Das, was die Komponente in dem Ereignis machen soll, funktioniert problemlos. Nur eine Rückmeldung an den Anwender müssen wir gegebenenfalls anders lösen. Normalerweise ist die Rückmeldung aber nicht erforderlich.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.313 Beiträge
 
Delphi 12 Athens
 
#7

AW: Eigene Komponente mit OnClose-Event

  Alt 1. Jun 2015, 12:51
Zitat:
kann es zu merkwürdigen Nebeneffekten kommen.
Darum muß der auch im BeforeDestruction aufgerufen werden, denn die Form sendet erst an alle Komponenten das BeforeDestruction und danach nacheinander Free/Destroy aufgerufen.
Ein Therapeut entspricht 1024 Gigapeut.
  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 22:32 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 by Thomas Breitkreuz