AGB  ·  Datenschutz  ·  Impressum  







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

OnCloseQuery

Ein Thema von Willie1 · begonnen am 17. Mär 2020 · letzter Beitrag vom 28. Mär 2020
Antwort Antwort
Seite 1 von 2  1 2      
Willie1

Registriert seit: 28. Mai 2008
657 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

OnCloseQuery

  Alt 17. Mär 2020, 18:09
Hallo Delphi-Freunde*innen,
ich habe in einem eigenen Prg in einem OnCloseQuery-Ereignis das Fenster mit der Frage "Beenden ? [Ok][Abbrechen]" nach bekannten Muster.
Wenn ich das Pgr offen lasse und Windows herunterfahre, kommt zu eine Warnung. Falls ich dann Windows nicht beende und dann [Abbrechen] klicke, läuft das Pgr. natürlich weiter.
Beende ich jetzt das Prg, öffnet sich nicht das oben genannte Fenster, sondern es kommt es zu einer Zugriffsverletzung und das Prg lässt sich nicht schließen.
Bevor ich hier etwas poste, wollte ich es eben nochmal ausprobieren und es war alles in Ordnung! Was zum Teufel ist da los? Die Zugriffsverletzung ist auch schon früher aufgetreten.

Genau das richtige zu Zeiten von Corona?!
Gruß und danke Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
657 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: OnCloseQuery

  Alt 24. Mär 2020, 17:53
Obwohl ich mich über eine Antwort gefreut hätte, ziehe ich meine Frage in diesen Corona-Zeiten zurück. Es gibt Wichtigeres.
Bleibt gesund Willie.

Geändert von Willie1 (24. Mär 2020 um 17:55 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.053 Beiträge
 
Delphi 2009 Professional
 
#3

AW: OnCloseQuery

  Alt 24. Mär 2020, 17:56
Ohne Minimalbeispiel kann dir keiner helfen.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Alt 24. Mär 2020, 18:16     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: OnCloseQuery

  Alt 25. Mär 2020, 08:31
Hallo,
Die Zugriffsverletzung ist auch schon früher aufgetreten.

-> MadExcept benutzen, um die Stelle zu finden.
Heiko
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
657 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: OnCloseQuery

  Alt 26. Mär 2020, 17:27
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: OnCloseQuery

  Alt 26. Mär 2020, 17:44
Hallo,
ahhhh

Zitat:
hier schließe ich StringListen Objekte usw.
Warum?
Dazu ist FormDestroy da.
Heiko
  Mit Zitat antworten Zitat
Alt 26. Mär 2020, 18:29     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 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
Willie1

Registriert seit: 28. Mai 2008
657 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: OnCloseQuery

  Alt 26. Mär 2020, 19:16
Hallo Leute,

Delphi-Narium, das hast du prima erklärt! Danke.
ich habe verstanden. Das um zu bauen, ist ja nicht allzu schwierig.

Gruß Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (26. Mär 2020 um 19:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: OnCloseQuery

  Alt 26. Mär 2020, 22:07
Und wenn die Form durch ein Free geschlossen wird, dann wird OnClose/OnCloseQuery nichtmal aufgerufen.

Statt einer MessageBox kann es besser sein hier einen Dialog auf Basis von TForm zu benutzen, denn sobald Application den Befehl für das Beenden bekommt, werden alle modalen Fenster geschlossen und dein Programm kann ohne Warten runterfahren.



Auch kann es nicht schaden auf die Message für das Beenden von Windows zu reagieren und benentsprechend zu steuern ob der Fragedialog überhaupt aufgehn soll.



Und nein, on OnClose/OnCloseQuery gibt man nichts frei, außer es wurde im OnShow erstellt,
wobei eben zu beachten ist, dass OnClose nicht immer aufgerufen wird, womit man in OnShow/OnClose niemals etwas erstellen/freigeben darf.
(außer man macht das Freigeben sowohl im OnClose als auch nochmal im OnDestroy, falls es noch nicht passiert war)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Alt 26. Mär 2020, 23:22     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: OnCloseQuery

  Alt 27. Mär 2020, 04:32
Hallo
korrekt,
FormCreate: Erzeugen von Objekten
FormDestroy: Freigeben von Objekten

Auch im Sinne des folgenden Codes:
Delphi-Quellcode:
Form2:=TForm2.Create(Self);
Form2.TuWas;
Form2.Free;
Heiko

Geändert von hoika (27. Mär 2020 um 06:40 Uhr)
  Mit Zitat antworten Zitat
Alt 27. Mär 2020, 07:30     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
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 00:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz