AGB  ·  Datenschutz  ·  Impressum  







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

EInvalidPointer

Ein Thema von Madeleine · begonnen am 2. Jan 2003 · letzter Beitrag vom 2. Jan 2003
Antwort Antwort
Madeleine

Registriert seit: 27. Dez 2002
31 Beiträge
 
#1

EInvalidPointer

  Alt 2. Jan 2003, 10:57
Hi,habe mal den Code angehängt, zum besseren Verständnis!
Frage: Wie kann es sein, das wenn ich das Programm schließe, mir ein solcher Fehler angezeigt wird, genauso mit der Prozedur, inder man die Größe des Spielfeldes ändern kann.
Aber beim Schließen?!? Wo könnten die möglichen Fehler sein und wie kann man sie beseitigen?!?
thx for any help!
Angehängte Dateien
Dateityp: doc unit_Unit1_110.doc (38,5 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 2. Jan 2003, 11:28
Moin Madeleine,

ich bin mir jetzt nicht sicher, ob's daran liegt, aber mir ist aufgefallen, dass Du fleissig Bitmaps erzeugst, aber nur das jeweils letzte erzeugte auch wieder freigibst, wenn das Formular geschlossen wird.

Jedesmal, wenn Du TBitmap.Create aufrufst, wird ein neues Bitmapobjekt erzeugt. Dadurch werden dann Resourcen belegt, die auch wieder freigeben werden müssen.

Die grundlegende Vorgehensweise sieht eigentlich so aus:

  • Objekt erzeugen
  • Etwas mit dem Objekt machen
  • Objekt freigeben

Das heisst: Jedes Create benötigt auch ein Free.

Wie man das jetzt macht hängt auch davon ab, an welchen Stellen man es im Programm braucht.
Die drei Möglichkeiten, die mir da so auf Anhieb einfallen wären:
  1. Erzeugen im initialization Abschnitt einer Unit, und freigeben im finalization Abschnitt (z.B. bei Programmglobalen Objekten)
  2. Erzeugen im OnCreate eines Formulares, und freigeben im OnDestroy (bei unitglobalen/formularglobalen Objekten)
  3. Verwendung eines try/finally Blockes bei (prozedur)lokalen Objekten

Auf den ersten Blick scheint mir bei Deinem Programm die 2. Variante am passensten zu sein, da Du die entsprechenden Variablen ja als Felder des Formulares deklariert hast.

Es genügt dann einfach die beiden Felder im OnCreate des Formulares zu erzeugen, dort auch ihre Werte einzustellen (z.B., wie Du es machst den Inhalt aus einer Datei zu laden), im Programm zu benutzen, und dann im OnDestroy wieder freizugeben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Madeleine

Registriert seit: 27. Dez 2002
31 Beiträge
 
#3
  Alt 2. Jan 2003, 12:15
Hi Chris,
danke für die gut verständliche Erklärung, habe es so gemacht wie du es empfohlen hast, aber der Fehler ist immer noch da, mit den Bitmaps wird es wohl nicht zusammenhängen!
Ich denke, es liegt daran, das wenn ich jetzt im Fall des Spielfeldes ändern,ok geklickt habe, das dann wieder FormCreate aufgerufen wird und die dynamischen Arrays zweimal deklariert werden. Habe deshalb FormResize geschrieben, aber das hat auch nicht geholfen!
Hat noch jmd ne Idee? *hoffnungsvoll in die Runde schau*
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4
  Alt 2. Jan 2003, 13:36
Hallo Madeleine,

wenn du den EInvalidPointer beim Beenden Deines Programmes bekommst gibt es mehrere Möglichkeiten.

1. Du greifst in deiner OnClose-Ereignisbehandlung auf Zeiger zu die nicht mehr existent sind. (Sieht hier erst mal nicht so aus)

2. Viel eklieger, du hast Ereignisbehandlungen geschrieben (z.B. OnRecize) die mit Zeigern arbeiten. Setze bei jeder Methode in der du global definierte Zeiger verwendest einfach eine Prüfung vorweg. So nach der Art:

IF not Assigned(Zeiger) then Exit;
oder
IF Zeiger = nil then Exit;


Achte aber darauf, dass die zu prüfenden Zeiger nach der Freigabe auf nil gesetzt sein sollten!! Ich hab die Erfahrung gemacht das freigegebene Zeiger nicht automatisch auf nil gesetzt werden. (Verwendest du Handle prüfe auf 0 (null))

Also, prüfe mal mit einem Brakepoint auf OnClose und mit Step-byStep Methode (F7) welcher Zeiger spinnt. Den dann prüfen (wie oben) und mit Exit raus aus der Methode.

Gruß Olaf
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 2. Jan 2003, 14:47
Moin Oki,

Zitat:
Ich hab die Erfahrung gemacht das freigegebene Zeiger nicht automatisch auf nil gesetzt werden.
Deshalb gibt's, ich glaube seit Delphi 5, die Funktion FreeAndNil. Die erledigt beides auf einen Rutsch.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6
  Alt 2. Jan 2003, 19:36
Hallo Christian,

man lernt nie aus! Danke für den Tip.

Gruß Olaf
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:18 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