![]() |
specialize TFPGObjectList : AV bei Free
Hallo,
da das mit den Rescourcen klappt, kommt das nächste Problemchen mit specialize TFPGObjectList:| Folgendes ist gegeben
Code:
In TSmileys.FSmileys werden 845 Smileys geladen:
type
TSmileyInfo = record Character : Integer; Resource : Integer; end; TSmiley = class(TObject) private FCharacter : Integer; FImage : TPicture; public constructor Create(aCharacter : Integer; aImage : TPicture); destructor Destroy; override; procedure render(deviceContext : HDC; X, Y : Integer); property Character : Integer read FCharacter; end; Smileys = specialize TFPGObjectList<TSmiley>; TSmileys = class(TObject) private FSmileys : Smileys; protected procedure Load(aSmileyInfo : TSmileyInfo); function Find(aCharacter : Integer): TSmiley; public constructor Create; destructor Destroy; override; procedure renderSmiley(aCharacter : Integer; deviceContext : HDC; X, Y : Integer); end;
Code:
Das Problem taucht nun beim freigeben auf, egal wie ich es mache, es kommt zu einer AV:(
...
constructor TSmileys.Create; var I : Integer; begin inherited Create; FSmileys := Smileys.Create(True); for I := Low(TSmileyList) to High(TSmileyList) do Load(TSmileyList[I]); end; procedure TSmileys.Load(aSmileyInfo : TSmileyInfo); begin FSmileys.Add(TSmiley.Create(aSmileyInfo.Character, ResourceLoader.loadImageFromResource(aSmileyInfo.Resource, itPNG))); end; ...
Code:
Das blöde ist nur das es immer bei einem anderen Picture kommt.
...
constructor TSmiley.Create(aCharacter : Integer; aImage : TPicture); begin inherited Create; FCharacter := aCharacter; FImage := aImage; end; destructor TSmiley.Destroy; begin if Assigned(FImage) then FImage.Free; <- Hier inherited Destroy; end; ... destructor TSmileys.Destroy; var Smiley : TSmiley; begin for Smiley in FSmileys do if Assigned(Smiley) then Smiley.Free; FSmileys.Free; inherited Destroy; end; ... Wie kann ich das Image(TPicture) freigeben ohne das Knallt? FreeAndNil geht auch nicht. |
AW: specialize TFPGObjectList : AV bei Free
Zitat:
|
AW: specialize TFPGObjectList : AV bei Free
Ich sehe, dass die Referenz auf
Delphi-Quellcode:
im Constructor reingegeben - und nicht intern erzeugt wird. Vermutlich wird die Instanz durch irgendeinen Logikfehler deshalb mehrfach freigegeben.
FImage
|
AW: specialize TFPGObjectList : AV bei Free
@Zacherl
Ich werde morgen mal FImage initialisieren und das übergebene Picture via Assing zuweisen, mal sehen vielleicht geht das ja. Danke erstmal und noch einen schönen Abend:wink: Update: Also eine Änderung in:
Code:
bringt auch nichts :o.
constructor TSmiley.Create(aCharacter : Integer; aImage : TPicture);
begin inherited Create; FCharacter := aCharacter; FImage := TPicture.Create; FImage.Assign(aImage); end; |
AW: specialize TFPGObjectList : AV bei Free
Moin...:P
Du erzeugst die Objektliste mit OwnsObjects = True und gibst im destructor selbst die enthaltenen Bilder wieder frei. Das muß Puff machen...:wink: Wenn du die Instanzen selbst verwalten möchtest dann OwnsObjects auf False. Dann würde das mit der Freigabe passen. Dann brauchst du aber auch nicht auf Assigned prüfen. Jeder Listeneintrag ist ein Pointer.
Delphi-Quellcode:
..fertsch. :zwinker:
FSmileys := Smileys.Create(True); // OwnsObjects = True
. . . destructor TSmileys.Destroy; var Smiley : TSmiley; begin // for Smiley in FSmileys do // diesen Block brauchst du nicht // if Assigned(Smiley) then // Smiley.Free; // FSmileys.Free; inherited Destroy; end; |
AW: specialize TFPGObjectList : AV bei Free
Ja, sieht ganz so aus:oops:.
Ich habe es jetzt so gemacht und es geht:wink:
Code:
Danke
...
destructor TSmiley.Destroy; begin FPicture.Free; inherited Destroy; end; ... destructor TSmileys.Destroy; begin FSmileys.Clear; FSmileys.Free; inherited Destroy; end; |
AW: specialize TFPGObjectList : AV bei Free
Siehst du... again what learned. :stupid:
Das
Delphi-Quellcode:
kannst du auch weglassen. Das wird beim Free automatisch gemacht. Um Daniel zu zitieren: "Verschwendung von wertvollen Bits und Bytes" 8-)
FSmileys.Clear;
|
AW: specialize TFPGObjectList : AV bei Free
Und es geht noch kürzer:
Delphi-Quellcode:
Da der Destruktor dieselbe Signatur hat wie der geerbte, kann der explizite Aufruf entfallen.
destructor TSmileys.Destroy;
begin FSmileys.Free; inherited; end; |
AW: specialize TFPGObjectList : AV bei Free
...den hatte ich gar nicht gesehen weil selbstverfreilich. :oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 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-2025 by Thomas Breitkreuz