AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

OnCloseQuery

Ein Thema von Willie1 · begonnen am 17. Mär 2020 · letzter Beitrag vom 28. Mär 2020
 
Delphi.Narium

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

AW: OnCloseQuery

  Alt 26. Mär 2020, 17: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 21:22 Uhr) Grund: Schreibfehler behoben, in der Hoffnung, dass es jetzt weniger sind.
  Mit Zitat antworten Zitat
 

 
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 14:45 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