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


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


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


Nochmals Danke,
Mann aus Delphi