Einzelnen Beitrag anzeigen

amigage

Registriert seit: 11. Nov 2005
Ort: Leipzig
270 Beiträge
 
Delphi 11 Alexandria
 
#1

Bitmap.Free und TObjectList

  Alt 19. Mär 2015, 11:26
Delphi-Version: XE7
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>;
MyList := TObjectList<TMyEntry>;

Und hier der Quellcode zu meinem Problem.

Delphi-Quellcode:
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;
Folgender Durchlauf:
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:
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;
Gleicher Durchlauf:
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.

_
  Mit Zitat antworten Zitat