AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komplettes Formular ausdrucken?

Ein Thema von Borschti · begonnen am 1. Nov 2007 · letzter Beitrag vom 18. Feb 2008
Antwort Antwort
Seite 2 von 4     12 34      
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#11

Re: Komplettes Formular ausdrucken?

  Alt 1. Nov 2007, 16:15
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
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Komplettes Formular ausdrucken?

  Alt 1. Nov 2007, 16:38
Danke da muss ich mich erstmal durchackern, danke für das Beispiel ich werd später bestimmt noch ein paar fragen dazu haben
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Komplettes Formular ausdrucken?

  Alt 2. Nov 2007, 10:10
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#14

Re: Komplettes Formular ausdrucken?

  Alt 2. Nov 2007, 10:17
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
Chris
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Komplettes Formular ausdrucken?

  Alt 2. Nov 2007, 10:29
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
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Komplettes Formular ausdrucken?

  Alt 2. Nov 2007, 10:35
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;
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#17

Re: Komplettes Formular ausdrucken?

  Alt 2. Nov 2007, 10:41
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 ...
Chris
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Komplettes Formular ausdrucken?

  Alt 2. Nov 2007, 11:53
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:

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 )

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 :/
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#19

Re: Komplettes Formular ausdrucken?

  Alt 2. Nov 2007, 13:31
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.

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 ^^)
Chris
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#20

Re: Komplettes Formular ausdrucken?

  Alt 2. Nov 2007, 15:26
Danke, damit kann ich was anfangen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.
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