AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ausdruck funktioniert nicht auf jedem Drucker
Thema durchsuchen
Ansicht
Themen-Optionen

Ausdruck funktioniert nicht auf jedem Drucker

Ein Thema von hitmiccs · begonnen am 6. Okt 2006 · letzter Beitrag vom 6. Okt 2006
Antwort Antwort
Benutzerbild von hitmiccs
hitmiccs

Registriert seit: 15. Mär 2005
Ort: Bous
15 Beiträge
 
#1

Ausdruck funktioniert nicht auf jedem Drucker

  Alt 6. Okt 2006, 08:15
Hallo.

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

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:

http://img396.imageshack.us/img396/6...derngd0.th.jpg

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:

http://img370.imageshack.us/img370/2...dernaf0.th.jpg


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
If anything can go wrong, it will !

Murphy's Law
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Ausdruck funktioniert nicht auf jedem Drucker

  Alt 6. Okt 2006, 08:25
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]
  Mit Zitat antworten Zitat
Benutzerbild von hitmiccs
hitmiccs

Registriert seit: 15. Mär 2005
Ort: Bous
15 Beiträge
 
#3

Re: Ausdruck funktioniert nicht auf jedem Drucker

  Alt 6. Okt 2006, 08:40
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
If anything can go wrong, it will !

Murphy's Law
  Mit Zitat antworten Zitat
TuiHome

Registriert seit: 6. Sep 2006
1 Beiträge
 
#4

Re: Ausdruck funktioniert nicht auf jedem Drucker

  Alt 6. Okt 2006, 08:42
Hallo!

Schau dir mal die Komponente PrintPreview unter http://www.delphiarea.com/products/ an.

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
  Mit Zitat antworten Zitat
Benutzerbild von hitmiccs
hitmiccs

Registriert seit: 15. Mär 2005
Ort: Bous
15 Beiträge
 
#5

Re: Ausdruck funktioniert nicht auf jedem Drucker

  Alt 6. Okt 2006, 08:45
Klasse, werd ich gleich ausprobieren!

Danke
If anything can go wrong, it will !

Murphy's Law
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: Ausdruck funktioniert nicht auf jedem Drucker

  Alt 6. Okt 2006, 09:03
Zitat von hitmiccs:
Wie meinst du das mit der Auflösung? Wenn der Rechner/Monitor ne andere Auflösung hat?
Ich meinte die Auflösung des Druckers
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 von hitmiccs:
Wie stelle ich denn die Einheiten von Pixel auf Millimeter um? Sind ja einige Werte, die ich ändern müsste...
Man sollte deswegen immer möglichst vorab auf Millimeter umstellen. Das mit dem umrechnen der Einheiten (wenn du die absolut angibst) musst natürlich du übernehmen. Die Umstellung auf Millimeter kannst du mittel setDeviceCaps umstellen, was hier alles angeboten wird verrät dir das Windows API (sowas wie loMetric oder hiMetric sollte hier für Millimeter zu finden sein, da solltest du dann aber lieber in's API schauen!).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz