![]() |
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 |
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; |
Danke, aber noch eine Fragen:
Wie groß ist die Canvasfläche? Chris |
@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 |
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 |
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 |
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?
|
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... |
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"? |
Hier mal der komplette Sourcecode...
@Christian: Sieht bei mir aus, wie gedruckt. Am besten, sagt ihr mir anhand des Sourcecodes, was falsch ist...
Code:
Chris
[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]; |
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:
Alle Y-Koordinaten werden dabei negativ abgetragen.
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; |
Erstmal danke...
Ich blicke durch den Aufbau noch nicht durch, was ist das jetzt, und wie kann ich das ganze ändern?? Chris |
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 |
Dass du den Druckauftrag mit
Code:
beendest und dann neu anfängst!
Printer.EndDoc;
|
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.
|
Ja aber des geht ja anscheinend nicht :shock:
|
Zitat:
|
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 |
Was hast du denn geändert? Eine Änderung um 10 bedeutet 1 mm. Eine Erhöhung um 100 entspricht somit 1 cm.
|
Ich habe die Zeile
Code:
geändert. Erst nachdem ich dann die Zeile in
Printer.Canvas.Font.Height := 50; // 5 Millimeter
Code:
geändert habe, gab es eine minimale Veränderung. Ich muss es aber noch ein wenig kleiner haben...
Printer.Canvas.Font.Height := 5;
Chris PS: Muss man vielleicht ersteinmal neustarten, oder was? |
Nochmal zu dem "neue Seite": Die Zeile lautet derzeit:
Code:
Trotzdem druckt er die zweite Seite nicht...
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]; Hat jemand Abhilfe? Chris |
Zitat:
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]; |
Hab ja Arial...
Chris |
Ich hab gerade noch was hinzugefügt zum obigen Posting.
|
OK, jetzt klappt alles... :D
Chris |
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 |
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: |
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 |
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