Einzelnen Beitrag anzeigen

Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

specialize TFPGObjectList : AV bei Free

  Alt 2. Apr 2016, 18:33
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.
  Mit Zitat antworten Zitat