Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap als Zeiger - Ich versteh es nicht ! (https://www.delphipraxis.net/59323-bitmap-als-zeiger-ich-versteh-es-nicht.html)

jfheins 21. Dez 2005 09:05

Re: Bitmap als Zeiger - Ich versteh es nicht !
 
Kleines Beispiel:
Delphi-Quellcode:
function MyFunc (AValue: String): TBitmap;
var
  MyVar: Boolean;
begin

  //Etwas machen

  Result := TBitmap.Create;

  Result.Machwas;

end;

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

var
  TempBmp, Bmp1, Bmp2, Bmp3, Bmp4: TBitmap;
begin
  Bmp1:= TBitmap.Create;
  Bmp2:= TBitmap.Create;
  Bmp1.LoadFromFile('C:\bild1.bmp');
  Bmp2.LoadFromFile('C:\bild2.bmp');

  TempBmp := MyFunc ('Ein Bitmap bitte');

  Bmp3 := TempBmp; // Addresse zugewiesen - Bmp3 und TempBmp zeigen auf dasselbe Bitmap

  Bmp4 := TBitmap.Create;
  Bmp4.Assign (TempBmp); // Bitmap Kopiert

  // Hier zeigen TempBmp und Bmp3 auf das zurückgegebene Bitmap und Bmp4 zeigt auf eine Kopie dessen.

  TempBmp := MyFunc ('Ein anderes Bitmap bitte'); // Kein Leak, wel Addresse noch in Bmp3
  // Bmp3 := nil; // Leak
  FreeAndNil (Bmp3);
Ich hoffe, ich konnte dir helfen ;)

xaromz 21. Dez 2005 09:40

Re: Bitmap als Zeiger - Ich versteh es nicht !
 
Hallo,
Zitat:

Zitat von jfheins
Kleines Beispiel:
Delphi-Quellcode:
...
Bmp4.Assign (TempBmp); // Bitmap Kopiert
...

Das wird so nicht funktionieren, wenn Du Bmp4 nicht initialisierst.

Gruß
xaromz

jfheins 21. Dez 2005 09:42

Re: Bitmap als Zeiger - Ich versteh es nicht !
 
:oops: Das sollte nicht passieren ...

Cicaro 22. Dez 2005 10:34

Re: Bitmap als Zeiger - Ich versteh es nicht !
 
@meisteralex:
Es ist schon richtig gesagt worden: es ist nicht sehr elegant eine Instanz als Rückgabewert einer Funktion zu verwenden.

Erstell doch einfach außerhalb der Funktion/Prozedur alle notwendigen Bitmaps, dann übergib' sie der Funktion/Prozedur als Zeiger.
Delphi-Quellcode:
procedure BmpEncode(Bitmap1,Bitmap2,Bitmap3:TBitmap);
begin
  // macht was mit Bitmap1 und Bitmap2 und legt das Ergebnis in Bitmap3
end;
So sollte es ohne Probleme funktionieren.

Eleganter finde ich diese Prozedur, wenn man ScanLine nicht braucht und stattdessen mit den relativ schnellen API-Funktionen arbeitet:
Delphi-Quellcode:
procedure EncodeDCs(SrcDc1,SrcDC2,DestDC:HDC);
begin
  // macht was mit SrcDC1 und SrcDC2 und legt das Ergebnis in DestDC
end;

// Aufruf:
EncodeDCs(Bitmap1.Canvas.Handle,Bitmap2.Canvas.Handle,Bitmap3.Canvas.Handle);
Sinnvoll bei sprachübergreifender Programmierung.

meisteralex 22. Dez 2005 14:56

Re: Bitmap als Zeiger - Ich versteh es nicht !
 
jo hab das prinzip jetzt verstanden -> dank euch, also vielen dank


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.
Seite 2 von 2     12   

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-2025 by Thomas Breitkreuz