Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung bei TObjectlist.delete (https://www.delphipraxis.net/88712-zugriffsverletzung-bei-tobjectlist-delete.html)

IngoD7 21. Mär 2007 18:53

Re: Zugriffsverletzung bei TObjectlist.delete
 
Zitat:

Zitat von ozz
Hallo IngoD7,
herzlichen Dank für den Hinweis. Ich habe dich verstanden und auch dein Anliegen. Ich habe die Test genau so gemacht, wie du es vorgeschlagen hast. Ich habe auch das Free eingebaut und das Delete entfernt. Danke nochmal!

Test? :shock:

Postest du bitte mal deinen aktuellen Destruktor TStreamlist.destroy? :wink:

ozz 22. Mär 2007 17:24

Re: Zugriffsverletzung bei TObjectlist.delete
 
Hallo IngoD7,
ich habe mich in letzter Instanz entschieden, den Tip von Jelly angenommen. Daher habe ich jetzt keinen eigenen Destructor mehr, sondern den der Klasse TObjectlist. Den Test, nach dem du gefragt hast, habe ich vor diese letzten Änderung gemacht. Momentan sieht die Klasse so aus.


Delphi-Quellcode:
type TStreamlist= class (TObjectlist)
private
   function GetStream(Index: Integer): TStringstream;
   procedure PutStream(Index: Integer; const Value: TStringstream);

public
   function add: integer;overload;
   function Add(Item:TStringstream):integer;overload;
   property items[Index: Integer]: TStringstream read GetStream write PutStream;
end;

implementation

function TStreamlist.add: integer;
var TagType: TStringstream;
begin
   TagType:=TStringstream.Create('');
   Result:= inherited add(TagType);
end;

function TStreamlist.Add(Item: TStringstream): Integer;
begin
    Result:= inherited add(item);
end;

function TStreamlist.GetStream(Index: Integer):TStringstream;
begin;
    result:= TStringstream(inherited Items[Index]);
end;

procedure TStreamlist.PutStream(Index: Integer; const Value: TStringstream);
begin
    inherited items[Index]:=Value;
end;

end.

Jelly 22. Mär 2007 18:12

Re: Zugriffsverletzung bei TObjectlist.delete
 
Zitat:

Zitat von ozz
Delphi-Quellcode:
function TStreamlist.add: integer;
var TagType: TStringstream;
begin
   TagType:=TStringstream.Create('');
   Result:= inherited add(TagType);
end;

Das geht sogar noch kürzer :wink:
Delphi-Quellcode:
function TStreamlist.add: integer;
begin
   Result:= inherited add(TStringstream.Create(''));
end;

Achim Kalwa 22. Mär 2007 18:39

Re: Zugriffsverletzung bei TObjectlist.delete
 
Hallo,

ich hab' jetzt nicht alle Antworten gelesen und weiß auch nicht, was dieses Konstrukt genau anstellen soll. Aber das hier springt mir doch ins Auge:
Zitat:

Zitat von ozz
Delphi-Quellcode:
procedure TStreamlist.clear;
begin
 while FStreamObjectList.Count >0 do
 begin
   FStreamObjectList.Delete(0);
 end;
end;

Warum machst Du nicht einfach folgendes:
Delphi-Quellcode:
procedure TStreamlist.clear;
begin
  FStreamObjectList.Clear;
end;
Das löscht ebenfalls alle Objekte in FStreamObjectList. Und da FStreamObjectList der Eigentümer aller enthaltener Objekte ist, werden diese alle auch vorher brav mit Free freigegeben.

Wenn Du das -- aus irgend einem Grund -- trotzdem "von Hand" machen möchtest, dann musst Du nach dem Free() den Eintrag in der Liste auf NIL setzen. Der nachfolgende Aufruf von Clear() durchläuft ja intern noch einmal die Liste und versucht, die Items freizugeben... *Bumm*. Dass die Items von Dir schon freigeben wurden, kann die Liste ja nicht wissen.

Delphi-Quellcode:
destructor TStreamlist.destroy;
var i:Integer;
begin;
  for i:= FStreamObjectList.Count-1 downto 0 do // Rückwärts laufen
  begin
    FStreamObjectList.Items[i].free    // jedes einzelne Objekt expl. freigeben
    FStreamObjectList.Items[i] := nil; // Referenz entfernen!!!
  end;
  FStreamObjectList.Clear(); // Alle Items entfernen.
  inherited Destroy; // und zum Schluss noch das Basisdestroy
Aber wie schon geschrieben: Der ganze Code ist hyperfluid: TObjectList.Clear() macht das alles schon intern!

Achim

Jelly 22. Mär 2007 18:54

Re: Zugriffsverletzung bei TObjectlist.delete
 
Zitat:

Zitat von kalwados
ich hab' jetzt nicht alle Antworten gelesen und weiß auch nicht, was dieses Konstrukt genau anstellen soll.
...
Warum machst Du nicht einfach folgendes:
Delphi-Quellcode:
procedure TStreamlist.clear;
begin
  FStreamObjectList.Clear;
end;

Tja, hättest Du vielleicht machen können. Das hätt Dir einiges an Tipparbeit erspart :mrgreen:

IngoD7 23. Mär 2007 07:31

Re: Zugriffsverletzung bei TObjectlist.delete
 
Zitat:

Zitat von ozz
Hallo IngoD7,
ich habe mich in letzter Instanz entschieden, den Tip von Jelly angenommen. Daher habe ich jetzt keinen eigenen Destructor mehr,

... sondern du leitest jetzt wieder direkt von TComponentList ab und hast vor allen Dingen kein extra Feld FStreamObjectList mehr.
Das ist neu. Das hättest du zwischendurch mal schreiben können. :?
Dann hätte ich mir auch Tipparbeit sparen können. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.
Seite 4 von 4   « Erste     234   

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