Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperation (https://www.delphipraxis.net/109831-tobjectlist-clear-beim-2-aufruf-ungueltige-zeigeroperation.html)

guitar1 8. Mär 2008 14:45


TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperation
 
Hi,

ich hab eine von TObjectList abgeleitete Klasse, in der ich die procedure Clear übernommen habe, wenn ich nun - um ein neues "Dokument" zu öffnen - MeineListe.Clear schreibe, so funktioniert dies das erste mal super, wenn ich dann wieder etwas in das "Dokument" schreibe und erneut MeieListe.Clear ausführe kommt eine Fehlermeldung vom Typ "ungültige Zeigeroperation".

Was ist das denn für eine Logik? Beim erste mal klappts und danach nicht mehr?! Was kann ich den dagegen tun, bzw. ist jemandem dieses Problem bekannt?

grüße
guitar1

Dani 8. Mär 2008 15:29

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
Was genau hast du denn überschrieben? Zeig uns am Besten den gesamten Code der Klasse.

guitar1 8. Mär 2008 15:36

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
Delphi-Quellcode:
TTermteilList = class(TObject)
    private
      FItems: TObjectList;
      function GetItem(const Index: Integer): TTermteil;
    public
      constructor Create(const OwnsObjects: Boolean = true);
      destructor Destroy; override;

      function Add(const ATermTeil: TTermteil): Integer;
      function Count:Integer;
      procedure Delete(Index: Integer);
      procedure Insert(Index: Integer; ATermTeil: TTermteil);
      procedure Clear;

      property Items[const Index: Integer]: TTermTeil read GetItem; default;
  end;

implementation

// ----- PRIVATE -----
function TTermteilList.GetItem(const Index: Integer): TTermteil;
begin
  result:= TTermteil(FItems[Index]);
end;

// ----- PUBLIC -----
constructor TTermteilList.Create(const OwnsObjects: Boolean = True);
begin
  inherited Create;

  FItems:= TObjectList.Create(OwnsObjects);
end;

destructor TTermteilList.Destroy;
begin
  FItems.Free;

  inherited Destroy;
end;

function TTermteilList.Add(const ATermTeil: TTermteil): Integer;
begin
  TTermteil(FItems.Add(ATermTeil));
end;

function TTermteilList.Count:Integer;
begin
  result:= FItems.Count;
end;

procedure TTermteilList.Delete(Index: Integer);
begin
  FItems.Delete(Index);
end;

procedure TTermteilList.Insert(Index: Integer; ATermTeil: TTermteil);
begin
  FItems.Insert(Index, TTermteil(ATermTeil));
end;

procedure TTermteilList.Clear;
begin
  FItems.Clear;
end;
so schaut das aus, ich habs an Hand eines Beispiels gemacht wie ich es hier in der DP gesehn hatte.

Kroko1999 8. Mär 2008 15:41

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
Delphi-Quellcode:
function TTermteilList.Add(const ATermTeil: TTermteil): Integer;
begin
  Result := FItems.Add(ATermTeil);
end;

procedure TTermteilList.Insert(Index: Integer; ATermTeil: TTermteil);
begin
  FItems.Insert(Index, ATermTeil);
end;
mal verbessern und schauen, was passiert!

guitar1 8. Mär 2008 15:52

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
okay, ich hab das jetzt geändert und alles läuft noch xD, aber an meinem ursprünglichen Problem hat das leider nichts geändert :? ?! Aber danke für die Korrektur!

Muetze1 8. Mär 2008 15:55

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
Die beiden Typecasts sind irrelevant, aber die Warnung der Add Methode hättest du auch selber ausmerzen können, schliesslich weist dich der Compiler darauf hin (Rückgabewert könnte undefiniert sein).

Ich vermute eher ein Problem, dass du die Objekte die du ablegst (die TTermteil Instanzen) noch irgendwo anders hälst und nicht daran denkst, dass alle Instanzen freigegeben werden bei einem Clear (aussern du hast im Create deiner Klasse explizit false angegeben.

Kroko1999 8. Mär 2008 15:57

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
Der Fehler konnte auch nicht daran liegen, ev. hätte das Result von Add gesponnen. Meine Glaskugel sagt mir, Indexfehler in dynamischen Arraysm der sich dann auf diese Klasse auswirkt.

guitar1 8. Mär 2008 16:05

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
Also wenn ich "OwnsObjects: Boolean = false" nehme dann gehts :-D , aber ich habe irgentwo mal gehört das sollte man besser nicht tun da dann der Speicher nicht mehr richtig freigegeben wird?!

edit2: das 1. edit wieder löschen weils dumm war :wall: :lol:

Bernhard Geyer 8. Mär 2008 17:15

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
Zitat:

Zitat von guitar1
Also wenn ich "OwnsObjects: Boolean = false" nehme dann gehts :-D , aber ich habe irgentwo mal gehört das sollte man besser nicht tun da dann der Speicher nicht mehr richtig freigegeben wird?!

Dann gibst du wohl deine TTermteil irgendwo anders (evtl. TForm als Parent im Konstructor oder ähnliches?) wieder frei.

Wie der Name nahelegt sollte man OwnsObjects nicht verwenden wenn die Einträge in der List irgendwo anders speichertechnisch verwaltet werden und dann dort freigegeben werden.

guitar1 8. Mär 2008 17:23

Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
 
AHA okay, ich hab als parent immer TForm, dann hat sich das ja auch erledigt :-D

Vielen Dank an alle!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 Uhr.
Seite 1 von 2  1 2      

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