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
Thema durchsuchen
Ansicht
Themen-Optionen

eigenartiges Verhalten bei Onclose eines Formulars

Ein Thema von SusiT · begonnen am 11. Okt 2023 · letzter Beitrag vom 13. Okt 2023
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

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

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 11. Okt 2023, 22:45
Erstens: Man ruft nicht Destroy auf, sondern Free. Und bei Forms besser Release.
Ist die Form Modal, dann nur Close und niemals Destroy/Free oder Dergleichen.

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?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
497 Beiträge
 
Delphi 12 Athens
 
#2

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 06:07
Eine Lösung, um das Close während der Ausführung der Prozedur zu verhindern wäre, das Ereignis TForm.OnCloseQuery zu nutzen und hier CanClose auf false zu setzen, wenn die Prozedure noch nicht fertig ist. Dazu wäre eine Variable hilfreich, die besagt, ob die Prozedure noch aktiv ist.

Ich lasse länger laufende Prozeduren möglichst nie im Hautthread laufen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 07:13
Wenn jemand aber bösartig Free/Destroy aufruft, dann wird OnCloseQuery ignoriert (nicht aufgerufen).

Destroy gibt das Objekt IMMER frei, egal ob jemand noch was abbrechen will (Exception/Abort/...)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Okt 2023 um 07:17 Uhr)
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
343 Beiträge
 
Delphi 12 Athens
 
#4

AW: eigenartiges Verhalten bei Onclose eines Formulars

  Alt 12. Okt 2023, 07:24
Moin,

darf ich da mal einhacken.
...Und bei Forms besser Release....
Ist Release nicht als deprecated geflagt? Oder ist das nur bei Firemonkey so? Normalerweise setzt man doch im OnClose Event der jeweiligen from den OnClose handle auf caFree und ruft dann einfach ein Tform.Close auf.
Da ich aber an der Stelle auch immer höchst unsicher bin, würd ich das gern nutzen um auch für mich mal Klarheit zu schaffen

Grüße und einen guten Start in den Tag
PJM
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

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

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
 
#6

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
910 Beiträge
 
Delphi 12 Athens
 
#7

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
435 Beiträge
 
#8

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
733 Beiträge
 
Delphi 12 Athens
 
#9

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
 
#10

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
Antwort Antwort
Seite 1 von 2  1 2      


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 04:06 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