Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TObjectList: AV wenn OwnsObject := True (https://www.delphipraxis.net/84818-tobjectlist-av-wenn-ownsobject-%3D-true.html)

Luckie 22. Jan 2007 12:39


TObjectList: AV wenn OwnsObject := True
 
Ich habe eine Klasse von TPObjectList abgeleitet, um dort "Seiten" zuverwalten. Jede Seite ist ein Objekt. Die Klasse sieht wie folft aus:
Delphi-Quellcode:
type
  TPageCollection = class(TObjectList)
  private
    function Get(Index: Integer): TImageEnVect;
  public
    Constructor Create;
    procedure Add(Item: TImageEnVect);
    procedure Insert(Index: Integer; Item: TImageEnVect);
    procedure Update(Index: Integer; Item: TImageEnVect);
    property Items[Index: Integer]: TImageEnVect read Get;
    function FindItemByName(Name: String): Integer;
  end;

implementation

  { TPageCollection }

constructor TPageCollection.Create;
begin
  inherited;
  Self.OwnsObjects := True;
end;

...
Setze ich nun OwnsObjects auf True und fü+ge mehr als ein Objekt der Liste hinzu, kommt es zu einer AccessViolation, wenn die Liste bei Programmende freigegeben wird:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  PageCollection := TPageCollection.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(PageCollection);
end;
Was läuft da falsch?

sirius 22. Jan 2007 12:46

Re: TObjectList: AV wenn OwnsObject := True
 
1. Ist nicht ownsObject immer (Default) auf true?
2. Gibst du vielleicht ein Objekt selber frei?

Was anderes fällt mir jetzt auch nicht ein.

Luckie 22. Jan 2007 12:52

Re: TObjectList: AV wenn OwnsObject := True
 
1.) Scheint so:
Zitat:

OwnsObjects is true (the default),
Aber warum kommt es zu einer AV, wenn ich es noch mal setze.

2.) Nein, tue ich eigentlich nicht.

Aber auch, wenn ich keinen Constructor schreibe, kommt es zu einer AV beim Freigeben der Objektliste.

Angel4585 22. Jan 2007 12:59

Re: TObjectList: AV wenn OwnsObject := True
 
hast du mal versucht die anderen Prozeduren wie Add etc weg zu lassen? kommt das dann imernoch?

Luckie 22. Jan 2007 13:02

Re: TObjectList: AV wenn OwnsObject := True
 
Auch dann bekomme ich die AV. Als Objekte wird übrigens eine Imaging Komponente in der Liste gespeichert.

Angel4585 22. Jan 2007 13:04

Re: TObjectList: AV wenn OwnsObject := True
 
Also bei mir sieht das so aus, Aufruf un freigeben genau gleich wie bei dir und ich bekomme keine AV

Delphi-Quellcode:
type
  TPageCollection = class(TObjectList)
  public
    Constructor Create;
  end;

implementation

  { TPageCollection }

constructor TPageCollection.Create;
begin
  inherited;
  Self.OwnsObjects := True;
end;

Luckie 22. Jan 2007 13:07

Re: TObjectList: AV wenn OwnsObject := True
 
Und was passiert, wenn du Objekte der Liste hinzufügst?

Die Muhkuh 22. Jan 2007 13:07

Re: TObjectList: AV wenn OwnsObject := True
 
Luckie fügt aber noch Objecte in die Liste ein ;-)

sirius 22. Jan 2007 13:09

Re: TObjectList: AV wenn OwnsObject := True
 
Was steht denn bei dir in get bzw in add?

Angel4585 22. Jan 2007 13:11

Re: TObjectList: AV wenn OwnsObject := True
 
ok hab folgende Funktionen hinzugefügt:


Delphi-Quellcode:
procedure AddImage(Item: TImage);

procedure TPageCollection.AddImage(Item: TImage);
begin
Add(Item);
end;


procedure TtfMain.Button1Click(Sender: TObject);
begin
PageCollection := TPageCollection.Create;
PageCollection.Add(TImage.Create(Self));
end;

procedure TtfMain.FormDestroy(Sender: TObject);
begin
FreeAndNil(PageCollection);
end;

und ich bekomme keine AV. Kann das Problem sein das due die Add Funktion der Objectliste überschreibst?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 Uhr.
Seite 1 von 4  1 23     Letzte »    

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