AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi eigenartiges Verhalten bei Onclose eines Formulars

eigenartiges Verhalten bei Onclose eines Formulars

Ein Thema von SusiT · begonnen am 11. Okt 2023 · letzter Beitrag vom 13. Okt 2023
Antwort Antwort
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.680 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 07:55
Erstens: Man ruft nicht Destroy auf, sondern Free. Und bei Forms besser Release.
Release ist dazu gedacht, um aus einem Event des Formulars aufgerufen zu werden, so dass es erst freigegeben wird, wenn der Event beendet wurde. In allen anderen Situationen sollte man Free aufrufen.


Wie viel wollen wir wetten, dass du irgendwo ein Application.ProcessMessages, Application.HandleMessage, ShowMessage oder Dergleichen aufrufst, welches Messages mitten der Behandlung ausführt, anstatt erst anschließend?
Vermutlich korrekt.
Thomas Mueller
  Mit Zitat antworten Zitat
SusiT

Registriert seit: 15. Mai 2014
40 Beiträge
 
#2

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 08:16
Die Form ist nicht mit ShowModal geöffnet sondern nur mit Show.

Beim schließen der Form wird das onClose Event getriggert -> FormClose

in FormClose wird eine callback funktion des parents aufgerufen in welcher

form.Release;
form := nil;

gesetzt wird.

Bei Release wird das onDestroy Event getriggert und führt im Formular das geschlossen wird, die Prozedur FormDestroy auf.


So ist im Moment der Ablauf bei mir.

Danke für dein Wettangebot, allerdings muss ich passen. Ich habe jetzt schon das Gefühl, dass ich diese Wette verlieren würde

Ich prüfe dies mal.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
903 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 08:53
Release ist doch dafür da, dass ein Form "geordnet" freigegeben werden kann, auch in eigenen Event-Handlern. Dann direkt auch die Formvariable zu nilen ist glaube ich keine besonders gute Idee. Das kann gut gehen, muss aber nicht.

Lass das mal weg, und merke dir anderweitig, ob das Formular ggf. später neu erzeugt werden muss oder nicht (also nicht per Test auf =Nil).
Being smart will count for nothing if you don't make the world better. You have to use your smarts to count for something, to serve life, not death.
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
404 Beiträge
 
#4

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 09:08
Die Form ist nicht mit ShowModal geöffnet sondern nur mit Show.

Beim schließen der Form wird das onClose Event getriggert -> FormClose

in FormClose wird eine callback funktion des parents aufgerufen in welcher

form.Release;
form := nil;

gesetzt wird.

Bei Release wird das onDestroy Event getriggert und führt im Formular das geschlossen wird, die Prozedur FormDestroy auf.


So ist im Moment der Ablauf bei mir.
So you are not mentioning what the form has for "Action: TCloseAction" in FormClose, yet you releasing it from the MainForm !!

I suggest to use one method to close/release a form, not both at the same time, one method will do the job right, two will burn the meal for sure.
Kas
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
730 Beiträge
 
Delphi 12 Athens
 
#5

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 10:36
Die Form ist nicht mit ShowModal geöffnet sondern nur mit Show.

Beim schließen der Form wird das onClose Event getriggert -> FormClose

in FormClose wird eine callback funktion des parents aufgerufen in welcher

form.Release;
form := nil;

gesetzt wird.
Warum so kompliziert? Bei nicht modalen Forms brauchst du überhaupt kein destroy, free oder release.
Einfach nur:
Delphi-Quellcode:
procedure TMyForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;
Falls du die Formvariable noch brauchst, um zu überprüfen, ob die Form existiert, kannst du sie hier auch auf nil setzen.
  Mit Zitat antworten Zitat
SusiT

Registriert seit: 15. Mai 2014
40 Beiträge
 
#6

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 20:22
Natürlich hattet Ihr Recht und ich wäre der Verlierer bei der Wette gewesen


Ich habe es nun tatsächlich so simple wie möglich aufgebaut.

In FormClose:

Action := caFree;
FormVariable := nil;

und zusätzlich werden in FormClose alle Variablen und Speicherobjekte wieder freigegeben.


Besten Dank und vielen Dank für die rege Teilnahme beim großzügigen Verteilen von freiem Wissen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 20:56
FormClose?

Man gibt etwas an der Gegenstelle dessen frei, wo es erstellt wurde.

In OnClose also das, was im OnShow erstellt wurde. Hast du es wirklich dort erstellt?

PS: OnCreate->OnDestroy oder Create->Destroy aka Constructor->Destructor usw.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
SusiT

Registriert seit: 15. Mai 2014
40 Beiträge
 
#8

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 21:20
Diese Konvention hatte ich bis dato noch nicht verinnerlicht.
Macht aber auch Sinn und werde das optimieren.

Dann muss die globale Formvariable aber auch später auf nil gesetzt werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 21:56
Stell dir einfach mal zwei Fälle vor
* die Form erstellen und zwei Mal anzeigen (Show+HideClose oder ShowModal)
* die Form erstellen und garnicht anzeigen, sondern direkt wieder freigeben

1a. Beim zweiten Mal knallt's, weil die Form weg ist
1b. Beim zweiten Mal knallt's, weil im OnClose freigegeben wurde (natürlich ohne caFree, sondern mit caHide)
2. Es wird nie freigegeben, weil OnClose garnicht aufgerufen wird
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Okt 2023 um 21:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.933 Beiträge
 
Delphi 12 Athens
 
#10

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 13. Okt 2023, 09:13
Dann muss die globale Formvariable aber auch später auf nil gesetzt werden.
Am besten setzt man diese im OnDestroy auf nil, denn danach existiert ja das Formular auch nicht mehr. Innerhalb des Formulars selbst sollte diese nie benutzt werden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:11 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-2025 by Thomas Breitkreuz