Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komplettes Formular ausdrucken? (https://www.delphipraxis.net/102630-komplettes-formular-ausdrucken.html)

Progman 1. Nov 2007 15:15

Re: Komplettes Formular ausdrucken?
 
als Anregung hier ne Procedure, mit der ein RichEdit, das ein Bild enthält, gedruckt wurde:
Delphi-Quellcode:
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;
Die wird in der Form zwar nicht funktionieren, weil Vars und andere Proceduren fehlen, aber vielleicht kann man das ja umbauen ;)

Borschti 1. Nov 2007 15:38

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 ;)

Borschti 2. Nov 2007 09:10

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:
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;
Danke schonmal im Vorraus.

Deep-Sea 2. Nov 2007 09:17

Re: Komplettes Formular ausdrucken?
 
Zitat:

Zitat von Borschti
Delphi-Quellcode:
  [...]
     with Printer do begin
      BeginDoc;
      Canvas.Draw((PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height) div 2, Bitmap);
      EndDoc;
    end;
  [...]

Ich sehe dort kein StretchDraw :P

Borschti 2. Nov 2007 09:29

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:

Borschti 2. Nov 2007 09:35

Re: Komplettes Formular ausdrucken?
 
Jetzt habe ich es umgestellt, es geht aber immernoch nicht...

Delphi-Quellcode:
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;
:cry:

Deep-Sea 2. Nov 2007 09:41

Re: Komplettes Formular ausdrucken?
 
Zitat:

Zitat von Borschti
Delphi-Quellcode:
Self.Canvas.StretchDraw(Rect(0, 0, 375, 518), Bitmap); // Self ist hier = Form1
Canvas.Draw((PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height) div 2, Bitmap);

Du zeichnet das Bild immer noch nur auf die Form mittels StretchDraw, auf den Drucker weiterhin mit Draw ...

Borschti 2. Nov 2007 10:53

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:
Canvas.StretchDraw(Rect(-375, -518,(PageWidth - Bitmap.Width) div 2, (PageHeight - Bitmap.Height) div 2), Bitmap);
(Frag mich nicht warum ich mit einer negativen Pixel anzahl einen größeren Ausdruck erziele :wall: )

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 :/

Deep-Sea 2. Nov 2007 12:31

Re: Komplettes Formular ausdrucken?
 
Zitat:

Zitat von Borschti
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 :/

Die obere linke Ecke eines Canvas ist X = 0, Y = 0. -375 und -518 liegen somit logischerweise zuweit links und zuweit oben.

Delphi-Quellcode:
Printer.Canvas.StretchDraw(Rect(0, 0, PageWidth, PageHeight), Bitmap);
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 ^^)

Borschti 2. Nov 2007 14:26

Re: Komplettes Formular ausdrucken?
 
Danke, damit kann ich was anfangen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz