Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Wer gibt das eigentlich wieder frei?


Zeterijus - So 07.05.06 22:30
Titel: Wer gibt das eigentlich wieder frei?
Hallo,

ich habe eine grundsätzliche Frage zur Freigabe von Speicher. Und zwar habe ich eine Funktion die prinzipiell so aussieht


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function  malwas(width, height :integer): TBitmap;
begin
 result := TBitmap.Create;
 result.Width := width;
 result.Height := height;
  with result.canvas do begin
     brush.Color := clWhite;
     rectangle(0,0,width, height);
     font.Color := clBlack;
     font.size := 12;
     font.name := 'Verdana';
     textout(50,50,'Hallo Welt');
   end;
end;


Im Hauptprogramm gibt es dann ein Aufruf, der in etwa so aussieht


Delphi-Quelltext
1:
 image1.canvas.draw(0,0,malwas(image1.width, image1.height));                    


Meine Frage ist jetzt: Ich lege ja in der Prozeudr malwas in Zeile 3 ein Bitmap an. Aber an keiner Stelle gebe ich das wieder frei! Habe ich da vergessen mich um irgendwas zu kümmern?

Fabian.


alias5000 - So 07.05.06 23:28

Das wird, so wie du es machst, er st am PRogrammende wieder freigegeben. Es gibt zwei Möglichkeiten, die Sache zu zeichnen.
1.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Procedure XY;
var bmp: TBitmap;
begin
bmp := malwas([...]); //bmp ist nun der Zeiger auf ein TBitmap
Image1.Canvas.Drav([..]bmp);
bmp.free;
end//alles natürlich stark gekürtzt


2. Du kannst doch direkt aufs Canvas zeichnen. Du übergibst der Procedure malwas einfach das Canvas (--> [Delphi] Procedure MalWas(width, height: integer; var Canvas: TCanvas);
Und dann malst du direkt auf dem rum.
Später musst du dann statt Image1.Canvas.Draw([..], malwas(..)); einfach Image1.Canvas an malwas übergeben. Somit musst du erst gar kein Bitmap erstellen.

Überall mitgekommen? (Man sagt, ich könnte schlecht erklären.. :wink: )

Gruß alias5000


Zeterijus - So 07.05.06 23:38

Ja, danke, ich bin überall mitgekommen! Klasse Erklärung. ;-)

Ich denke, ich werde mich für die erste Methode entscheiden - erfordert weniger Änderungen an meinem Code.

Deine zweite Möglichkeit habe ich zu Beginn auch mal in Betracht gezogen, aber da die Übergabe teilweise recht verschlungen ist (die Grafik wird von irgendwelchen Objekten erzeugt, die erst mal ein einer Liste mit mehreren Unterlisten gesucht werden müssen etc.), habe ich mich dagegen entschieden. Ich finde es übersichtlicher wenn ich dann einfach das Bitmap zurück zu bekomme und das dann auf das Canvas kopiere.

Fabian.