![]() |
Wieso stürzt das Programm ab oder...?
Hallo,
das verstehe ich nicht, das verstehe ich überhaupt nicht. Was ist denn da los? Formular mit einem Label und einem Button. Bitte nur unter der IDE bei Benutzung des internen Debuggers starten!!! Folgende Formular-Unit:
Delphi-Quellcode:
Versucht mal abzubrechen (durch Click auf den Schließen-Button, oben rechts).
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } sl: TStringList; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if assigned(sl) then sl.Free; end; procedure TForm1.Button1Click(Sender: TObject); var i: longint; begin sl:=Tstringlist.Create; try for i:=0 to 1000000 do begin label1.Caption:=inttostr(i); application.processmessages end; finally freeandnil(sl) end; end; end. Nur mit Zugriffsschutzverletzung (beim 2. Click drauf). Warum? Und wie umgehe ich das? Und nun kommentiert mal die einzige Zeile in FormCloseQuery aus und versucht wieder abzubrechen. Geht nicht! Er stoppt nur solange man clickt und zählt dann weiter! Über die IDE kann man das aber problemlos sofort abbrechen. Warum geht das mit dem Schließen-Button nicht, warum geht das über die IDE? (Bei mir unter Delphi7 Pro passiert.) Gruß Matthias |
Re: Wieso stürzt das Programm ab oder...?
Kein Wunder, Du gibst sl frei in CloseQuery (über ProcessMessages) und greifst nach der Schleife dann nochmal darauf zu
So zB:
Delphi-Quellcode:
PS: Dies schließen der Form bedeutet nicht, das aus Schleifen gesprungen wird, die laufen fleißig weiter (u.u. bis es kracht).
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin Aborted:=True; if assigned(sl) then begin sl.Free; sl:=nil; end; end; procedure TForm1.Button1Click(Sender: TObject); var i: longint; begin sl:=Tstringlist.Create; try for i:=0 to 1000000 do begin label1.Caption:=inttostr(i); application.processmessages; If Aborted then Break; end; finally freeandnil(sl) end; end; |
Re: Wieso stürzt das Programm ab oder...?
Hallo,
vielen Dank! Ich dachte immer, bei CloseQuery (oder close) wird erst alles sauber beendet bzw. abgebrochen. Hatte mir schon gedacht, dass die Schleife danach noch läuft, aber das war eben doch unerklärlich für mich. Wenn das normal ist... Aber unschön ist es, wobei man da sicher auch eine positive Seite finden kann! Aber wie ist das mit dem Schließen? Warum kann die IDE das und das Schließen des Programmes nicht? Und warum kann es das Progrmmschließen nicht? Der gleiche Grund? Also: Schleifen werden immer erst beendet? Gruß Matthias |
Re: Wieso stürzt das Programm ab oder...?
Zitat:
Vielleicht erklärt das, was Du wissen möchtest: Eine Schleife läuft so lange, bis
Also mindestens prüfen ob Application.Terminated True ist, oder Beispiel wie oben verwenden. Ob jetzt Dein Programm über IDE läuft oder nicht ist der Schleife auch egal, das macht keinen unterschied. Wenn Du noch mehr Fragen hast, dann suche bitte zuerst im Forum, und erstelle ein neues Thema mit der Frage, wenn Du nichts findest, sonst machen die Modis :warn: :zwinker: |
Re: Wieso stürzt das Programm ab oder...?
Hallo,
natürlich suche ich erst mal im Forum, ob ein Beitrag zu meiner Frage passt. Geht das auch anders? Kann ich mir nicht vorstellen, wenn man einigermaßen höflich bleiben will. Ich habe allerdings nichts gefunden. Wahrscheinlich war ich nicht phantasievoll genug, um mir Frageformulierungen auszudenken. Da ich nicht wusste, was das ist, bin ich natürlich auch nicht auf den Suchbegriff "Schleife" gekommen. Wie machst Du das, wenn Du nicht weißt, wonach Du suchen sollst? Fängst Du bei "A" an? Ist doch wahr! ;-( Übrigens, die Frage war: Wie kann die IDE das abbrechen - auch wenn es in einer Schleife ist. Der Taskmanager von Windows killt das zwar auch, aber dann crasht die IDE, wenn sie noch läuft. Der ProcessExplorer macht aber auch das ordentlich von außerhalb der IDE! Wie das? Der muss doch dann die IDE irgendwie informieren, oder? |
Re: Wieso stürzt das Programm ab oder...?
Wenn Du ein Programm in der IDE debuggst, schaffst Du damit eine Abhaengigkeit zwischen dem Prozess in dem die IDE laeuft und dem Prozess in dem Dein Programm laeuft. Dem Taskmanager ist das egal, der killt einfach den gewünschten Prozess, worauf dann die IDE ins Leere greift und selber crasht (oder was auch immer, auf jeden Fall ungesund). Der ProcessExplorer könnte da eleganter vorgehen, was der im Detail macht, kann ich Dir aber so ad hoc auch nicht sagen, da müsste ich mal reinschauen. Ist auf jeden Fall nur eine weitere Variante von "bevor Du das Licht im Klo ausmachst, check ob noch jemand drin ist" ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 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