![]() |
Ausdruck funktioniert nicht auf jedem Drucker
Hallo.
Ich hab ein ziemlich blödes Problem mit meiner Druck-Prozedur. Erstmal ein wenig Code... :roteyes:
Delphi-Quellcode:
procedure GridDruck(links,oben,vSpalte,bSpalte,vZeile,bZeile:integer; scal:double; farbig:boolean);
var x,y,li,ob,re,un,waag,senk,a:integer; fix,grund,schrift:TColor; r:Trect; eich_bild: TBitmap; function rech(i,j:integer):integer; begin result:=round(((i*j) / 72) * scal); end; begin if maengel.data_grid.Cells[3,16]='' then begin maengel.data_grid.RowCount:=16; //////////////////////////////////////////1-Seiten-Version/////////////////////////////////////// if vZeile < 0 then vZeile:=0; if vSpalte < 0 then vSpalte:=0; if (bZeile >= maengel.data_grid.rowcount)or(bZeile < 0) then bZeile:=maengel.data_grid.rowcount - 1; if (bSpalte >= maengel.data_grid.colcount)or(bSpalte < 0) then bSpalte:=maengel.data_grid.colcount - 1; if vZeile > bZeile then begin a:=vZeile;vZeile:=bZeile;bZeile:=a; end; if vSpalte > bSpalte then begin a:=vSpalte;vSpalte:=bSpalte;bSpalte:=a; end; if (scal > 0)and(vZeile < maengel.data_grid.rowcount)and(vSpalte < maengel.data_grid.colcount) then begin if farbig then begin fix:=clwhite; grund:=maengel.data_grid.color; schrift:=maengel.data_grid.font.color; end else begin fix:=clwhite; grund:=clwhite; schrift:=clblack; end; waag:=getdevicecaps(printer.handle,logpixelsx); senk:=getdevicecaps(printer.handle,logpixelsy); links:=rech(links,waag); oben:=rech(oben, senk); li:=getdevicecaps(printer.handle,physicaloffsetx)+1+links; a:=rech(3,waag); with printer do begin BeginDoc; //------------------------------------------------------------------------------------// Printer.Canvas.Font.Name:='Arial'; Printer.Canvas.Brush.Color:=clWhite; Printer.Canvas.Font.Size:=14; Printer.Canvas.Font.Style:=[fsBold]; Canvas.TextOut(300,200,'Bautagesbericht Schleifarbeiten vom '+maengel.datum_text.text); Printer.Canvas.Font.Style:=[]; //------------------------------------------------------------------------------------// Printer.Canvas.Font.Size:=10; Printer.Canvas.Font.Style:=[fsBold]; Canvas.TextOut(300,600,'Maschine: '+mach_buf2); Canvas.TextOut(300,700,'AG');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1400,700,maengel.ag_text.text);Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(2700,700,'Datum');Printer.Canvas.Font.Style:=[];Canvas.TextOut(3100,700,maengel.datum_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,800,'Strecke');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1400,800,maengel.strecke_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(2700,800,'Bst.Nr.');Printer.Canvas.Font.Style:=[];Canvas.TextOut(3100,800,maengel.baustnr_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,900,'Gleis');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1400,900,maengel.gleis_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,1000,'ausgeführte Leistung');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1400,1000,maengel.leistung_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(2700,1000,'von km');Printer.Canvas.Font.Style:=[];Canvas.TextOut(3100,1000,maengel.startkm_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(3500,1000,'bis km');Printer.Canvas.Font.Style:=[];Canvas.TextOut(3900,1000,maengel.endkm_text.text); //------------------------------------------------------------------------------------// if maengel.data_grid.gridlinewidth > 0 then begin canvas.pen.color:=$333333; canvas.pen.width:=2; canvas.pen.style:=pssolid end else canvas.pen.style:=psclear; canvas.font:=maengel.data_grid.font; canvas.font.color:=schrift; canvas.font.size:=8; for x:=vSpalte to bSpalte do begin ob:=getdevicecaps(printer.handle,physicaloffsety)+1+oben; re:=li+rech(maengel.data_grid.ColWidths[x]+1,waag); for y:=vZeile to bZeile do begin un:=ob+rech(maengel.data_grid.RowHeights[y]+1,senk); if (x < maengel.data_grid.fixedcols)or(y < maengel.data_grid.fixedrows) then canvas.brush.color:=fix else canvas.brush.color:=grund; canvas.rectangle(li,ob,re+2,un+2); r:=rect(li+a,ob+1,re-a,un-2); drawtext(canvas.handle,pchar(maengel.data_grid.Cells[x,y]),length(maengel.data_grid.Cells[x,y]), r,DT_SINGLELINE or DT_VCENTER); ob:=un; end; li:=re; end; //------------------------------------------------------------------------//Logo eich_bild:=TBitmap.Create; eich_bild.LoadFromResourceName(hInstance,'pic1'); if option_form.print_logo_out.Checked then Printer.Canvas.Draw(3550,50,eich_bild); //------------------------------------------------------------------------// linke Seite Printer.Canvas.Font.Size:=10; Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,3750,'TA (Einsatzzeit in h):');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1350,3750,maengel.einsatz_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,3900,'TS (Rüstzeit in h):');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1350,3900,maengel.ruest_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,4050,'WT (Funkenzeit in h):');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1350,4050,maengel.funken_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,4200,'TT (Fahrzeit in h):');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1350,4200,maengel.fahrzeit_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,4350,'TW (Wartezeit in h):');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1350,4350,maengel.warte_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,4500,'MD (Maschinendefekt):');Printer.Canvas.Font.Style:=[];Canvas.TextOut(1350,4500,maengel.madef_text.text); //------------------------------------------------------------------------// rechte Seite Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(1900,3750,'Schleifmeter:');Printer.Canvas.Font.Style:=[];Canvas.TextOut(2550,3750,maengel.schlmet_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(1900,3900,'Fertigmeter:');Printer.Canvas.Font.Style:=[];Canvas.TextOut(2550,3900,maengel.fertigmet_text.text); Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(1900,4050,'Bemerkungen:');Printer.Canvas.Font.Style:=[]; Canvas.TextOut(2550,4050,maengel.bem_text.Lines[0]); Canvas.TextOut(2550,4150,maengel.bem_text.Lines[1]); Canvas.TextOut(2550,4250,maengel.bem_text.Lines[2]); Canvas.TextOut(2550,4350,maengel.bem_text.Lines[3]); Canvas.TextOut(2550,4450,maengel.bem_text.Lines[4]); Canvas.TextOut(2550,4550,maengel.bem_text.Lines[5]); //------------------------------------------------------------------------// CheckBoxen Printer.Canvas.Font.Style:=[fsBold];Canvas.TextOut(300,4750,'vorhandene Schienenfehler:');Printer.Canvas.Font.Style:=[]; Canvas.TextOut(300,4900,'Shellings'); Canvas.TextOut(300,5000,'Wellen'); Canvas.TextOut(300,5100,'senkr. Abnutzung'); Canvas.TextOut(300,5200,'Einsenkung'); Canvas.TextOut(1400,4900,'Head-Checks'); Canvas.TextOut(1400,5000,'waager. Risse'); Canvas.TextOut(1400,5100,'senkr. Risse'); Canvas.TextOut(1400,5200,'Korrosion'); Canvas.TextOut(2400,4900,'Riffel'); Canvas.TextOut(2400,5000,'Abblätterung'); Canvas.TextOut(2400,5100,'Schleuderstellen'); Canvas.TextOut(2400,5200,'seitl. Abnutzung'); Canvas.TextOut(3500,4900,'Verquetschungen'); Canvas.TextOut(3500,5000,'Oberflächenrisse'); Canvas.TextOut(3500,5100,'Sonstiges'); Printer.Canvas.Font.Style:=[fsBold]; Canvas.TextOut(4350,5100,'[ ]'); Printer.Canvas.Font.Style:=[]; Canvas.TextOut(300,5400,'Bedenken f. Durchführung:'); Canvas.TextOut(2400,5400,'Behinderung b. Durchführung:'); Printer.Canvas.Font.Size:=12; Canvas.TextOut(300,5650,'Unterschrift'); Printer.Canvas.Font.Style:=[fsBold]; Canvas.TextOut(300,6050,'________________________________'); Canvas.TextOut(2500,6050,'________________________________'); Printer.Canvas.Font.Size:=8; Canvas.TextOut(300,6190,'Datum');Canvas.TextOut(1300,6190,'AN'); Canvas.TextOut(2500,6190,'Datum');Canvas.TextOut(3500,6190,'AG'); Printer.Canvas.Font.Size:=10;Printer.Canvas.Font.Style:=[]; if maengel.chk_shellings.Checked then Canvas.TextOut(1100,4900,'[X]') else Canvas.TextOut(1100,4900,'[ ]'); if maengel.chk_wellen.Checked then Canvas.TextOut(1100,5000,'[X]') else Canvas.TextOut(1100,5000,'[ ]'); if maengel.chk_abnutz.Checked then Canvas.TextOut(1100,5100,'[X]') else Canvas.TextOut(1100,5100,'[ ]'); if maengel.chk_einsenk.Checked then Canvas.TextOut(1100,5200,'[X]') else Canvas.TextOut(1100,5200,'[ ]'); if maengel.chk_headchk.Checked then Canvas.TextOut(2100,4900,'[X]') else Canvas.TextOut(2100,4900,'[ ]'); if maengel.chk_waagri.Checked then Canvas.TextOut(2100,5000,'[X]') else Canvas.TextOut(2100,5000,'[ ]'); if maengel.chk_senkri.Checked then Canvas.TextOut(2100,5100,'[X]') else Canvas.TextOut(2100,5100,'[ ]'); if maengel.chk_korro.Checked then Canvas.TextOut(2100,5200,'[X]') else Canvas.TextOut(2100,5200,'[ ]'); if maengel.chk_riff.Checked then Canvas.TextOut(3200,4900,'[X]') else Canvas.TextOut(3200,4900,'[ ]'); if maengel.chk_abbl.Checked then Canvas.TextOut(3200,5000,'[X]') else Canvas.TextOut(3200,5000,'[ ]'); if maengel.chk_schleud.Checked then Canvas.TextOut(3200,5100,'[X]') else Canvas.TextOut(3200,5100,'[ ]'); if maengel.chk_seitlab.Checked then Canvas.TextOut(3200,5200,'[X]') else Canvas.TextOut(3200,5200,'[ ]'); if maengel.chk_verq.Checked then Canvas.TextOut(4350,4900,'[X]') else Canvas.TextOut(4350,4900,'[ ]'); if maengel.chk_oberflri.Checked then Canvas.TextOut(4350,5000,'[X]') else Canvas.TextOut(4350,5000,'[ ]'); if maengel.beddurch_yes.Checked then Canvas.TextOut(1400,5400,'ja[X] nein[ ]') else Canvas.TextOut(1400,5400,'ja[ ] nein[X]'); if maengel.durchf_yes.Checked then Canvas.TextOut(3650,5400,'ja[X] nein[ ]') else Canvas.TextOut(3650,5400,'ja[ ] nein[X]'); enddoc; maengel.data_grid.RowCount:=36; end; end; end; Wenn alles richtig klappt sieht der Ausdruck folgendermaßen aus: ![]() ![]() Leider sieht es nur auf (den mir verfügbaren) Druckern HP Laserjet 2300n, Oki C5450 und nem HP Photodrucker (Name vergessen, ist aber Tintenspritzer) so aus. Auf allen anderen sieht es ziemlich genau SO aus: ![]() ![]() Es sieht aus als ob auf manchen Druckern die Dimensionen völlig anders sind. Alle meine Versuche über den Druckertreiber was zu ändern sind fehlgeschlagen und es liegt auch nicht daran, das das eine Laser und das andere Tintenstrahler sind. Falls jemand ne Idee hat, wie man das korrigieren könnte das es auf allen Druckern "richtig" aussieht, immer her damit - ich weiß nicht was ich noch ändern soll. Vielleicht (oder sehr wahrscheinlich) gibt es einen andern Code zum Drucken, bei dem das Problem nicht auftritt... Vielen Dank schonmal fürs Drübernachdenken. Grüße hitmiccs |
Re: Ausdruck funktioniert nicht auf jedem Drucker
Hi,
ohne jetzt näher in deinen Code zu schauen, dir ist klar dass du die Einheiten ändern kannst? Unterschiedliche Dimensionen klingt nach dem klassischen Problem (Lösung also in der DP, vielleicht sogar Codelib?), dass du in Pixeln rechnest. Je nach Auflösung bekommst du dann ganz unterschiedliche Ergebnisse (auch auf ein und dem gleichen Drucker). Jedenfalls kannst du auf millimeter oder zehntelmillimeter umstellen, dann sollte sich das Problem erübrigen. Ansonsten gilt natürlich auch, dass du den Druckrand mit dem nicht bedruckbaren Bereich des Druckers verrechnest und du solltest die Draw Prozedur des Druckers verwenden, arbeitest du direkt mit dem Canvas, kannst du in die Falle laufen, dass dein Bild auf einigen Druckern kopfsteht. Gruß Der Unwissende [Add] noch ein kleiner Tipp, du solltest den Code lieber auf mehr als eine Prozedur aufteilen. Alles was zusammen gehört, sollte ruhig in eine eigene Prozedur, macht es für dich leichter die einzelnen Stellen zu ändern, den Code übersichtlicher/leichter lesbar und du kannst damit auch neue Seiten leicht zusammensetzen (sind z.B. Header und Footer in einer Prozedur, wirken sich Änderungen gleich auf alle Seiten aus) [/Add] |
Re: Ausdruck funktioniert nicht auf jedem Drucker
Erstmal danke für die Antwort.
Wie meinst du das mit der Auflösung? Wenn der Rechner/Monitor ne andere Auflösung hat? Ich will damit sagen, ich habe hier meinen Laptop stehen, mit dem ich programmiere und hab im Moment 3 Drucker zur Auswahl. Einer davon macht diese Probleme, dass der Ausdruck so komisch gestreckt aussieht - er steht normalerweise auf der Arbeitsmaschine wo mein Programm eingesetzt wird. Ich hab ihn mir extra hergeholt und geb ihn erst wieder her wenn der Ausdruck korrekt aussieht ;) Wie stelle ich denn die Einheiten von Pixel auf Millimeter um? Sind ja einige Werte, die ich ändern müsste... Danke nochmal und Grüße! hitmiccs |
Re: Ausdruck funktioniert nicht auf jedem Drucker
Hallo!
Schau dir mal die Komponente PrintPreview unter ![]() Die Umrechnung der DPI's übernimmt die Komponente für dich und es hat sogar eine Seitenvorschau. Ich setze die Komponete selber ein un bin begeisters. Gruß Stephan |
Re: Ausdruck funktioniert nicht auf jedem Drucker
Klasse, werd ich gleich ausprobieren!
Danke |
Re: Ausdruck funktioniert nicht auf jedem Drucker
Zitat:
Ein Drucker wird von Windows als GDI (Grafic Device Interface) Komponente aufgefasst. Ein Graphic Device stellt halt die Funktionen (teilweise nicht alle) zur Verfügung, unter anderem gehört dazu die Möglichkeit mehr als eine Auflösung anzubieten. Wie dein Monitor, kannst du das auch bei deinem Drucker festlegen. Die Einheit die du hier vielleicht kennst ist DPI (Dots per Inch), da ein Inch ziemlich konstant ist und ein Dot einem Pixel auf deiner Ausdruck entspricht erklärt es dann deine unterschiedlichen Dimensionen, die Seite bleibt gleich groß, du verwendest gleich viele Pixel, aber die Pixelgröße ändert sich. Nur damit du weißt woran es jetzt (wahrscheinlich) lag. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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