Delphi-PRAXiS

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)

Borschti 1. Nov 2007 11:30


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: http://www.delphipraxis.net/internal...ect.php?t=7312

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.Print(RichEdit1.Lines.Text);
end;
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?

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.

Progman 1. Nov 2007 11:54

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

Borschti 1. Nov 2007 11:57

Re: Komplettes Formular ausdrucken?
 
Danke werd gleich mal loslegen :)

Borschti 1. Nov 2007 13:04

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

Deep-Sea 1. Nov 2007 13:06

Re: Komplettes Formular ausdrucken?
 
http://www.swissdelphicenter.ch/de/showcode.php?id=968

Borschti 1. Nov 2007 14:44

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

Deep-Sea 1. Nov 2007 14:47

Re: Komplettes Formular ausdrucken?
 
Zitat:

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

Deine ganze Form ist nur 32x32 Pixel groß?
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

Borschti 1. Nov 2007 14:53

Re: Komplettes Formular ausdrucken?
 
Nein meine Form ist 375x518 Pixel groß aber er druckt sie aus welchem Grund auch immer so winzig aus :cry:

Progman 1. Nov 2007 14:56

Re: Komplettes Formular ausdrucken?
 
Stichwort: StretchDraw und Printer.canvas.
Nur genauere Codebeispiele find ich jetzt hier nicht, eben mal suchen ;)

Deep-Sea 1. Nov 2007 15:03

Re: Komplettes Formular ausdrucken?
 
Zitat:

Zitat von Borschti
Nein meine Form ist 375x518 Pixel groß aber er druckt sie aus welchem Grund auch immer so winzig aus :cry:

Das liegt an der Auflösung ;) Also ist dein Ausdruck trotzdem 375x518 Pixel groß.
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 ...

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

Borschti 2. Nov 2007 14:54

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?

Deep-Sea 5. Nov 2007 07:24

Re: Komplettes Formular ausdrucken?
 
Zitat:

Zitat von Borschti
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?

In dem Fall helfen dir Printer.PageWidth und Printer.PageHeight :wink:

Borschti 5. Nov 2007 14:17

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:
Printer.Canvas.StretchDraw(Rect((Printer.PageWidth - Bitmap.Width) div 2, (Printer.PageHeight - Bitmap.Height) div 2, Bitmap.Width*10, Bitmap.Height*8), Bitmap);
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.

Aber wieso verzehrt dann das Gesamte Druckbild wenn ich
Delphi-Quellcode:
 (Printer.PageWidth - Bitmap.Width) div 2, (Printer.PageHeight - Bitmap.Height) div 2, ...)
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.
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:

Deep-Sea 5. Nov 2007 14:41

Re: Komplettes Formular ausdrucken?
 
Zitat:

Zitat von Borschti
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.

Net ganz. Die ersten beiden (Left und Top) geben an, wo die obere linke Ecke hin soll, richtig. Aber die anderen beiden (Right und Bottom) geben nicht die Größe an, sondern die untere Rechte Ecke. Sprich Rect(10, 10, 9, 9) wäre nicht 9 Pixel groß, sondern nur einen.

Borschti 6. Nov 2007 07:46

Re: Komplettes Formular ausdrucken?
 
Ah ok...das erklärt natürlich einiges :/

Borschti 7. Nov 2007 15:02

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...):
http://foto.arcor-online.net/palb/al...6632336263.jpg


Und hier auch der entsprechende Code Ausschnitt:

Delphi-Quellcode:
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;
Ich habe keine Ahnung wo dran das Liegen könnte, kennt das Problem vielleicht jemand oder weiß eine Lösung :?:

Deep-Sea 7. Nov 2007 15:11

Re: Komplettes Formular ausdrucken?
 
Zitat:

Zitat von Borschti
Delphi-Quellcode:
[...]
      Bitmap.Height := Bitmap.Height * 7; //hier wird die größe verändert
      Bitmap.Width := Bitmap.Width * 8; //hier auch
[...]

Ich bin mir nicht sicher, aber ich glaube, dass du zwar die Bitmap an sich größer machst, aber das Bild in ihr vergrößert sich deswegen nicht.

Borschti 8. Nov 2007 08:10

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:
Bitmap.Height := Bitmap.Height * 7;
Bitmap.Width := Bitmap.Width * 8;
Da ja hier die größe des von mir erstellten Bitmaps verändert wird oder?

Also hat da vielleicht jemand einen Ansatz wie das Problem behoben werden kann?

mfg
Borschti

Deep-Sea 8. Nov 2007 08:15

Re: Komplettes Formular ausdrucken?
 
http://www.swissdelphicenter.ch/de/showcode.php?id=1806

Aber was denkst du, was die Funktion vom Link nutzt? Richtig! StretchDraw :wink:

Borschti 12. Nov 2007 15:05

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:
Printer.Canvas.StretchDraw(Rect( 100, (PageHeight div 4)*(3 div 2), PageWidth - 100, (PageHeight div 4)*3 ), Bitmap);
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:

SlaterBenelli 18. Feb 2008 11:58

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