AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal specialize TFPGObjectList : AV bei Free
Thema durchsuchen
Ansicht
Themen-Optionen

specialize TFPGObjectList : AV bei Free

Ein Thema von Alter Mann · begonnen am 2. Apr 2016 · letzter Beitrag vom 3. Apr 2016
 
Alter Mann

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

specialize TFPGObjectList : AV bei Free

  Alt 2. Apr 2016, 17: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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