Thema: OnCloseQuery

Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#7

AW: OnCloseQuery

  Alt 26. Mär 2020, 18:54
Wie gesagt, der Fehler tritt nur gelegentlich auf und nur beim Herunterfahren von Windows, nicht beim normalen Beenden des Programms.

OnCoseQuery(CanClose...) symbolisch
begin
CanClose:=FrageBox('Progamm wirklich beenden?') = mrOK
if CanClose then
begin
hier schließe ich StringListen Objekte usw.
end
end

Der Fehler ist blöd, weil er sich nicht debuggen lässt und dann auch nur gelegentlich auftritt. Ist mir vielleicht auch nicht aufgefallen.
Willie.
Eigentlich ist klar, dass bei dieser Konstellation ein Fehler auftreten kann.

Grob in etwa sowas:

Windows soll beendet werden.
Das sagt den Programmen: Aufhören.
Die reagieren darauf und beenden sich.
Windows wartet ein bisserl.
Und dann kommt: Wer nicht hören will muss fühlen.
Sprich: Programme, die sich nicht selbst beenden, werden dann von Windows beendet.

Dein Programm bekommt von Windows gesagt: Aufhören.
Es fragt Dich dann: Wirklich? Darf ich auch?
Das dauert ggfls. ein bisserl.
Ggfls. länger, als Windows zu warten bereit ist.
Deshalb wird das nachfragende Programm von Windows beendet, während es noch auf die Antwort auf das "Darfichauch" warte. Kommt nun hier hinein das "Ja, Du darfst" seitens des Anwenders, ist nicht auszuschließen, dass die schon windowsseitig begonnen "Aufräumarbeiten" Teile dessen, was Du bei if CanClose wegräumen möchtest, nicht mehr existiert. Und dann hast Du den "Salat", äh, die Zugriffsverletzung

Bitte bedenke: Wenn Dein Programm beim Beenden nachfragt, ob es beendet werden soll oder nicht, was passiert, wenn in der Fragebox nicht mit mrOk geantwortet wird?
Windows wird das Programm trotzdem beenden, es sei denn, Du signalisiert Windows, dass es sich bitte nicht beenden soll und alle noch laufende Programm weiterlaufen dürfen.

Alternativ im OnCoseQuery abfragen, ob Windows beendet wird. Wenn ja, dann darf kein Dialog zur Abfrage auf ein Programmende erfolgen.

Eventuell hilft Dir dashier dabei: http://delphidabbler.com/tips/185

Und, wie Frühlingrolle schon richtig bemerkte:

Im OnCloseQuery wird gefragt, ob aufgehört werden darf oder eben auch nicht.

Im OnClose wird dann aufgeräumt, nicht in dem Ereignis, in dem nachgefragt wird.
Oder halt, wenn im FormCreate was erstellt wurde, wird das im FormDestroy weggeräumt. Nicht jedoch im OnCloseQuery.

Geändert von Delphi.Narium (26. Mär 2020 um 22:22 Uhr) Grund: Schreibfehler behoben, in der Hoffnung, dass es jetzt weniger sind.
  Mit Zitat antworten Zitat