| Autor |
Beitrag |
Weide
      
Beiträge: 61
|
Verfasst: 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
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if bClosing = FALSE do begin ...; end else begin Liste.Free; ...; end; |
|
|
FriFra
      
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
|
Verfasst: Mi 19.03.03 23:06
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: 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 
      
Beiträge: 61
|
Verfasst: 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
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:
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
|
Verfasst: 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 
      
Beiträge: 61
|
Verfasst: Do 20.03.03 00:34
Hallo Luckie,
ich mag's halt lieber deutsch
es handelt sich natürlich um das "OnClose"-Ereignis
Gruß Weide
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: 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
|
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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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! 
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
|