![]() |
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:
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:
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; ...
Delphi-Quellcode:
Was läuft da falsch?
procedure TForm1.FormCreate(Sender: TObject);
begin PageCollection := TPageCollection.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(PageCollection); end; |
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. |
Re: TObjectList: AV wenn OwnsObject := True
1.) Scheint so:
Zitat:
2.) Nein, tue ich eigentlich nicht. Aber auch, wenn ich keinen Constructor schreibe, kommt es zu einer AV beim Freigeben der Objektliste. |
Re: TObjectList: AV wenn OwnsObject := True
hast du mal versucht die anderen Prozeduren wie Add etc weg zu lassen? kommt das dann imernoch?
|
Re: TObjectList: AV wenn OwnsObject := True
Auch dann bekomme ich die AV. Als Objekte wird übrigens eine Imaging Komponente in der Liste gespeichert.
|
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; |
Re: TObjectList: AV wenn OwnsObject := True
Und was passiert, wenn du Objekte der Liste hinzufügst?
|
Re: TObjectList: AV wenn OwnsObject := True
Luckie fügt aber noch Objecte in die Liste ein ;-)
|
Re: TObjectList: AV wenn OwnsObject := True
Was steht denn bei dir in get bzw in add?
|
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:33 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