Am übersichtlichsten ist es, wenn du das Bitmap in derselben Routine zerstörst, in der du die Funktion aufgerufen hast. Klar, das ist nicht immer möglich, aber das folgende Beispiel wäre so etwas. Hier wird das Bitmap in der OnPaint Methode eines Panels gezeichnet und wird anschließend nicht mehr benötigt:
Code: Alles auswählen
procedure TForm1.PanelPaint(Sender: TObject);
var
bmp: TBitmap;
begin
bmp := GetBitmap(ImageList, 0);
try
TPanel(Sender).Canvas.Draw(0, 0, bmp);
finally
bmp.Free;
end;
end;
Alternativ könntest du das Bitmap auch im Formular oder in der Unit global deklarieren, im FormCreate, wenn die ImageList geladen ist, erzeugen und im FormDestroy (oder sogar dem Finalization-Abschnitt der Unit) wieder freigeben. Damit sparst du dir das immerwährende Erzeugen/Zerstören des Bitmaps.
Allerdings gefällt mir diese Funktion überhaupt nicht weil ihr Name nicht darauf hinweist, dass hier etwas erzeugt wurde, was wieder zerstört werden muss, besser wäre z.B. "CreateFromImageList" o.ä.
Und speziell in diesem Fall wäre zu überlegen, ob die neue Funktion überhaupt nötig ist, da sie die Methode der ImageList nur als Funktion umschreibt:
Code: Alles auswählen
procedure TForm1.PanelPaint(Sender: TObject);
var
bmp: TBitmap;
begin
bmp := TBitmap.Create; // hier wird etwas erzeugt...
try
ImageList.GetBitmap(0, bmp);
TPanel(Sender).Canvas.Draw(0, 0, bmp);
finally
bmp.Free; // ... was hier wieder freigegeben wird.
end;
end;