Autor Beitrag
Zeterijus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20

Win XP
D2005 Prof
BeitragVerfasst: So 07.05.06 22:30 
Hallo,

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

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: 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.
ausblenden 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

_________________
Programmers never die, they just GOSUB without RETURN
Zeterijus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20

Win XP
D2005 Prof
BeitragVerfasst: 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.