![]() |
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 ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 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