Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Speicher richtig freigeben (https://www.delphipraxis.net/70460-speicher-richtig-freigeben.html)

Martin K 30. Mai 2006 17:50


Speicher richtig freigeben
 
Hi, hab mal ne Frage zum Freigeben des Speichers:

Ich füge zur Laufzeit in FormCreate Bitmaps einer ToolBar hinzu.
Dabei erhalte ich das Bitmap aus einer Funktion, in der das Bitmap erzeugt wird.

Hier mal ein vereinfachtes Beispiel:
Delphi-Quellcode:
function MyBitmap: TBitmap;
begin
  Result := TBitmap.Create;
  Result.LoadFromFile...
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ToolBar1.Images := TImageList.Create(ToolBar1);
  ToolBar1.Images.AddMasked(MyBitmap, clBlack);
end;
Erhalte ich so ein Speicherleck, weil das Bitmap nicht wieder freigegeben wird?
Oder wird es automatisch freigegeben, da es zur ToolBar gehört und die ToolBar zu Form1 ?

SirThornberry 30. Mai 2006 18:08

Re: Speicher richtig freigeben
 
du musst die Imagelist und das Bitmap selbst wieder frei geben.
Das Bitmap kannst du jedoch direct nach AddMasked freigeben das mit AddMasked das Bitmap kopiert wird.

Martin K 30. Mai 2006 18:14

Re: Speicher richtig freigeben
 
Danke für die schnelle Antwort :thumb:

Zitat:

Zitat von SirThornberry
du musst die Imagelist und das Bitmap selbst wieder frei geben.

Sicher?
Die ImageList wird doch zur ToolBar1 erzeugt.
Aber das ist ja nicht das eigentliche Problem.


Zitat:

Zitat von SirThornberry
Das Bitmap kannst du jedoch direct nach AddMasked freigeben das mit AddMasked das Bitmap kopiert wird.

Wie denn?
Das Bitmap erhalte ich ja durch eine Funktion, wie kann ich es denn dann wieder freigeben?

Geht das etwa so?
Delphi-Quellcode:
ToolBar1.Images.AddMasked(MyBitmap, clBlack);
MyBitmap.Free;
Aber ich rufe doch beim zweiten Mal die Funktion erneut auf und erhalte so auch ein neues Bitmap (das ich freigebe).
Oder liege ich da falsch? :gruebel:

Hador 30. Mai 2006 19:33

Re: Speicher richtig freigeben
 
So:
Delphi-Quellcode:
var
  bmp: TBitmap;
begin
  ...
  bmp := MyBitmap;
  ToolBar1.Images.AddMasked(bmp, clBlack);
  Bmp.Free;

Martin K 30. Mai 2006 19:40

Re: Speicher richtig freigeben
 
Zitat:

Zitat von Hador
So:
Delphi-Quellcode:
var
  bmp: TBitmap;
begin
  ...
  bmp := MyBitmap;
  ToolBar1.Images.AddMasked(bmp, clBlack);
  Bmp.Free;

Okay, dann komm ich also um eine extra Variable vom Typ TBitmap nicht drum rum :gruebel:

Aber dann ist es glaub ich eher üblich, das ganze so zu schreiben:
Delphi-Quellcode:
procedure MyBitmap(var Bitmap: TBitmap);
begin
  Bitmap.LoadFromFile...
end;
Oder???

Martin K 30. Mai 2006 20:42

Re: Speicher richtig freigeben
 
Nochmal zur ImageList der ToolBar:

Wenn ich die ImageList einer ToolBar so erzeuge:
Delphi-Quellcode:
ToolBar1.Images := TImageList.Create(ToolBar1);
oder so:
Delphi-Quellcode:
ToolBar1.Images := TImageList.Create(Self); // Self = Form1
dann muss ich sie doch nicht wieder extra freigeben, oder?

Die ImageList gehört doch dann zur Form1 (bzw. zu ToolBar1 und diese gehört zu Form1) und beim Schließen von Form1 wird die ImageList (ToolBar1.Images) auch wieder ordnungegemäß freigegeben...
:gruebel:
Oder dachte ich da bisher falsch???

Martin K 31. Mai 2006 18:33

Re: Speicher richtig freigeben
 
Hmm...
Muss leider mal pushen^^ :oops:

Hat keiner eine Antwort auf meinen obigen Beitrag #6 ?

DGL-luke 31. Mai 2006 18:35

Re: Speicher richtig freigeben
 
Du hast recht. Du musst sie wohl nicht selbst freigeben.

Martin K 31. Mai 2006 18:37

Re: Speicher richtig freigeben
 
...gut, Danke!

Das wars auch schon :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 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