![]() |
Dispose -> ungültige Zeigeroperation
Hallo allerseits,
nachdem ich ein Programm von Delphi4 auf Delphi7 umgestellt (neu compiliert) habe, erhalte ich beim Dispose eine Exception der Klasse EInvalidPointer 'Ungültige Zeigeroperation'. Ich verwende den Pointer, um in einer Combobox zu jedem Eintrag einen zweiten Wert speichern zu können.
Delphi-Quellcode:
Kann mir jemand helfen?
// Data record
type TCodeRecord = Record Code: String; end; // Pointer to data record PLngMix = ^TCodeRecord; PArtikel = ^TCodeRecord; PLieferant = ^TCodeRecord; PSorte = ^TCodeRecord; [...] // Hier fülle ich die ComboBox, im Augenblick mit 18 Einträgen cboxArtikel.Items.clear; cboxArtikel.Text := ''; new(Artikel); while not eof do begin If fieldbyname('PLUNR').asstring = '' then Artikel^.Code := ' ' else Artikel^.Code := fieldbyname('PLUNR').asstring; cboxArtikel.Items.AddObject(fieldbyname('NAME').asstring, TObject(Artikel)); next; end; close; // Hier leere ich die ComboBox vom letzten bis zum ersten Eintrag wieder // Der letzte 17. Eintrag lässt sich löschen, // aber beim nächsten 16. Eintrag erhalte ich die Exception if cboxArtikel.Items.Count > 0 then for i := cboxArtikel.Items.Count - 1 downto 0 do Dispose(PArtikel(cboxArtikel.Items.Objects[i])); Gruß Peter |
Re: Dispose -> ungültige Zeigeroperation
Hallo,
Ist nur eine Idee aber wenn du mal versucht nur den Index 0 immer zu Löschen? Falls das Array beim Löschen zusammenrutscht kann der INdex ja nicht gefunden werden. |
Re: Dispose -> ungültige Zeigeroperation
Nein, da fällt nichts zusammen. Der Index 16 ist ja vorhanden. Ich kann mir auch den Wert cboxArtikel.Items[16] anzeigen lassen nachdem Dispose(PArtikel(cboxArtikel.Items.Objects[17])) erfolgreich war.
|
Re: Dispose -> ungültige Zeigeroperation
Na dann vor dem Delete einfach prüfen ob das Object <> NIL ist? Ich meine damit würdest du das ganze umgehen aber
so richtig gut ist diese Lösung auch nicht. |
Re: Dispose -> ungültige Zeigeroperation
Mußt du nicht für jeden Eintrag in die Combobox einen neuen Artikel erstellen?
Delphi-Quellcode:
denn beim Entfernen aus der ComboBox gibts du das Objekt auf dem Zeiger PArtikel frei.
// Hier fülle ich die ComboBox, im Augenblick mit 18 Einträgen
[ ... ] // new(Artikel); // --> hier raus while not eof do begin new(Artikel); // <-- hier rein If fieldbyname('PLUNR').asstring = '' then Artikel^.Code := ' ' else Artikel^.Code := fieldbyname('PLUNR').asstring; cboxArtikel.Items.AddObject(fieldbyname('NAME').asstring, TObject(Artikel)); next; end; Da du aber beim Füllen immer das gleiche Objekt verwendest, werden beim löschen des 17. Artikels alle Objekte (was quasi ja nur einens ist) von 17 bis 0 freigeben. nur eine Vermutug, denn so hab ich mit Comboboxen noch nicht gearbeitet. |
Re: Dispose -> ungültige Zeigeroperation
@gmc616: :thumb: genau das ist es.
|
Re: Dispose -> ungültige Zeigeroperation
Danke, so klappt es. Allerdings wundert es mich, wenn es dann in Delphi 4 funktioniert haben sollte!?
|
Re: Dispose -> ungültige Zeigeroperation
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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 by Thomas Breitkreuz