Autor Beitrag
Weide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Mi 19.03.03 22:53 
Hallo,

in der Procedure Form1.Close gebe ich, wie es sich gehört, ein paar Stringlisten frei (Liste.Free). Ich wunderte mich allerdings über den EAccessviolaton-Fehler, sobald ich dies tue. Mir ist aufgefallen, dass die Anwendung nach(!) dem Beenden in meine Form1.OnResize-Procedure springt. In der wird aber mit den Stringlisten noch gearbeitet - da ist der Fehler kein Wunder. Wie kann ich verhindern, dass meine Anwendung nach dem Schliessen noch irgendwelche Anweisungen ausführt? Ein "Application.Terminate" brachte jedenfalls nichts. auch mit einem "Action.caFree" komme ich nicht weiter. Kann mir von Euch vielleicht jemand helfen?

Gruß Weide
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 19.03.03 23:04 
Nimm eine globale Variable bClosing vom Typ Boolean und die steht auf FALSE. Im OnClose-Ereignis wird sie auf TRUE gesetzt und im OnResize machst du das:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if bClosing = FALSE do
begin
  ...;
end
else
begin
  Liste.Free;
  ...;
end;
FriFra
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 557

Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
BeitragVerfasst: Mi 19.03.03 23:06 
Verwende einah eine globale boolsche Variable...
ausblenden Delphi-Quelltext
1:
Onclose:  IsClosing := True;					

OnResize:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if IsClosing = False then
begin
...Dein Code
end;


Moderiert von user profile iconTino: Delphi-Tags hinzugfügt.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 19.03.03 23:12 
Weide hat folgendes geschrieben:
in der Procedure Form1.Close gebe ich, wie es sich gehört, ein paar Stringlisten frei (Liste.Free). Ich wunderte mich allerdings über den EAccessviolaton-Fehler, sobald ich dies tue. Mir ist aufgefallen, dass die Anwendung nach(!) dem Beenden in meine Form1.OnResize-Procedure springt.


Die Frage ist aber doch, warum er das tut, gehe am besten die Close-Prozedur mit F7 Schritt für Schritt durch, damit Du weißt, wann OnResize aufgerufen wird. Evtl. brauchst Du dann das Workaround nicht. Oder poste einfach mal eine Close-Prozedur, vielleicht sehen wir dann ja was.

Gruß
Weide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Mi 19.03.03 23:41 
Hallo,

vielen Dank erstmal für Eure Antworten; das mit der globalen Variable klappt bestens, aber ich frage mich (wie UGrohne) trotzdem, wie es dazu kommt. Beim Durchgehen mit F7 kommt man bis zum Projektfenster (*.dpr), und dort bis zum "End". Danach erst springt er in die Resize-Procedure. Vielleicht sogar logisch, denn immerhin ändert sich die Fenstergröße beim Schliessen :wink:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TSerialNGAdvDLG, SerialNGAdvDLG);
  Application.Run;
end.

In der eigentlich Close-Procedure passiert eigentlich nichts spannendes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Beenden(Sender: TObject; var Action: TCloseAction);
begin
  if Aenderung = true then
  begin
    if MessageDlg('Temperaturkurve geändert! Wirklich beenden?',mtConfirmation,
       [mbYes, mbNo],0) = mrYes then
    begin
      SerialPortNG1.Active := False;
      XYListe.Free;
      XYListePaint.Free;
      Action := caFree;
    end else
       Action := caNone
  end else
  begin
    SerialPortNG1.Active := False;
    XYListe.Free;
    XYListePaint.Free;
  end;
end;


Gruß Weide
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 19.03.03 23:48 
Was ist denn das für ein Ereignis "Beenden"? Bei mir heißt das OnClose im ObjektInsepktor bzw. FormClose im Code dann.
Weide Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 61



BeitragVerfasst: Do 20.03.03 00:34 
Hallo Luckie,

ich mag's halt lieber deutsch :wink:

es handelt sich natürlich um das "OnClose"-Ereignis

Gruß Weide
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 20.03.03 07:22 
Weide hat folgendes geschrieben:
vielen Dank erstmal für Eure Antworten; das mit der globalen Variable klappt bestens, aber ich frage mich (wie UGrohne) trotzdem, wie es dazu kommt. Beim Durchgehen mit F7 kommt man bis zum Projektfenster (*.dpr), und dort bis zum "End". Danach erst springt er in die Resize-Procedure. Vielleicht sogar logisch, denn immerhin ändert sich die Fenstergröße beim Schliessen :wink:

Ich find das nicht wirklich logisch. Habs grade selbst bei mir ausprobiert, OnResize wird bei mir beim Start ausgelöst, das hast du ja auch beschrieben, aber interessant ist ja das Ende.... setz mla nen Haltepunkt auf die erste Prozedur in Beenden und geh dann mit F7 durch, dann kannste sagen, wo OnResize beim Beenden aufgerufen wird. Bei mir wirds beim Beenden nämich nicht aufgerufen.... :?

Gruß[/b]
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 20.03.03 09:27 
Zu dem OnResize:
Ich würde keine globale Variable verwenden, sondern einfach die Objekt-Referenzen nach dem Freigeben auf nil setzen, und im OnResize-Ereignis diese Referenz überprüfen.

Aber mal ein kleiner Hinweis am Rande: Speicher bzw. Objekt-Freigaben sollten immer im OnDestroy-Ereignis stattfinden! Das OnClose-Ereignis wird nur dann ausgelöst, wenn das Objekt eine WM_CLOSE Message erhält (der Message-Handler ruft die Methode Close auf) oder die Methode Close explizit aufgerufen wird. Sonst nicht! D.h. findet irgendwo ein Aufruf von PostQuitMessage oder Application.TerminateProcess (ruft intern auch nur PostQuitMessage auf) statt, so bekommt das Fenster nur eine WM_QUIT und keine WM_CLOSE Message. Folge: OnClose wird nicht ausgeführt und Speicher bzw. Objekte werden nicht freigegeben.

Und sobald einmal ein OnDestroy-Ereignis ausgelöst wurde kommt auch sicher kein OnResize mehr! :wink:

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!