![]() |
Komplettes Formular ausdrucken?
Hallo erstmal,
also wie der Threadname, sagt versuche ich (schon seit längerem) mein Komplettes Delphi Formular auszudrucken, allerdings vergebens. Beim stöbern in Google ist mir ein schon etwas älterer Thread aufgefallen in dem jemand ein Problem mit dem ausdrucken einer RichEdit Komponente hat. Hier mal der Link: ![]() Ich habe also versucht den Lösungsvorschlag von einem Poster auf eine Edit Komponente anzuwenden (mein Formular besthet nur aus Labels, Editfeldern, Buttons, einem MainMenu und einer ComboBox)
Delphi-Quellcode:
Also dies habe ich dann mal ausprobiert und es hat nicht geklappt, ich denke ich muss etwas im uses Teil einbinden weiß aber nicht was, kann mir da vielleicht jemand kurz aushelfen?
procedure TForm1.Button1Click(Sender: TObject);
begin RichEdit1.Print(RichEdit1.Lines.Text); end; Und ich habe gleich noch eine Frage, kann ich diesen Quelltext ausschnitt auf alle meine Komponenten anwenden oder gibts da vielleicht viel übersichtlichere und einfacherere Möglichkeiten mit Delphi 7? Schonmal Danke im vorraus. mfg. |
Re: Komplettes Formular ausdrucken?
Die Function GetFormImage liefert ein Bitmap deines Forms. Das sollte dann die Grundlage zum Ausdrucken werden. Zu "ein Bitmap drucken" findest du sicher einiges beim Suchen. ;)
|
Re: Komplettes Formular ausdrucken?
Danke werd gleich mal loslegen :)
|
Re: Komplettes Formular ausdrucken?
Hat geklappt danke erstmal ;)
Aber ein winzig kleines Problem ist noch vorhanden und zwar ist das Bild auf dem papier wirklich sehr klein, wie kann ich denn die Größe des Ausdruckes Einstellen? Hab da zwar schon eine Vermutung aber ich weiß nicht wie die Eingabe dann aussehen muss :( |
Re: Komplettes Formular ausdrucken?
|
Re: Komplettes Formular ausdrucken?
Hmm erstmal danke für deine Antwort aber bei der Procedure in dem Link wird nur direkt in das Bild reingezoomt, ich suche etwas damit ich das Bild, welches ausgedruckt wird, größer machen kann weil z.Z. ist dies nur ca 32x32 Pixel groß :/
|
Re: Komplettes Formular ausdrucken?
Zitat:
Anstatt der Funktion "SetCanvasZoomFactor" ein Bitmap-Canvas zu übergeben, kannst du ihr auch Printer.Canvas übergeben ;) Ich drucke so (wenn auch nicht mit der Funktion sondern eine selbst geschriebenen) auch Delphi-Objekte aus, und zwar immer 100% Blattgröße (wenn die Seitenverhältnisse stimmen) ... :-D |
Re: Komplettes Formular ausdrucken?
Nein meine Form ist 375x518 Pixel groß aber er druckt sie aus welchem Grund auch immer so winzig aus :cry:
|
Re: Komplettes Formular ausdrucken?
Stichwort: StretchDraw und Printer.canvas.
Nur genauere Codebeispiele find ich jetzt hier nicht, eben mal suchen ;) |
Re: Komplettes Formular ausdrucken?
Zitat:
StretchDraw, wie Progman sagt, wäre für dich vlt. doch besser als meine Lösung ^^ Dafür ist StretchDraw bei Text sehr schrecklich, während SetMapMode & Co. perfekte Ergebnisse liefern, da es dann keine vergrößerten Rastergrafiken sind ... |
Re: Komplettes Formular ausdrucken?
als Anregung hier ne Procedure, mit der ein RichEdit, das ein Bild enthält, gedruckt wurde:
Delphi-Quellcode:
Die wird in der Form zwar nicht funktionieren, weil Vars und andere Proceduren fehlen, aber vielleicht kann man das ja umbauen ;)
procedure TfrmPrintPreview.BtnPrintClick(Sender: TObject);
const A4_width=210; A4_height=297; A5_width=148; A5_height=210; var offset_x, offset_y: integer; dpi_x, dpi_y: integer; rc: TRect; rgn: HRGN; off_x, off_y: integer; b: TBitmap; Info : PBitmapInfo; InfoSize : DWORD; Image : Pointer; ImageSize : DWORD; Bits : HBITMAP; begin dpi_X := GetDeviceCaps(Printer.Handle, LOGPIXELSX); dpi_Y := GetDeviceCaps(Printer.Handle, LOGPIXELSY); off_X := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX); off_Y := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY); // assume A4 as default format // get offset for a5 printing offset_x:=(A4_width-A5_width) div 2; offset_y:=(A4_height-A5_height) div 2; Printer.Title:='Schreibwerkstatt'; Printer.BeginDoc; if (RahmenFileName<>'') then begin // draw frame if selected ( this complex code is needed as using StretchDraw() does not work on all printers, e.g. Acrobat) b := tbitmap.create; b.loadfromfile(RahmenFileName); // assume frame were created using 100dpi // todo: adjust by off_x, off_y? rc:=Rect((Printer.PageWidth-b.width*dpi_x div 100) div 2, (Printer.PageHeight-b.height*dpi_y div 100) div 2, (Printer.PageWidth-b.width*dpi_x div 100) div 2+b.width*dpi_x div 100, (Printer.PageHeight-b.height*dpi_y div 100) div 2+b.Height*dpi_y div 100); Bits := b.Handle; // bmp is passed as a parameter GetDIBSizes(Bits, InfoSize, ImageSize); Info := AllocMem(InfoSize); try Image := AllocMem(ImageSize); try GetDIB(Bits, 0, Info^, Image^); StretchDIBits(Printer.Canvas.Handle, rc.left, rc.top, rc.Right-rc.left, rc.Bottom-rc.top, 0, 0, b.Width, b.Height, Image, Info^, DIB_RGB_COLORS, SRCCOPY); finally FreeMem(Image, ImageSize); end; finally FreeMem(Info, InfoSize); end; b.free; end; rc:=Rect(round(offset_x/25.4*dpi_x)-off_x, round(offset_y/25.4*dpi_y)-off_y, round((offset_x+A5_width)/25.4*dpi_x)-off_x, round((offset_y+A5_height)/25.4*dpi_y)-off_y+dpi_y); // FEHLER: das Rendern des RichEdits auf das Device des Druckers funktioniert // nicht korrekt, der Parameter Bottom wird nicht korrekt verwendet // daher wird hier von Hand der gültige Zeichenbereich festgelegt rgn:=CreateRectRgn(rc.left, rc.top, rc.Right, rc.Bottom); // SelectClipRgn(Printer.Canvas.Handle, rgn); RichEditToCanvas(FrmSWMain.RE, Printer.Canvas, dpi_x, dpi_y, rc); Printer.EndDoc; close; end; |
Re: Komplettes Formular ausdrucken?
Danke da muss ich mich erstmal durchackern, danke für das Beispiel ich werd später bestimmt noch ein paar fragen dazu haben ;)
|
Re: Komplettes Formular ausdrucken?
Hallo mal wieder und guten Morgen,
ich bin jetzt soweit das ich Self.Canvas.StretchDraw in meinen Quelltext Integriert habe, allerdings bewirkt es nichst :/ Ich weiß nicht was ich falsch mache, vielleicht gebe ich die Werte in der Anweisung falsch ein oder habe die Anweisung an einer Komplett falschen Stelle Geschrieben, vielleicht fehlt auch einfach nur eine weitere Anweisung die ich übersehen habe... Hier mal mein Quelltext, ein kleiner Hinweis darauf wo drann es liegen könnte wäre echt super :roll:
Delphi-Quellcode:
Danke schonmal im Vorraus.
procedure TForm1.Drucken1Click(Sender: TObject);
begin if PrintDialog1.execute then Bitmap := GetFormImage; try Clipboard.Assign(Bitmap); Self.Canvas.StretchDraw(Rect(0, 0, 375, 518), Bitmap); with Printer do begin BeginDoc; Canvas.Draw((PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height) div 2, Bitmap); EndDoc; end; finally Bitmap.Free; end; end; |
Re: Komplettes Formular ausdrucken?
Zitat:
|
Re: Komplettes Formular ausdrucken?
Oh...hab gedacht das muss in den try Abschnitt :?
Kannst du vielleicht auch noch kurz schreiben wieso das da unten rein muss? Wäre echt nett, ich komm da nämlich gerade nicht dahinter warum es unten rein muss :shock: |
Re: Komplettes Formular ausdrucken?
Jetzt habe ich es umgestellt, es geht aber immernoch nicht...
Delphi-Quellcode:
:cry:
procedure TForm1.Drucken1Click(Sender: TObject);
begin if PrintDialog1.execute then Bitmap := GetFormImage; try Clipboard.Assign(Bitmap); with Printer do begin BeginDoc; Self.Canvas.StretchDraw(Rect(0, 0, 375, 518), Bitmap); Canvas.Draw((PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height) div 2, Bitmap); EndDoc; end; finally Bitmap.Free; end; end; |
Re: Komplettes Formular ausdrucken?
Zitat:
|
Re: Komplettes Formular ausdrucken?
Ah, jetzt versteh ich die Anweisung erst richtig ~~
Also steckt in Canvas.StretchDraw, Canvas.Draw gleich mit drinne (wenn ich das richtig interpretiert habe müssten dann die letzten beiden Felder zwischen den Kommas sein welche dann die Position des Objektes auf dem Papier bestimmen, oder etwa doch nicht?) Die Felder zwischen den ersten beiden Kommas müssten die größe des Objektes auf dem Blatt angeben, oder? Also meine Canvas.StretchDraw Anweisung sieht jetzt so aus:
Delphi-Quellcode:
(Frag mich nicht warum ich mit einer negativen Pixel anzahl einen größeren Ausdruck erziele :wall: )
Canvas.StretchDraw(Rect(-375, -518,(PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height) div 2), Bitmap);
Mit Canvas.Draw hat (PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height) div 2) funktioniert um den Ausdruck in der Mitte zu Zentrieren aber mit Canvas.StretchDraw geht das irgendwie nicht mehr, er druckt es links oben auf dem Blatt und auch über das Blatt hinaus. Kann es vielleicht auch sein das ich [-375, -518] mit [PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height] vertauscht habe? Aber dies glaube ich eher nicht, hatte das schon ausprobiert und es kamen einige Fehlermeldungen dabei heraus :/ |
Re: Komplettes Formular ausdrucken?
Zitat:
Delphi-Quellcode:
Dies sollte die Bitmap komplett auf das Papier bringen. Die Seitenverhältnisse werden jedoch so nicht beibehalten und auch evtl. Ränder werden nicht berücksichtigt ... (alles Theorie ^^)
Printer.Canvas.StretchDraw(Rect(0, 0, PageWidth, PageHeight), Bitmap);
|
Re: Komplettes Formular ausdrucken?
Danke, damit kann ich was anfangen ;)
|
Re: Komplettes Formular ausdrucken?
War ich also doch auf dem falschen Weg...hab die Eingaben miteinander Vertauscht :oops:
Nun eine letzte Frage habe ich doch noch zu dem Thema, und zwar wie weit die X und Y Achsen bei Canvas gehen...genauer gesagt will ich damit versuchen das Bild auf dem Ausdruck zu Zentrieren o. gibts da vielleicht sogar eine direkte Anweisung? |
Re: Komplettes Formular ausdrucken?
Zitat:
|
Re: Komplettes Formular ausdrucken?
Danke, sorry das ich jetzt erst zurückschreibe, hatte keinen PC übers Wochenende.
Ich habe deinen mal nach den Befehlen gegoogelt und bin auf folgendes (als einzig sinnvolles) Ergebnis gekommen:
Delphi-Quellcode:
Also, WENN ich das jetz endlich richtig verstanden habe (wovon ich ausgehe...) sind die ersten 2 Parameter da, um anzugeben welche Position der Ausdruck auf dem Blatt haben soll und die letzten zwei dazu da um die letztendliche größe auf dem Papier zu bestimmten.
Printer.Canvas.StretchDraw(Rect((Printer.PageWidth - Bitmap.Width) div 2, (Printer.PageHeight - Bitmap.Height) div 2, Bitmap.Width*10, Bitmap.Height*8), Bitmap);
Aber wieso verzehrt dann das Gesamte Druckbild wenn ich
Delphi-Quellcode:
anstelle von (0, 0, ...) einfüge, wenn ich nämlich mit der zweiten Variante mein Programm starte und das Formular ausdrucke ist das Druckbild vollkommen normal.
(Printer.PageWidth - Bitmap.Width) div 2, (Printer.PageHeight - Bitmap.Height) div 2, ...)
Aber die erste Variante ist meines erachtens nicht verkehrt... :shock: Was ist da bloß falsch...ich habe schon alle möglichen Varationen versucht aber der Ausdruck ist trotzdem nicht Zentriert :wall: |
Re: Komplettes Formular ausdrucken?
Zitat:
|
Re: Komplettes Formular ausdrucken?
Ah ok...das erklärt natürlich einiges :/
|
Re: Komplettes Formular ausdrucken?
Hallo mal wieder :-D
nachdem ich mich mit StretchDraw mm für mm vorgetastet hatte und trotzdem keinen Schritt näher an mein Ziel gekommen bin das der Ausdruck auf dem Papier Zentriert ist versuche ich nun die Bitmap vorher zu vergrößern und dann mit Draw den Ausdruck zu Zentrieren, dies hat aber nur halbwegs geklappt denn der Ausdruck ist jetzt zwar Zentriert und die Druckfläche an sich entspricht auch meinen Vorstellungen aber das Formular an sich ist nur ganz klein links oben in der Ecke abgebildet... Hier mal eine kleine Abbildung so wie es aussieht (hab hier leider keinen Scanner...): ![]() Und hier auch der entsprechende Code Ausschnitt:
Delphi-Quellcode:
Ich habe keine Ahnung wo dran das Liegen könnte, kennt das Problem vielleicht jemand oder weiß eine Lösung :?:
procedure TForm1.Drucken1Click(Sender: TObject);
begin if PrintDialog1.execute then Bitmap := GetFormImage; try Clipboard.Assign(Bitmap); Bitmap.Height := Bitmap.Height * 7; //hier wird die größe verändert Bitmap.Width := Bitmap.Width * 8; //hier auch with Printer do begin BeginDoc; Printer.Canvas.Draw((PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height) div 2, Bitmap); // und hier wird der Ausdruck dann Zentriert EndDoc; end; finally Bitmap.Free; end; end; |
Re: Komplettes Formular ausdrucken?
Zitat:
|
Re: Komplettes Formular ausdrucken?
Hmm ja, soweit war ich auch aber wenn ich bei google oder in verschiedenen Tutorials suche finde ich keine wirklich hilfreiche Antwort.
Nur wie kann ich jetzt die vom Formular erstellte Bitmap da anpassen, ich hab gedacht das geht mit
Delphi-Quellcode:
Da ja hier die größe des von mir erstellten Bitmaps verändert wird oder?
Bitmap.Height := Bitmap.Height * 7;
Bitmap.Width := Bitmap.Width * 8; Also hat da vielleicht jemand einen Ansatz wie das Problem behoben werden kann? mfg Borschti |
Re: Komplettes Formular ausdrucken?
![]() Aber was denkst du, was die Funktion vom Link nutzt? Richtig! StretchDraw :wink: |
Re: Komplettes Formular ausdrucken?
An dieser Stelle nochmal vielen Dank für deine Hilfe und die Geduld die du mit dir gebracht hast ;)
Also ich habe jetzt eine andere Lösung gefunden und zwar ein paar recht simple Rechnungen, hier mal meine Lösung falls es jemanden Interessiert bzw. mal jemand das gleiche Problem haben sollte:
Delphi-Quellcode:
Ich habe einfach das Blatt in gleiche große Teile aufgeteilt und hatte somit nichtmehr das Problem mit den Pixeln, je nach Form eures Formulars solltet ihr die Parameter verändern, sonst könnte euer Formular ziemlich verzehrt aussehn :roll:
Printer.Canvas.StretchDraw(Rect( 100, (PageHeight div 4)*(3 div 2), PageWidth - 100, (PageHeight div 4)*3 ), Bitmap);
|
Re: Komplettes Formular ausdrucken?
Kurze frage: Warum wird nicht die Funktion die TForm schon dabei ist genutzt:?:
Delphi-Quellcode:
???
form1.print;
Gruß Christian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz