Hallo,
da das mit den Rescourcen klappt, kommt das nächste Problemchen mit specialize TFPGObjectList
Folgendes ist gegeben
Code:
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;
In TSmileys.FSmileys werden 845 Smileys geladen:
Code:
...
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;
...
Das Problem taucht nun beim freigeben auf, egal wie ich es mache, es kommt zu einer
AV
Code:
...
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;
...
Das blöde ist nur das es immer bei einem anderen Picture kommt.
Wie kann ich das Image(TPicture) freigeben ohne das Knallt?
FreeAndNil geht auch nicht.