Autor Beitrag
hitmiccs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Do 05.10.06 16:08 
Hallo Delphifreunde.

Ich hab ein ziemlich blödes Problem mit meiner Druck-Prozedur.
Erstmal ein wenig Code...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
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:

[url=img396.imageshack.us...bildgrenderngd0.jpg]user defined image[/URL]

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:

[url=img370.imageshack.us...bildgrendernaf0.jpg]user defined image[/URL]


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
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.10.06 11:51 
Was ist das denn??? Du gibst ja absulut die Positionen in Pixeln an! Das geht dann eben nur auf einem Drucker! Du musst das skalieren oder auf millimeterweises Drucken umstellen! Ich meine wenn der eine Drucker 4800er Auflösung hat (Tintenstrahl) und der Laser 1200er dann kommt natürlich die 2400 beim Tintenstrahlt genau in die Mitte. Beim Laser liegt die aber weit außerhalb des Druckbereichs...

Sieh dir mal dieses Tutorial an:
www.dsdt.info/tutorials/drucken/?page=1
Ich gehe mal davon aus dass es die meisten Fragen beantwortet. Da muss ich hier erstmal nichts weiter dazu sagen. Wenn was unklar bleibt frag nach.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Sa 07.10.06 13:49 
user profile iconhitmiccs hat folgendes geschrieben:
Hallo Delphifreunde.

Ich hab ein ziemlich blödes Problem mit meiner Druck-Prozedur.
Erstmal ein wenig Code...

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


Hallo,

es ist ein Wunder, dass es überhaupt auf mehr als einem Drucker funktioniert: du verwendest für das Grid Werte, die korrekterweise über LOGPIXELS skaliert werden, für alles andere gibst du die Koordinaten absolut an. Es hat aber grundsätzlich jeder Drucker seine eigene Auflösung.

Mögliche Lösungen:

Den Windows-MappingMode umstellen auf MM_HIMETRIC (mm), dann erledigt Windows die Umrechnung, aber das wird von Delphi meines Wissens nicht unterstützt.

Die Printer-Auflösung auslesen und alle Koordinaten selbst umrechnen. Tips dazu:

1. Die Umrechnung in einer einzigen Funktion durchführen, die einen Punkt auf dem Papier umwandelt in einen Pixelwert X/Y. Geht sonst irgendwann beim Ändern schief.

2. Ich lese die Grösse des Canvas aus und skaliere so, dass der Ausdruck drauf passt. Das hat den Vorteil, dass es auch mit wesentlich kleineren Fenstern (Pixelzahl) geht, wenn auch u.U. unleserlich, hat aber auch den grossen Vorteil, dass die gleiche Software eine beliebig grosse Druckvorschau auf dem Bildschirm anzeigen kann. Ist eine Schweinearbeit, bis alles funktioniert, aber wenn man eine Druckvorschau hat, die immer genauso aussieht wie der endgültige Ausdruck, kann man sicher sein, die Sache im Griff zu haben. Und für den Kunden ist es auch ein grosser Gewinn an Komfort. Nebenbei ist der Papierverbrauch während der Entwicklung auch viel geringer.

3. Du benutzt abwechselnd Printer.Canvas und Canvas - funktioniert hier zwar, ist aber eine Fehlerquelle und daher kein defensives Programmieren. Also entweder immer Printer.Canvas oder immer Canvas oder am besten with Printer.Canvas do...

Gruss Reinhard
hitmiccs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Di 10.10.06 13:48 
Danke jaenicke und Reinhard, ich hab es mittlerweile mit der Komponente TPrintPreview gelöst. Ich gebe zwar weiterhin die Positionen absolut an, jedoch in Millimetern und auf mmLoMetric umgestellt.

Die Vorschau zeigt mir nun genau das an, was ich nachher auf (allen getesteten) Druckern zu sehen bekomme, man kann dazu noch zoomen und andere interessante Sachen einstellen.

Die Komponente erledigt dann so ziemlich alles, was mit dem drucken noch zu tun hat.

Grüße
hitmiccs