Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Bei FormClose Exception EInvalidPointer (https://www.delphipraxis.net/193699-bei-formclose-exception-einvalidpointer.html)

EccoBravo 30. Aug 2017 14:34

Bei FormClose Exception EInvalidPointer
 
Hallo
In Delphi7

Beim Schliessen einer VCL W32 Applikation mit FormClose bekomme ich folgendes Fehlerfenster:

Im Projekt1.exe ist eine Exception der Klasse EInvalidPointer aufgetreten.
Meldung: 'Ungültige Zeigeroperation'. Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen.


Vermutlich brauchen wir jetzt die Glaskugel.
Aber vorab kann ich schon mal sagen, dass ich alle creierten Listen und FindFirst ... FindClose etc. abgeschlossen habe.

Es handelt sich um ein Programm, welches ich vor 10 Jahren geschrieben habe und auch schon so lange lief.

Vielleicht hat doch jemand eine Idee, wie dieser Fehler beim Schliessen des Programms entstehen kann.

VG + VD
EB

himitsu 30. Aug 2017 14:45

AW: Bei FormClose Exception EInvalidPointer
 
Zitat:

Zitat von EccoBravo (Beitrag 1379978)
Vielleicht hat doch jemand eine Idee, wie dieser Fehler beim Schliessen des Programms entstehen kann.

Irgendwo wird auf irgendwas zugegriffen, was es nicht mehr gibt.

Nach dem Knall gucken wo der Debugger stehen bleibt.
Eventuell noch 1-2 Mal F1 gedrückt, ob man eine bessere Fehlerposition bekommt. (manchmal/oftmals wird direkt nach dem Knall eine "falsche" Position angezeigt)
* manchmal = nicht ganz falsch, sondern nur zu weit im Stack zurück geschaut, weil durch Fehlerkennung keine frührere Code-Position gefunden wurde.


ODER
Haltepunkt auf den Beginn von FormClose und dann mit F7/F8 schauen, bis wo hin man kommt, bevor es knallt-

EccoBravo 30. Aug 2017 14:58

AW: Bei FormClose Exception EInvalidPointer
 
Danke sehr.
Mit dem CPU Fenster kann ich nicht umgehen.

Daher habe ich mit dem Breakpoint und F7 / F8 probiert.

Er bleibt beim Schliessen Der Anwendung stehen.
Daher habe ich in den Zeilen der Routine TForm1.FormClose debuggt.

Delphi-Quellcode:
TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
    I: integer;
begin
    SL.Clear;
    Img.Free;
    SL.Free;
    SL1.Free;
    for i:= 0 to 99 do
    begin
        TSatz(SatzList.Items[i]).Free;
    end;
    SatzList.Free;
    Satz.Free;
    close;
end;
In der vorletzten Zeile close; knallt es dann.

Soweit ich meinen Fehler beschreiben konnte.

VG + VD
EB

DeddyH 30. Aug 2017 15:04

AW: Bei FormClose Exception EInvalidPointer
 
Du bist doch schon im FormClose, wieso noch ein Close? Deine Listen sind weg, dadurch hast Du Dir wilde Zeiger gebaut, da die Variablen bzw. Felder jetzt auf freigegebenen Speicher zeigen. Kein Wunder, dass es knallt.

himitsu 30. Aug 2017 15:14

AW: Bei FormClose Exception EInvalidPointer
 
Soll heißen, dass dein OnClose doppelt ausgeführt wird und im zweiten Durchlauf knallt es.

Wo werden denn die Objekte erstellt?
Das Gegenteil von OnCreate ist OnDestroy und nicht OnClose.
Beim Constructor ist es der Desructor.
-> Dinge immer in der selben Ebene freigeben, wo sie auch erstellt wurden.

OnShow -> OnClose :stupid:



PS:
SL.Free macht auch ein Clear.

SatzList ist eine TList? Warum keine TObjectList mit OwnsObjects=True?

99 = SatzList.Count-1

EccoBravo 30. Aug 2017 15:17

AW: Bei FormClose Exception EInvalidPointer
 
Das war's! Klasse! Danke!

VD + VG
EB

Luckie 30. Aug 2017 17:29

AW: Bei FormClose Exception EInvalidPointer
 
Müsste die Schleife nicht rückwärts laufen? :|

himitsu 30. Aug 2017 17:38

AW: Bei FormClose Exception EInvalidPointer
 
Ist egal, da hier nur die referenzierten Bilder in der Liste gelöscht werden, aber die Referenzen nicht aus der Liste.
Aber grundsätzlich lösche ich auch fast immer rückwärts, damit ich es im Zweiel mal nicht vergess'.

Einer der Gründe, für die Frage nach der TObjectList.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 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