Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Formular drucken
ebs - Sa 23.04.05 21:23
Titel: Formular drucken
Hallo!
Ich drucke mit dieser Funktion ein Formular:
Delphi-Quelltext
1: 2:
| Printer.Orientation := poLandscape; Form1.Print; |
1. Problem ist, dass ich Ränder darum haben wollte, aber ich finde keine Funktion, wo ich die ändern könnte.
2. Problem ist, dass ja ein Kasten darum gezogen wird, der aber nicht vollständig angezeigt wird.
3. Problem ist, dass die Qualität ja nicht besonders berauschend ist. Gibt es vieleicht eine andere Methode?
Danke!
jasocul - Sa 23.04.05 21:36
Mit der Tastenkombination Alt-Druck kannst du das aktuelle Fenster (z.B. dein Formular) in die Zwischenablage geben.
Danach kannst du das in Word, OpenOffice, PhotoShop oder sonstwo wieder einfügen als Bild.
Das ganze lässt sich vermutlich auch programmieren, habe ich aber noch nie gemacht (kein Bedarf :wink: ).
Die Zwichenablage kann man ansteuern, und andere Anwendungen auch (z.B.: OLE).
ebs - So 24.04.05 10:01
Das nützt mir aber garnichts! Ich will das ganze ja nicht in andere Programme kopieren, sondern direkt drucken.
Fabian W. - So 24.04.05 16:40
Darf man erfahren zu welchem Zweck?
ebs - Mo 25.04.05 17:16
Hallo!
Ich habe mehere Bilder, die in einer bestimmten Anordnung auf dem Formular ist. Nun wollte ich das ganze halt drucken.
Vieleicht könnte man das ganze ja auch in einen Quickreport zwischen speichern, nur ich wüsste nicht, wie das geht.
Danke!
Heiko - Mo 25.04.05 17:41
Ich würde von dem Formular ein Scrennshot machen und das Bild dann ausdrucken, da du den Drucker selber kontrollieren kannst.
Hier der Quelltext für einen Screenshot vom ganzen Bildschirm:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure MakeScreenShot(const ATarget: TBitmap); var DesktopDC: HDC; begin DesktopDC := CreateDC('DISPLAY', nil, nil, nil); try ATarget.PixelFormat := pfDevice; ATarget.Width := Screen.Width; ATarget.Height := Screen.Height; BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY); finally DeleteDC(DesktopDC); end; end; |
Das kannst du ja an dein Programm anpassen.
ebs - Do 28.04.05 15:37
Hallo!
Wird dann nicht vom ganzen Bildschirm ein Screenshot gemacht :?:
Ich will doch einfach nur von meinem Formular einen Ausdruck machen.
Danke!
WeBsPaCe - Do 28.04.05 15:41
ebs hat folgendes geschrieben: |
Wird dann nicht vom ganzen Bildschirm ein Screenshot gemacht :?: |
Jawoll. Guck mal:
Heiko hat folgendes geschrieben: |
Ich würde von dem Formular ein Scrennshot machen und das Bild dann ausdrucken, da du den Drucker selber kontrollieren kannst.
Hier der Quelltext für einen Screenshot vom ganzen Bildschirm:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure MakeScreenShot(const ATarget: TBitmap); var DesktopDC: HDC; begin DesktopDC := CreateDC('DISPLAY', nil, nil, nil); try ATarget.PixelFormat := pfDevice; ATarget.Width := Screen.Width; ATarget.Height := Screen.Height; BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY); finally DeleteDC(DesktopDC); end; end; |
Das kannst du ja an dein Programm anpassen. |
Ich glaube, du sollst den Code noch ein wenig verändern. ;)
//EDIT: Hab was falsch gelesen. Ich weiß im Moment auch nicht, was du am Code machen kannst. :nixweiss:
Heiko - Do 28.04.05 17:44
So ich habe gerade nochmal nach dem Problem gesucht und bin fündig geworden. Davor aber die Variante die ich zuerst angesprochen hatte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure MakeScreenShot(const ATarget: TBitmap); var DesktopDC: HDC; begin DesktopDC:=CreateDC('DISPLAY', nil, nil, nil); try ATarget.PixelFormat:=pfDevice; ATarget.Width:=Form1.Width; ATarget.Height:=Form1.Height; BitBlt(ATarget.Canvas.Handle, -Form1.Left, -Form1.Top, Form1.Left+Form1.Width, Form1.Top+Form1.Height, DesktopDC, 0, 0, SRCCOPY) finally DeleteDC(DesktopDC) end end; |
Die gerade geschriebene Variante hat aber ein Nachteil, denn bei XP sind ja die Kanten vom Fenster abgerundet, wodurch du oben links und rechts je ein paar Pixel vom Hintergrund des Fensters hast. Bietet dafür den Vorteil, dass du den Rand des Fensters mitkopierst. Wenn du nur am Client-Bereich interessiert bist (also ohne Fensterrahmen), geht folgende Variante:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button1Click(Sender: TObject); var Bitmap: TBitmap; begin Bitmap:=GetFormImage; Bitmap.SaveToFile('Hallo_hier_ist_ein_Bitmap.bmp'); Bitmap.Free; end; |
PS @WeBsPaCe: Warum wusstes du nicht was du am Code machen solltest? Das einzige was ich ausprobieren musste war, wie die Werte bei BitBlt sind, da es ja das Windows-Koordinatensystem ist :wink: .
WeBsPaCe - Do 28.04.05 18:03
Heiko hat folgendes geschrieben: |
PS @WeBsPaCe: Warum wusstes du nicht was du am Code machen solltest? Das einzige was ich ausprobieren musste war, wie die Werte bei BitBlt sind, da es ja das Windows-Koordinatensystem ist :wink: . |
:rofl: Hab die
0,0 nicht gesehn... ;) :mrgreen:
ebs - Do 28.04.05 19:46
Tja,
dass ganze funktioniert aber bei mir nicht so toll. Und zwar habe ich mehrere Formulare, die übereinander liegen, so werden dann halt alle Formulare mit abgespeichert und nicht nur das eine. Die Qualität der Ausgabe gefällt mir aber, aber dieses TBITMAP hat scheinbar keine Druckausgabe, oder habe ich das was übersehen?
Aber mich stört wirklich diese obere Leiste.
Vieleicht kriege ich ja noch ein paar Tips!
Danke :D
Heiko - Fr 29.04.05 19:53
So, ich habe mich jetzt mal nach einem Tutorial zum drucken umgeschaut, damit du dir das selber erarbeiten kannst, denn beim selber erarbeiten versteht man das meiste doch ehr. Hier der
Link [
http://www.dsdt.info/tutorials/drucken/?page=downloads]. Ich hoffe es ist verständlich, da ich mir es selber nicht durchgelesen habe, da ich bisher drucken fast noch nie gebraucht habe. Es ist relativ leicht zu drucken. Wenn du was nicht verstehst frag einfach hier wieder nach.
Aber jetzt wieder zu dem Bild was du machen willst. Wenn es also ohne dem Rand haben willst, reicht es wenn du folgendes verwendest:
Delphi-Quelltext
1:
| Bild:=FormX.GetFormImage; |
Damit bekommst du das gesamte Formular kopiert, ohne Rand und ohne dass das Formular im Vordergrund sein muss.
ebs - Sa 30.04.05 15:02
Das drucken sollte für mich kein Problem sein, nur ich finde keine Funktion, womit ich ein TBitmap drucken kann. Auch in diesem Tutorial steht leider nichts drin.
Heiko - Sa 30.04.05 15:08
Delphi-Quelltext
1: 2: 3:
| Printer.BeginDoc; Printer.Canvas.Draw(Bild, 0, 0); Printer.EndDoc |
Steht das etwa nicht drin?
Außerdem gibt es in diesem Forum zum drucken von TBitmap schon etwas. Du solltest mal die Forensuche nehmen und nach
TBITMAP DRUCKEN guggen :wink: .
ebs - Sa 30.04.05 15:15
Ich habs ja so probiert, aber der Drucker wirft nur ne leere Seite aus. :evil: Wenn ich aber das Bitmap speicher, wird auch das Formular gespeichert.
Heiko - Sa 30.04.05 15:26
Das gleiche Problem hatte ich auch schon und hab es auf Anhieb auch nit hinbekommen :wink: . Ich wred danach nochmal guggen, wie ich es hinkriege.
ebs - So 01.05.05 10:11
Hallo!
Da ist mir aber ein blöder Fehler passiert :oops: Ich hatte das printer vor canvas vergessen. Ok, jetzt wird gedruckt, aber nicht auf der ganzen Seite, sondern nur genau in der Mitte. Dann habe ich mich mal umgeschaut und diesen Code gefunden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Uses Printers;
procedure TForm1.DruckeBild; var Bmp: TBitmap; begin Bmp:=TBitmap.Create; try tbit:=Tgraph.GetFormImage; with Printer do begin BeginDoc; Canvas.Draw((PageWidth - Bmp.Width) div 2, (PageHeight - Bmp.Height) div 2, Bmp); EndDoc; end; finally Bmp.Free; end; end; |
Das klappt aber auch nicht. Was habe ich falsch gemacht?
Heiko - So 01.05.05 10:15
ebs hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| Uses Printers;
procedure TForm1.DruckeBild; var Bmp: TBitmap; begin Bmp:=TBitmap.Create; try tbit:=Tgraph.GetFormImage; with Printer do begin BeginDoc; Canvas.Draw((PageWidth - Bmp.Width) div 2, (PageHeight - Bmp.Height) div 2, Bmp); EndDoc; end finally Bmp.Free; end; end; | |
Also ich sehe auf Anhieb nur einen Fehler. TGraph ist dein Formularname? Wenn nicht liegt dort auch ein Fehler. Der mackierte Teil muss nicht TBit heißen, sondern Bmp! Und was ist überhaupt TBit?
ebs - So 01.05.05 11:09
Ach.. Ich habe einfach nur die Methode aus dem Internet kopiert und mein Tbit mit rein gemacht. Also es gillt TBit:=BMP, und Tgraph ist mein Formular. :D
Heiko - So 01.05.05 11:17
Funktioniert es nun nachdem du tbit-->bmp gemacht hast?
ebs - So 01.05.05 11:29
Nein Leider nicht, aber hier nocheinmal der richtige Text:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| printer.orientation:=polandscape; with Printer do begin BeginDoc; Canvas.Draw((PageWidth - bmp.Width) div 2, (PageHeight - bmp.Height) div 2, bmp); EndDoc; end; bmp.Free; |
ebs - Di 03.05.05 18:21
Hallo!
Ich habe jetzt eine Methode gefunden um mein Formular auszudrucken:
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:
| bmp:=tbitmap.create; bmp:=Tgraph.GetFormImage;
with Printer do begin BeginDoc; try ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch; ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch; RR := Rect(0, 0, bmp.Width*Scalex-900, bmp.Height*scaley-900); Canvas.StretchDraw(RR, bmp); finally EndDoc; end; end; |
Mann kann auch schön die Ränder einstellen, doch ein Problem gibt es noch:
Um das Bitmap ist ein Rahmen, den ich auch gerne haben wollte, doch leider druckt mir der Drucker nur die Linien oberhalb und rechts des Bitmaps aus. Unten und rechts fehlen sie einfach!
Hat einer ne Idee :?:
ebs - Di 03.05.05 20:35
Da hat mir aber die Bild und Fax Anzeige von Microsoft einen Streich gespielt. Das sah immer so aus, als ob da immer ein kompletter Rahmen sei. Aber nun hat sich das Problem nur verlegt. Kann ich bei dem Screenshot des Formular irgendwie den ganzen Rahmen mitkriegen?
Heiko - Mi 04.05.05 17:00
Das dürfte schwieriger sein, denn dann müsstes du ein Screenshot machen. Ich kenne zu mindestens keine andere Variante. Und du musst dafür sorgen, dass dein Formular, von dem der Srennshot gemacht werden soll, kurz im Vordergrund liegt.
ebs - Mo 09.05.05 13:36
Heiko hat folgendes geschrieben: |
Das dürfte schwieriger sein, denn dann müsstes du ein Screenshot machen. Ich kenne zu mindestens keine andere Variante. Und du musst dafür sorgen, dass dein Formular, von dem der Srennshot gemacht werden soll, kurz im Vordergrund liegt. |
Also heißt das. dass es dafür keine wirklich gute Lösung gibt?
Heiko - Mo 09.05.05 17:00
Das es keine gibt will ich nicht sagen. Es heißt nur das ich keine bessere Variante dafür kenne.
ebs - Mo 09.05.05 20:39
Gibt es vieleicht die Möglichkeit garkeinen Rahmen mit zu nehmen, und danach hinterher mit Canvas einen drum zu zeichnen?
Ich sehe nur leider keine Möglichkeit keinen Rahmen zu nehmen :P
Heiko - Di 10.05.05 06:46
Ohne dem Fensterrand bekommst du das FormulatBild mit GetFormImage. Das speicherst du iin einem Bitmap ab und kannst es dann mit Canvas beliebig bearbeiten.
ebs - Di 10.05.05 10:05
Ich mache ja bereits ein Bitmap mit getformimage, da sind ja aber diese nicht vollständigen Ränder. Vieleicht reden wir aneinander vorbei, deswegen hier ein Bild:
http://www.waltrop.dlrg.de/T.bmp
Diese Ränder stören mich. :D
Danke :wink:
Heiko - Di 10.05.05 15:17
Aso die sinfd immer da bei dem Befehl bei dir da. Bei D6 ist das nicht. Wie groß war dein Formularfenster bei diesem Bild (ClientWidt, ClientHeight)? Wenn du es nicht mehr weißt mach das Bild nochmal und schreib mal die Fensterbreite/-höhe und die Größe von Bild. Bild brauchst du nicht nocheinmal reinstellen.
ebs - Di 10.05.05 17:11
Ich habe das ganze mal mit sowohl leeren Formularen, als auch mit gefüllten Formularen getestet, und auch noch mit anderen größen, doch es sind immer Ränder da! :twisted:
Heiko - Di 10.05.05 18:39
Und stimmen die Maße überein? Also ClienWidth=Bild_Breite und ClientHeight=Bild_Höhe.
ebs - Di 10.05.05 20:16
Also ich habe hier mal die Zahlen:
Formular: 1280 x 1005
Bild: 1280 x 1005 :D
8) Klar-Ist beides das Gleiche
Heiko - Mi 11.05.05 16:00
Das sagt einiges aus. Es müsste ganz rechts und unte beim Formular eine Pixelreihe je Fehlen, da ja ein schwarze Reihe oben mehr ist. Kannst du das mal Überprüfen ob wirklich die Pixelreihehn nicht kopiert werden oder ob nur die obere und rechte Pixelreihe nur schwarz gespeichert wird?
ebs - Mi 11.05.05 17:15
Eine vielicht es dumme Frage :wink: aber wie kann ich das machen :wink:
Heiko - Mi 11.05.05 17:35
Leg einfach einen Button direkt an den unteren und linken Rand, so dass kein Pixel abstand mehr zum Rand des Fensters ist. Der Rand eines Buttons ist normlaerweise 2 Pixel breit. Es müsste ein Pixel rechts oder unten fehelen.
ebs - Mi 11.05.05 18:10
Ne.. Der Button ist komplett sichtbar. Ich habe sowieso ein Label direkt unten rechts, und davon wird auch nichts abgeschnitten.
Heiko - Mi 11.05.05 18:53
Naja beim Label gibt es ja einen "transparenten" Bereich wo es nicht auffallen würde wenn etwas fehlt. Ich mache mal morgen ein Progr. wo du mir mal den Screenshot gibst.
ebs - Fr 13.05.05 15:27
Hy, Klasse :o Vielen Dank Heiko!
ebs - So 15.05.05 10:12
Also ich breche das dann mal ab. Wenn das mit neueren Versionen gehen soll. Ich wollte mir jetzt auch Delphi 2005 kaufen.
Heiko - So 15.05.05 10:23
Ist sicherlich das Beste. Bei D6 funzt es schon so wie es soll :wink: . D3 Prof. haben wir auf dem alten Rechner, werde es vllt. dort mal ausprobieren.
Heiko - Sa 25.06.05 16:09
Ich habe gerade mitbekomme das du jetzt D2k5 PE hast. Bist du das Problem jetzt los?
ebs - Sa 25.06.05 16:11
Ich bin das Problem los! :D :D 8)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!