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([...]); Image1.Canvas.Drav([..]bmp); bmp.free; end; |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!