| Autor |
Beitrag |
bbfan
      
Beiträge: 164
|
Verfasst: Fr 24.02.06 09:00
Hallo Leute!
Ich habe die TPanel Komponete ein bischen umgeschrieben (procedure hinzugefügt):
ScreenDump = TBitmap.
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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Fr 24.02.06 09:02
Ist dein Screen_dump das Panel?
|
|
bbfan 
      
Beiträge: 164
|
Verfasst: Fr 24.02.06 09:31
nein screen_dump ist eine TBitmap die ich global deklariert habe.
|
|
LLCoolDave
      
Beiträge: 212
Win XP
Delphi 2005
|
Verfasst: 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 
      
Beiträge: 164
|
Verfasst: Fr 24.02.06 13:23
Guter Hinweis! LEIDER nicht die Lösung!
|
|
bbfan 
      
Beiträge: 164
|
Verfasst: Mo 27.02.06 07:47
hat kein anderer hier noch ne Idee?
|
|
rybe
Hält's aus hier
Beiträge: 12
|
Verfasst: 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 
      
Beiträge: 164
|
Verfasst: 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
|
Verfasst: 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:
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:
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
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Mo 27.02.06 09:55
Vieleicht hilft das ja ein wenig.
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 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); 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 
      
Beiträge: 164
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Mo 27.02.06 20:03
Funktioniert es nicht mit TPanel.paintto() ? Oder wenn du den Canvas des Panels kurz umbiegst?
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: 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.
|
|