![]() |
Delphi-Version: XE7
Bitmap.Free und TObjectList
Hallo liebe Delphianer,
ich bräuchte einmal eine verständliche, theoretische Erklärung für mein Problem. und zwar wirkt sich bei mir ein Bitmap.Free auf den Inhalt meiner TObjectList aus...
Delphi-Quellcode:
TMyEntry = class(TObject)
// ... Icon : TBitmap; // ... end; TMyEntryList = TObjectList<TMyEntry>;
Delphi-Quellcode:
MyList := TObjectList<TMyEntry>;
Und hier der Quellcode zu meinem Problem.
Delphi-Quellcode:
Folgender Durchlauf:
var
i : integer; MyEntry : TMyEntry; AIcon : TBitmap; begin AIcon := TBitmap.Create; AIcon.PixelFormat := pf32Bit; for i := 0 to MyList.Count - 1 do begin MyEntry := TMyEntry(MyList[I]); If MyEntry.Icon = NIL then begin try ImageList.GetBitmap(1, AIcon); except end; end else begin AIcon := MyEntry.Icon; end; // weitere Verwendung von AIcon end; 1) MyEntry.Icon <> NIL, also AIcon = MyEntry.Icon 2) MyEntry.Icon = NIL, also AIcon aus einer ImageList holen Problem: bei Durchlauf 2 wird das AIcon und damit mein MyEntry.Icon überschrieben Also ein anderer Versuch, das AIcon immer neu zu erstellen.
Delphi-Quellcode:
Gleicher Durchlauf:
var
i : integer; MyEntry : TMyEntry; AIcon : TBitmap; begin for i := 0 to MyList.Count - 1 do begin AIcon := TBitmap.Create; AIcon.PixelFormat := pf32Bit; try MyEntry := TMyEntry(MyList[I]); If MyEntry.Icon = NIL then begin try ImageList.GetBitmap(1, AIcon); except end; end else begin AIcon := MyEntry.Icon; end; // weitere Verwendung von AIcon finally AIcon.Free; end; end; Problem: durch AIcon.Free wird ebenfalls MyEntry.Icon gelöscht -> Zugriffsverletzung beim Aufruf Kann mir bitte jemand erklären, warum AIcon noch eine Beziehung zu MyEntry.Icon hat? Wie muss ich MyEntry.Icon an AIcon übergeben, damit ich AIcon ordnungsgemäß löschen kann, ohne MyEntry.Icon zu löschen? Aktuell muss ich AIcon.Free auskommentiert lassen.... Vielen Dank schon einmal, an diejenigen, die mir dies erklären können. _ |
AW: Bitmap.Free und TObjectList
Zitat:
Gibst du jetzt die Objektinstanz frei, sind logischerweise beide Referenzen ungültig. Zitat:
Delphi-Quellcode:
lieber
AIcon := MyEntry.Icon
Delphi-Quellcode:
verwenden, um den Inhalt des Icons zu kopieren.
AIcon.Assign(MyEntry.Icon)
Bzw. macht das ständige Erstellen und Freigeben des Icons auch gar keinen Sinn. So wie ich deinen Code verstehe, willst du die Icons doch grade für spätere Verwendung in der MyList zwischenspeichern. Probiers mal so:
Delphi-Quellcode:
Freigeben musst du die Icons dann, wenn du sie nicht mehr brauchst, indem du MyList nochmal iterierst und alle nicht leeren Bitmaps zerstörst.
var
I: Integer; MyEntry: TMyEntry; Icon: TBitmap; begin for := MyList.Count - 1 do begin MyEntry := TMyEntry(MyList[I]); if (not Assigned(MyEntry.Icon)) then begin Icon := TBitmap.Create; Icon.PixelFormat := pf32Bit; ImageList.GetBitmap(1, Icon); MyEntry.Icon := Icon; end else begin Icon := MyEntry.Icon; end; // weitere Verwendung von Icon end; end;
Delphi-Quellcode:
var
I: Integer; MyEntry: TMyEntry; begin for := MyList.Count - 1 do begin MyEntry := TMyEntry(MyList[I]); if (Assigned(MyEntry.Icon)) then begin FreeAndNil(MyEntry.Icon); end; end; end; |
AW: Bitmap.Free und TObjectList
Hallo,
mit AIcon := MyEntry.Icon; weist Du AIcon die selbe Adresse wie MyEntry.Icon zu. Wenn Du den Inhalt von MyEntry.Icon nach AIcon kopieren möchtest, dann solltest Du assign verwenden. Grüße Klaus |
AW: Bitmap.Free und TObjectList
Willst du tatsächlich mit einer Kopie des Icons arbeiten, dann so:
Delphi-Quellcode:
AIcon.Assign(MyEntry.Icon);
AIcon.PixelFormat := pf32Bit; {...} |
AW: Bitmap.Free und TObjectList
PS: Du verwendest doch eine generische Liste, welche automatisch den richtigen Typen besitzt,
demnach sind die manuellen Casts ein bissl "überflüssig". Zitat:
Delphi-Quellcode:
-Variable entfernen und überall direkt
MyEntry
Delphi-Quellcode:
verwenden, anstatt der Variable.
MyList[I]
|
AW: Bitmap.Free und TObjectList
An alle,
vielen, vielen Dank für die Erklärungen. Ich habe mir schon gedacht, dass beide auf das Gleiche verweisen. Ich wusste jedoch nicht, wie ich eine tatsächliche Kopie übergebe. Jetzt weiß ich es :-D @himitsu: danke für den Hinweis auf den überflüssigen Cast. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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