Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Funktion gibt keinen Wert zurück!
Mann_aus_Delphi - Fr 07.11.08 20:44
Titel: Funktion gibt keinen Wert zurück!
Hallo Leute,
ich schreibe gerade ein Programm für Screenshots und bin am verzweifeln:
Ich rufe eine Funktion auf, die funktioniert auch einwandfrei, aber ich gekomme einfach keinen Rückgabewert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| unit ScreenShot;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ShellCtrls, StdCtrls, Screenshot_Code;
type TScreenShot = class(TForm)
private public function MakeScreenShot():TBitmap; end;
var SShot: TScreenShot; DCDesktop: HDC; BMP: TBitmap;
implementation
function TScreenShot.MakeScreenShot():TBitmap; begin BMP:=TBitmap.Create;
BMP.Height:=Screen.Height; BMP.Width:=Screen.Width;
DCDesktop:=GetWindowDC(GetDesktopWindow);
BitBlt(BMP.Canvas.Handle,0,0,Screen.Width, Screen.Height,DCDesktop,0,0,SRCCOPY); BMP.SaveToFile('E:\ScreenShots\Test.bmp'); Result.Assign(BITMAP); BMP.Free; end; |
Aufgerufen wird das durch folgenden Code:
Delphi-Quelltext
1:
| BITMAP:=SShot.MakeScreenShot(); |
Ich hoffe, Ihr könnt mir helfen,
Mann aus Delphi
Christian S. - Fr 07.11.08 20:46
Wenn eine Funktion was zurückgeben soll, musst Du das schon noch in result stecken. Woher soll Delphi sonst wissen, was es als Ergebnis benutzen soll? Sorry, habe eine Zeile übersehen: Da kommt irgendwie BITMAP und BMP durcheinander.
DCDesktop und BMP solltest Du außerdem unbedingt als lokale Variablen der Funktion deklarieren, die haben global nix verloren!
Mann_aus_Delphi - Fr 07.11.08 20:51
Habe das mit den Variablen geändert, hilft aber leider nicht!
Boldar - Fr 07.11.08 20:52
Naja, wahrscheinlich ist das Result-Bitmap nirgendswo created...
Mann_aus_Delphi - Fr 07.11.08 20:59
So, habe jetzt in Beide Units alle TBITMAPS created.
Nun bekomme ich keine Fehlermeldungen mehr, das zurückgegebene Bild enthält jeodhc auch keine Daten!
Kannst das am Result.Assign liegen?
Delete - Fr 07.11.08 21:10
Das könnte daran liegen, dass nirgends
Result := TBitmap.Create;
steht, das Resultat also nie erzeugt wird. Abgesehen davon bin ich der Meinung, dass man Objekte auch auf der Ebene freigeben sollte, auf der sie erzeugt werden. Das heißt, ich würde aus der Funktion eine Prozedur machen und die Bitmap als Parameter übergeben.
Delphi-Quelltext
1:
| procedure MakeScreenshot(const BMP: TBitmap); |
Mann_aus_Delphi - Fr 07.11.08 21:18
Vielen Dank!!! Es funktioniert!!!
Falls irgendjemand auch so ein Problem haben sollte, poste ich noch den neuen Code!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| unit ScreenShot;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ShellCtrls, StdCtrls, Screenshot_Code;
type TScreenShot = class(TForm)
private public procedure MakeScreenShot(const BMP: TBitmap); end;
var SShot: TScreenShot; DCDesktop: HDC; BMP: TBitmap;
implementation
procedure TScreenShot.MakeScreenShot(const BMP: TBitmap); var DCDesktop: HDC; begin BMP.Height:=Screen.Height; BMP.Width:=Screen.Width;
DCDesktop:=GetWindowDC(GetDesktopWindow);
BitBlt(BMP.Canvas.Handle,0,0,Screen.Width, Screen.Height,DCDesktop,0,0,SRCCOPY); BMP.SaveToFile('E:\ScreenShots\Test.bmp'); end;
end. |
Aufgerufen durch:
Delphi-Quelltext
1:
| SShot.MakeScreenShot(BITMAP); |
Nochmals Danke,
Mann aus Delphi
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!