| Autor |
Beitrag |
Mann_aus_Delphi
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 07.11.08 20:44
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:
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Mann_aus_Delphi 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 07.11.08 20:51
Habe das mit den Variablen geändert, hilft aber leider nicht!
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Fr 07.11.08 20:52
Naja, wahrscheinlich ist das Result-Bitmap nirgendswo created...
|
|
Mann_aus_Delphi 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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?
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 07.11.08 21:18
Vielen Dank!!! Es funktioniert!!!
Falls irgendjemand auch so ein Problem haben sollte, poste ich noch den neuen Code!
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
|
|
|