Autor Beitrag
Mann_aus_Delphi
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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:

ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function MakeScreenShot():TBitmap;
  end;

var
  SShot: TScreenShot;
  DCDesktop: HDC;
  BMP: TBitmap;

implementation

function TScreenShot.MakeScreenShot():TBitmap;
begin
  BMP:=TBitmap.Create;

  //Höhe und Breite der BITMAP einrichten
  BMP.Height:=Screen.Height;
  BMP.Width:=Screen.Width;

  //Den Desktop DC-Handle einholen:
  DCDesktop:=GetWindowDC(GetDesktopWindow);

  //Screenshot in Bitmap einlesen
  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:

ausblenden Delphi-Quelltext
1:
BITMAP:=SShot.MakeScreenShot();					


Ich hoffe, Ihr könnt mir helfen,
Mann aus Delphi
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 07.11.08 20:51 
Habe das mit den Variablen geändert, hilft aber leider nicht!
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Fr 07.11.08 20:52 
Naja, wahrscheinlich ist das Result-Bitmap nirgendswo created...
Mann_aus_Delphi Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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



BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
procedure MakeScreenshot(const BMP: TBitmap);					
Mann_aus_Delphi Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 07.11.08 21:18 
Vielen Dank!!! Es funktioniert!!!

Falls irgendjemand auch so ein Problem haben sollte, poste ich noch den neuen Code!

ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure MakeScreenShot(const BMP: TBitmap);
  end;

var
  SShot: TScreenShot;
  DCDesktop: HDC;
  BMP: TBitmap;

implementation

procedure TScreenShot.MakeScreenShot(const BMP: TBitmap);
var
  DCDesktop: HDC;
begin
  //Höhe und Breite der BITMAP einrichten
  BMP.Height:=Screen.Height;
  BMP.Width:=Screen.Width;

  //Den Desktop DC-Handle einholen:
  DCDesktop:=GetWindowDC(GetDesktopWindow);

  //Screenshot in Bitmap einlesen
  BitBlt(BMP.Canvas.Handle,0,0,Screen.Width, Screen.Height,DCDesktop,0,0,SRCCOPY);
  BMP.SaveToFile('E:\ScreenShots\Test.bmp');
end;

end.


Aufgerufen durch:

ausblenden Delphi-Quelltext
1:
SShot.MakeScreenShot(BITMAP);					


Nochmals Danke,
Mann aus Delphi