Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap zurück geben und freigeben (https://www.delphipraxis.net/105995-bitmap-zurueck-geben-und-freigeben.html)

Desmulator 3. Jan 2008 14:21


Bitmap zurück geben und freigeben
 
Also es geht um folgenden Code:

Delphi-Quellcode:
   Image := TBitmap.Create;  



   ...

    //Zurückgeben
    Result := Image;

  finally
    //Image frei geben
    Image.FreeImage;
    Image.Free;
  end;
Das Problem ist , dass ich als rückgabe eine leere Bitmap erhalte, und wenn ich Image im finally block nicht frei gebe klappt alles, bis auf das ich nach ner zeit keinen speicher mehr habe...

Was soll/muss ich anders machne?

MfG

DeddyH 3. Jan 2008 14:25

Re: Bitmap zurück geben und freigeben
 
Übergib das Image doch als Parameter.
Delphi-Quellcode:
procedure TuWas(const Image: TBitmap);
begin
  //hier Dein Code
end;

procedure TFromBla.Blubb;
var Image: TBitmap;
begin
  Image := TBitmap.Create;
  try
    Image.Width := 100;
    Image.Height := 100;
    TuWas(Image);
  finally
    Image.Free;
  end;
end;

Desmulator 3. Jan 2008 14:34

Re: Bitmap zurück geben und freigeben
 
ich würde es aber gerne so nutzen

Delphi-Quellcode:
GameScreen.Canvas.Draw(StaticObject.PosX,StaticObject.PosY,StaticObject.Appear());

TStaticObject.Appear() gibt eine Bitmap zurück die ich auf GameScreen zeichen will...

ich müsste es nun alles umständlich mit einer weiteren tempbmp lösen

Delphi-Quellcode:
TStaticObject.Appear(TempBmp);
GameScreen.Canvas.Draw(StaticObject.PosX,StaticObject.PosY,TempBmp); //Das finde ich is doof

DeddyH 3. Jan 2008 14:39

Re: Bitmap zurück geben und freigeben
 
Lies Dir mal diesen Thread durch.

Muetze1 3. Jan 2008 14:40

Re: Bitmap zurück geben und freigeben
 
Zitat:

Zitat von Desmulator
ich würde es aber gerne so nutzen

Delphi-Quellcode:
GameScreen.Canvas.Draw(StaticObject.PosX,StaticObject.PosY,StaticObject.Appear());
TStaticObject.Appear() gibt eine Bitmap zurück die ich auf GameScreen zeichen will...

Dann musst du mit dem Speicherleck leben. Grundsätzlich gibt man Objekte auf der Ebene frei, wo sie angelegt wurden. Da du das Objekt aber zurück geben willst, kannst du das nicht machen. Also entweder zusätzliche Bitmap oder Speicherleck.

Anderer Vorschlag: Warum nicht so?

Delphi-Quellcode:
  StaticObject.DrawAppear(GameScreen.Canvas);
Schliesslich hat StaticObject PosX, PosY und das Bitmap...

Nachtrag zu deiner Lösung: (freigeben fehlte, try/finally nur Sicherheit)

Delphi-Quellcode:
TStaticObject.Appear(TempBmp);
try
  GameScreen.Canvas.Draw(StaticObject.PosX,StaticObject.PosY,TempBmp); //Das finde ich is doof
finally
  TempBmp.Free;
end;

Desmulator 3. Jan 2008 14:48

Re: Bitmap zurück geben und freigeben
 
Zitat:

Zitat von Muetze1

Delphi-Quellcode:
  StaticObject.DrawAppear(GameScreen.Canvas);
Schliesslich hat StaticObject PosX, PosY und das Bitmap...

Naja ich möchte die Objecte auf den GameScreen zeichnen und nicht das sich die Objecte auf den GameScreen Zeichnen^^

also ich mach es dann gezwungener masen mit einem tmp bmp...

thx

Desmulator 3. Jan 2008 15:17

Re: Bitmap zurück geben und freigeben
 
Delphi-Quellcode:
  //Wir zeichenen das statische Onject auf seine Position
  TempBmp := TBitmap.Create;
  StaticObject.Appear(TempBmp);
  try
    GameScreen.Canvas.Draw(StaticObject.PosX,StaticObject.PosY,TempBmp);
  finally
    TempBmp.Free;
  end;
Ich erhalte eine zugriffsverletzung und zwar beim zeichen auf den GameScreen ( Paintbox )

wieso das jetzz?

DeddyH 3. Jan 2008 15:59

Re: Bitmap zurück geben und freigeben
 
Hmm... kann sein, dass ich jetzt Stuss schreibe, aber könnte es so gehen?
Delphi-Quellcode:
  TempBmp := StaticObject.Appear;
  try
    GameScreen.Canvas.Draw(StaticObject.PosX,StaticObject.PosY,TempBmp);
  finally
    TempBmp.Free;
  end;

Muetze1 3. Jan 2008 19:18

Re: Bitmap zurück geben und freigeben
 
Zitat:

Zitat von Desmulator
Delphi-Quellcode:
  //Wir zeichenen das statische Onject auf seine Position
  TempBmp := TBitmap.Create;
  StaticObject.Appear(TempBmp);
  try
    GameScreen.Canvas.Draw(StaticObject.PosX,StaticObject.PosY,TempBmp);
  finally
    TempBmp.Free;
  end;
Ich erhalte eine zugriffsverletzung und zwar beim zeichen auf den GameScreen ( Paintbox )

wieso das jetzz?

Was machst du denn nun in der Appear() Methode? Und warum steht der Aufruf der selben ausserhalb des try/finally Abschnittes?

Desmulator 3. Jan 2008 20:33

Re: Bitmap zurück geben und freigeben
 
Code von Appear
Delphi-Quellcode:
function TStaticObject.Appear( var Dest: TBitmap ) : TBitMap;
var
  Image : TBitmap;
begin
  try
    //Image erstellen
    Image := TBitmap.Create;

    { ... unwichtig ... }

    //"Zurück geben"
    Dest := Image;

  finally
    //Image frei geben
    Image.FreeImage;
    Image.Free;
  end;
end;
Ich glaube der Fehle liegt bei Dest := Image; ka obs stimmt


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr.
Seite 1 von 2  1 2      

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