Autor Beitrag
bbfan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Fr 24.02.06 09:00 
Hallo Leute!

Ich habe die TPanel Komponete ein bischen umgeschrieben (procedure hinzugefügt):
ScreenDump = TBitmap.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TNutDef.savetoJPEG(fname: TFilename);
var
ARect : TRect;
jpg:TJPEGImage;
begin
 fname := changeFileExt(fname,'.jpg');
 screen_dump.Width := width;
 screen_dump.Height := height;
 screen_dump.Canvas.CopyRect(rect(0, 0, width, height), Canvas,  rect(0, 0, width, height));
 jpg:=TJPEGImage.Create;
 jpg.Assign(screen_dump);
 jpg.CompressionQuality:=90;
 jpg.SaveToFile(fname);
 jpg.Free;
end;


Problem: Er speichern immer den aktuellen Bildschirminhalt ab und nicht das TPanel. Also wenn dieses TPanel nicht sichtbar ist, wird der Bereich des sichtbaren gespeichert.
Wie kann ich es schaffen, dass das TPanel als Grafik gespeichert, auch wenn es nicht sichtbar ist.

Viele Grüße!
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Fr 24.02.06 09:02 
Ist dein Screen_dump das Panel?
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Fr 24.02.06 09:31 
nein screen_dump ist eine TBitmap die ich global deklariert habe.
LLCoolDave
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 212

Win XP
Delphi 2005
BeitragVerfasst: Fr 24.02.06 11:15 
Ich tippe mal darauf, dass das Problem in Zeile 9 liegt. Das Canvas bezieht sich vermutlich nicht auf dein Panel. Probier mal self.Canvas, bin mir nicht sicher ob das dann geht (bin gerade erst aufgestanden) aber das Problem liegt wohl in dieser Zeile.
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Fr 24.02.06 13:23 
Guter Hinweis! LEIDER nicht die Lösung!
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Mo 27.02.06 07:47 
hat kein anderer hier noch ne Idee?
rybe
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 27.02.06 09:09 
was genau möchtest du denn haben?

möchtest du die mittels canvas gezeichneten "bilder" speichern oder das gesamte panel sammt darauf befindlichen komponenten?
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Mo 27.02.06 09:10 
Ich möchte quasi einen "Screenshot" von diesem TPanel.
Also TPanel inkl. aller Labels...
rybe
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 27.02.06 09:33 
es ist zwar nicht ganz das, was du möchtest (funzt nur, wenn panel.visible:=true, aber vielleicht hilft es dir ja weiter:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure ScreenShot(Panel:TPanel;Bild: TBitMap);
var
  c: TCanvas;
  r: TRect;
begin
  c := TCanvas.Create;
  c.Handle := GetWindowDC(Panel.handle);
  try
    r := Rect(0, 0, Panel.Width, Panel.Height);
    Bild.Width := Panel.Width;
    Bild.Height := Panel.Height;
    Bild.Canvas.CopyRect(r, c, r);
  finally
    ReleaseDC(0, c.Handle);
    c.Free;
  end;
end;


aufruf wie folgt:

ausblenden Delphi-Quelltext
1:
ScreenShot(Panel1,Image1.Picture.BitMap);					


wenn du das panel für einen kurzen moment sichtbar machst und wieder versteckst, funzt es. problem: man sieht es kurz flackern. es dürfte auch nicht funktionieren, wenn du es sichtbar machst und aus dem sichtbaren bereich verschiebst. :(

ich gucke mal, ob es irgendwie auch anders geht.
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Mo 27.02.06 09:55 
Vieleicht hilft das ja ein wenig.

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:
43:
44:
45:
46:
47:
48:
49:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    FUNCTION ScreenshotControl(aControl : TControl; aFileName : String) : Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
FUNCTION TForm1.ScreenshotControl(aControl : TControl; aFileName : String) : Boolean;
VAR 
  bmp: TBitmap;
BEGIN 
  Result := FALSE;
  IF Assigned(aControl) THEN 
  TRY
    Bmp        := TBitmap.Create;
    Bmp.Width  := aControl.Width;
    Bmp.Height := aControl.Height; 
    Bmp.Canvas.CopyRect(Rect(0,0,Bmp.Width,Bmp.Height),
                        Canvas,aControl.BoundsRect); // "Canvas" = Self.Canvas 
    Bmp.SaveToFile(aFileName);
    Result := TRUE; 
  FINALLY
    FreeAndNil(Bmp); 
  END;
END; 

procedure TForm1.FormCreate(Sender: TObject);
begin
 IF ScreenShotControl(Panel1,'C:\Test.bmp') Then ShowMessage('Hat geklappt!');
end;

end.
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Mo 27.02.06 10:30 
dies ist ja ganz ähnlich oder gleich mit dem was ich habe.
Allerdings funktioniert das auch nur wenn das Panel sichbar ist.

Wenn es aber nicht sichtbar ist (liegt auf einem anderen Tabssheet) , dann klappt das nicht.
rybe
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 27.02.06 11:33 
wenn du nur labels auf deinem panel hast, dann kannst du es doch auch einfach selber "rendern"
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mo 27.02.06 20:03 
Funktioniert es nicht mit TPanel.paintto() ? Oder wenn du den Canvas des Panels kurz umbiegst?
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Mo 27.02.06 20:10 
Ich weiss jetzt nicht genau, aber rendern oder umbiegen wäre vieleicht noch eine Möglichkeit !?
Einfachmal mal im DF danach Suchen.