Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dispose -> ungültige Zeigeroperation (https://www.delphipraxis.net/110912-dispose-ungueltige-zeigeroperation.html)

PASST 26. Mär 2008 17:17


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:
// 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]));
Kann mir jemand helfen?

Gruß
Peter

defede 26. Mär 2008 17:40

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.

PASST 26. Mär 2008 17:45

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.

defede 26. Mär 2008 17:49

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.

gmc616 26. Mär 2008 18:02

Re: Dispose -> ungültige Zeigeroperation
 
Mußt du nicht für jeden Eintrag in die Combobox einen neuen Artikel erstellen?

Delphi-Quellcode:
    // 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;
denn beim Entfernen aus der ComboBox gibts du das Objekt auf dem Zeiger PArtikel frei.
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.

omata 26. Mär 2008 18:06

Re: Dispose -> ungültige Zeigeroperation
 
@gmc616: :thumb: genau das ist es.

PASST 27. Mär 2008 13:13

Re: Dispose -> ungültige Zeigeroperation
 
Danke, so klappt es. Allerdings wundert es mich, wenn es dann in Delphi 4 funktioniert haben sollte!?

jbg 27. Mär 2008 18:36

Re: Dispose -> ungültige Zeigeroperation
 
Zitat:

Zitat von PASST
Danke, so klappt es. Allerdings wundert es mich, wenn es dann in Delphi 4 funktioniert haben sollte!?

Wenn das so war, war es reiner Zufall und eine tickende Zeitbombe, die nun eben hochgegangen ist.


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