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 Drucken (https://www.delphipraxis.net/628-drucken.html)

CalganX 15. Aug 2002 13:48


Drucken
 
So, jetzt habe ich ein kleines Problem (Was sonst...):
Ich versuche eine Seite ausdem Drucker auszugeben. Das Problem dabei ist, dass nicht einfach ein Memo ausgedruckt werden soll, sondern auch noch andere Sachen. Es soll oben ein Header stehen (z.B. "Ausdruck aus meinem Programm" (zentriert)). Dann soll rechtsbündig ein Datum stehen und dann ein Trennstrich. Dann soll das eigentlich kommen. Titel + Dazugehöriger Text.
Es würde mir schon reichen, wenn mir jemand sagt, wie man eine Canvasfläche druckt (die könnte ich dann beliebig bearbeiten)...

Ich sag nur: HILFE, ich bin am verzweifeln

Chris

RomanK 15. Aug 2002 14:14

Der Drucker hat eine Eigenschaft printer.canvas
und dann musst du noch die Unit Printers einbinden!
Code:
printer.BeginDoc;
printer.canvas.textout(300,100,'Jan');
printer.EndDoc;

CalganX 15. Aug 2002 14:30

Danke, aber noch eine Fragen:
Wie groß ist die Canvasfläche?

Chris

Daniel 15. Aug 2002 14:38

@Chakotay:
Da würde ein Blick in die Delphi-Hilfe helfen. Das Objekt TPrinter bringt die Eigenschaften "PageWidth" und "PageHeight" mit, die genau die von Dir gewünschten Informationen liefern. :mrgreen:

Grüße,
Daniel

CalganX 15. Aug 2002 16:04

Hi!
So, jetzt läuft es mit dem drucken. Aber nur bei mir. Auf anderen Rechnern, da druckt er alles viel zu nah. Liegt das an der Auflösung? Hat jemand eine Ahnung, wie man das ändern kann?

Chris

CalganX 17. Aug 2002 11:15

So, folgendes Problem: Wenn ich auf meinem Rechner drucken will, dann klappt das auch alles Wunderbar. Wenn ich aber auf einem anderen Drucker/Rechner (gleiche Auflösung) drucken will, sind alle Texte zu nah aneinander bzw. die Rechtecke sind zu klein, dass der Text nicht mehr reinpasst (selbst wenn die Texte viel nah sind).
Ich habe mal was von QReport gehört, aber das ist ja eine ganz "normaler" Komponente, die sichtbar ist...

Hat jemand eine Lösung?

Chris

Daniel B 17. Aug 2002 11:39

Mir ist nicht so ganz klar wie das aussieht. Kannst du mal ein Screenshot machen? Und vielleicht mal eine Konsolenschriftart einstellen. Oder versteh ich das jetzt irgendwie falsch?

CalganX 17. Aug 2002 12:16

Liste der Anhänge anzeigen (Anzahl: 2)
Im Anhang findest du beide Ausdrucke. Ich glaube, du hast etwas falsch verstanden: beim Ausgedruckten ist was falsch.

Chris

PS: Das mit der Farbe liegt am Druckertyp...

Christian Seehase 17. Aug 2002 13:15

Moin Chris,

da der Fehler ja offensichtlich im Zeilenvorschub begründet ist:
Wie errechnest Du den Beginn der nächsten Zeile, bzw. des Rechtecks?
Und wie sieht das ganze auf den Rechnern aus, wenn Du statt auf den Printer.Canvas auf ein Form.Canvas "druckst"?

CalganX 17. Aug 2002 13:35

Hier mal der komplette Sourcecode...
@Christian: Sieht bei mir aus, wie gedruckt.
Am besten, sagt ihr mir anhand des Sourcecodes, was falsch ist...

Code:
[b]procedure[/b] TForm1.drucken1Click(Sender: TObject);
[b]var[/b]
  i, j: integer;
[b]begin[/b]
  [b]if[/b] PrintDialog1.Execute [b]then[/b] [b]begin[/b]
    Printer.Copies := PrintDialog1.Copies;
    Printer.BeginDoc;
    [b]with[/b] Printer [b]do[/b] [b]begin[/b]
      Canvas.Rectangle([color=#0055FF]100[/color], [color=#0055FF]100[/color], Printer.PageWidth - [color=#0055FF]100[/color], [color=#0055FF]300[/color]);

      Canvas.Font.Size := [color=#0055FF]14[/color];
      Canvas.Font.Name := [color=#0055FF]'Courier New'[/color];
      Canvas.Font.Style := [fsBold];
      Canvas.Font.Color := clBlue;
      CenterText([color=#0055FF]'Ausdruck aus RememberIt!'[/color], [color=#0055FF]110[/color]);

      Canvas.Font.Size := [color=#0055FF]13[/color];
      Canvas.Font.Style := [fsBold, fsItalic];
      Canvas.Font.Color := clBlack;
      CenterText(DateTimeToStr(Now), [color=#0055FF]190[/color]);

      [i][color=#000080]{ end headerinformations }[/color][/i]


      Canvas.Font.Size := [color=#0055FF]9[/color];
      Canvas.Font.Name := [color=#0055FF]'Courier New'[/color];
      Canvas.Font.Style := [fsItalic];
      Canvas.Font.Color := clBlack;
      CenterText([color=#0055FF]'Seite '[/color] + IntToStr(Printer.PageNumber), Printer.PageHeight - [color=#0055FF]50[/color]);

      Canvas.Font.Size := [color=#0055FF]12[/color];
      Canvas.Font.Name := [color=#0055FF]'Arial'[/color];
      Canvas.Font.Style := [fsBold];
      Canvas.Font.Color := clBlack;
      Canvas.TextOut([color=#0055FF]100[/color], [color=#0055FF]350[/color], ListBox1.Items[ListBox1.ItemIndex]);

      Canvas.Font.Size := [color=#0055FF]10[/color];
      Canvas.Font.Name := [color=#0055FF]'Arial'[/color];
      Canvas.Font.Style := [];
      Canvas.Font.Color := clBlack;
      j := [color=#0055FF]420[/color];
      [b]for[/b] i:=[color=#0055FF]0[/color] [b]to[/b] Memo1.Lines.Count -[color=#0055FF]1[/color] [b]do[/b] [b]begin[/b]
        [b]if[/b] i*(Canvas.TextHeight(Memo1.Lines[ i ])) = (PageHeight - [color=#0055FF]70[/color]) [b]then[/b] [b]begin[/b]
          [color=#000080][i]{ Hier gibt es noch ein Problem: Da macht er keine neue Seite...}[/i][/color]
          Printer.NewPage;
          j := [color=#0055FF]100[/color];
        [b]end[/b];
        Canvas.TextOut([color=#0055FF]200[/color], j + (i*[color=#0055FF]50[/color]), Memo1.Lines[ i ]);
      [b]end[/b];

      [color=#000080][i]{ end rememberinformations }[/i][/color]
    [b]end[/b];
    Printer.EndDoc;
  [b]end[/b];
[b]end[/b];
Chris

jbg 17. Aug 2002 17:33

Man sollte auch nicht in Pixel drucken, da 100 Pixel auf einem 150dpi Drucker größer als auf einem 600dpi Drucker sind. Man kann Windows jedoch beibringen, in 1/10 mm zu drucken und dass gilt dann für jeden Drucker.
Code:
Printer.BeginDoc;
SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); [i]// 1/10 mm[/i]

Printer.Canvas.Font.Height := 50; [i]// 5 Millimeter

// Seitengröße in 1/10 mm ermitteln[/i]
PageWidth := GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE) * 10;
PageHeight := GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE) * 10;

[b]with[/b] Printer.Canvas [b]do[/b]
[b]begin[/b]
  TextOut(100, -100, 'Hier ist 1cm/1cm');
[b]end[/b];
Printer.EndDoc;
Alle Y-Koordinaten werden dabei negativ abgetragen.

CalganX 17. Aug 2002 18:56

Erstmal danke...
Ich blicke durch den Aufbau noch nicht durch, was ist das jetzt, und wie kann ich das ganze ändern??

Chris

CalganX 17. Aug 2002 19:05

Ok, habs jetzt herausgefunden. Noch eine Frage: Ich habe im Source mit { Hier gibt es noch ein Problem: Da macht er keine neue Seite...} gekennzeichnet. Habt ihr eine Idee, wie man das machen kann, dass wenn er unten angelangt ist, dass er dann automatisch eine neue Seite anfängt?

Chris

RomanK 17. Aug 2002 19:08

Dass du den Druckauftrag mit
Code:
Printer.EndDoc;
beendest und dann neu anfängst!

Luckie 17. Aug 2002 19:49

Was soll der Blödsinn mit einem neuem Druck-Job? Man kann auch ganz normal eine neue Seite anfangen, in dem man es ihm sagt.

RomanK 17. Aug 2002 20:08

Ja aber des geht ja anscheinend nicht :shock:

jbg 17. Aug 2002 21:34

Zitat:

if i*(Canvas.TextHeight(Memo1.Lines[ i ])) = (PageHeight - 70) then begin
Bist du dir da ganz sicher, dass der linke Teil immer genau den rechten Teil ergeben kann? Versuch es mal mit >= .

CalganX 18. Aug 2002 07:50

OK, jetzt müsste es funktionieren. Um nochmal zu dieser Auflösungssache zu kommen: wie ändere ich jetzt was. Hab' mal was geändert an den Zahlen, da tat sich aber nix...

Chris

jbg 18. Aug 2002 09:48

Was hast du denn geändert? Eine Änderung um 10 bedeutet 1 mm. Eine Erhöhung um 100 entspricht somit 1 cm.

CalganX 18. Aug 2002 09:54

Ich habe die Zeile
Code:
  Printer.Canvas.Font.Height := 50; // 5 Millimeter
geändert. Erst nachdem ich dann die Zeile in
Code:
  Printer.Canvas.Font.Height := 5;
geändert habe, gab es eine minimale Veränderung. Ich muss es aber noch ein wenig kleiner haben...

Chris

PS: Muss man vielleicht ersteinmal neustarten, oder was?

CalganX 18. Aug 2002 10:03

Nochmal zu dem "neue Seite": Die Zeile lautet derzeit:
Code:
  j := [color=#0055FF]420[/color];
  [b]for[/b] i:=[color=#0055FF]0[/color] [b]to[/b] Memo1.Lines.Count -[color=#0055FF]1[/color] [b]do[/b] [b]begin[/b]
    [b]if[/b] i*(Printer.Canvas.TextHeight(Memo1.Lines[ i ])) >= (PageHeight - [color=#0055FF]70[/color]) [b]then[/b] [b]begin[/b]
      Printer.NewPage;
      j := [color=#0055FF]100[/color];
    [b]end[/b];
    Printer.Canvas.TextOut([color=#0055FF]200[/color], -(j + (i*[color=#0055FF]45[/color])), Memo1.Lines[ i ]);
  [b]end[/b];
Trotzdem druckt er die zweite Seite nicht...

Hat jemand Abhilfe?

Chris

jbg 18. Aug 2002 12:14

Zitat:

Zitat von Chakotay1308
PS: Muss man vielleicht ersteinmal neustarten, oder was?

Nein. Nimm mal eine andere Schriftart. Z.B. Arial, denn die kann man verkleinern. MS Sans Serif hingegen streikt für kleine Werte.


Neue Seite:
Ich sehe gerade, dass dein Code nicht richtig funktionieren kann, da du die Ausgabeposition von i abhängig machst, und i wird bzw. kann nicht bei einer neuen Seite auf 0 zurückgesetzt werden, womit dein zu druckender Text außerhalb des Drucksbereichs liegt.
Probiere mal dieses
Code:
j := 420;
[b]for[/b] i := 0 [b]to[/b] Memo1.Lines.Count -1 [b]do begin
  if[/b] j >= (PageHeight - 70) [b]then begin[/b]
    Printer.NewPage;
    j := 100;
  [b]end[/b];
  Printer.Canvas.TextOut(200, -j, Memo1.Lines[i]);
  Inc(j, 45);
[b]end[/b];

CalganX 18. Aug 2002 12:17

Hab ja Arial...
Chris

jbg 18. Aug 2002 12:20

Ich hab gerade noch was hinzugefügt zum obigen Posting.

CalganX 18. Aug 2002 12:38

OK, jetzt klappt alles... :D

Chris

CalganX 18. Aug 2002 18:18

ARGH!!! Ich drucke nichts ahnend was aus (wieder ein anderer Rechner)... Und was sehe ich: Es klappt wieder nicht. Dies mal ist alles viel zu groß...
Nochmal ganz von vorne. Man kann die Text-Reihen ja relativ ausrichten. Ich verstehe aber noch nicht so genau, wie das gehen soll... Vielleicht kann mir das jemand erklären.

Chris

hm988 12. Mai 2003 16:22

wie bekomme ich in das selbe Blatt noch ein Bitmap oder Jpeg
 
Hallo,

hätte da noch eine Frage, :?: :?:

über die Koordinaten noch ein Bild in das Druckfeld??
am besten müsste es fest mit in der Exe sein :roll:

hm988 12. Mai 2003 17:14

hallo nochmal,

mein letztes problem hab ich doch in letzter minute gelöst
mit verstecktem image objekt.

jetzt hab ich aber noch ein ganz anderes Problem und zwar will ich zu
meinem text .... eine Chart grafik ausdrucken geht auch, aber nur auf zwei seiten wie bekomme ich das ganze auf eine seite.??
für den chart steht der druckauftrag direkt hinter enddoc davor geht nicht :?: :shock: könnt ihr mir da weiterhelfen

gruß Steven

Stanlay Hanks 12. Mai 2003 17:54

ich glaube er will wissen wie.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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