AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicher richtig freigeben

Ein Thema von Martin K · begonnen am 30. Mai 2006 · letzter Beitrag vom 31. Mai 2006
Antwort Antwort
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#1

Speicher richtig freigeben

  Alt 30. Mai 2006, 16:50
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 ?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Speicher richtig freigeben

  Alt 30. Mai 2006, 17:08
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Speicher richtig freigeben

  Alt 30. Mai 2006, 17:14
Danke für die schnelle Antwort

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 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?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Speicher richtig freigeben

  Alt 30. Mai 2006, 18:33
So:
Delphi-Quellcode:
var
  bmp: TBitmap;
begin
  ...
  bmp := MyBitmap;
  ToolBar1.Images.AddMasked(bmp, clBlack);
  Bmp.Free;
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Speicher richtig freigeben

  Alt 30. Mai 2006, 18:40
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

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???
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Speicher richtig freigeben

  Alt 30. Mai 2006, 19:42
Nochmal zur ImageList der ToolBar:

Wenn ich die ImageList einer ToolBar so erzeuge:
ToolBar1.Images := TImageList.Create(ToolBar1); oder so:
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...

Oder dachte ich da bisher falsch???
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Speicher richtig freigeben

  Alt 31. Mai 2006, 17:33
Hmm...
Muss leider mal pushen^^

Hat keiner eine Antwort auf meinen obigen Beitrag #6 ?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Speicher richtig freigeben

  Alt 31. Mai 2006, 17:35
Du hast recht. Du musst sie wohl nicht selbst freigeben.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Speicher richtig freigeben

  Alt 31. Mai 2006, 17:37
...gut, Danke!

Das wars auch schon
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz