Hallo zusammen,
als langjähriger Mitleser bin ich leider jetzt auch auf ein Problem gestoßen, für das ich so spontan keine Lösung parat habe. Vielleicht kommt ihr ja auf ne Idee.
Folgende (aufs wesentliche reduzierte) Druckroutine:
Delphi-Quellcode:
procedure TForm1.btnSchreibenClick(Sender: TObject);
var
liY : Integer; // Positionierung auf der Y-Achse in 1/10mm
const
liSpacerMM : Integer = 5; // Platz zwischen den Zeilen -> 0,5mm
liBlockMM : Integer = 50; // Platz zwischen den Blöcken -> 5mm
liFontSizeMM : Integer = 40; // Schriftgrösse -> 4mm
begin
printer.BeginDoc;
liY := 200; // Startwert auf y-Achse: 20mm
SetMapMode(printer.canvas.handle, MM_TEXT);
printer.Canvas.Font.Height := MMtoPX(liFontSizeMM);
printer.Canvas.Font.Name := 'Gill Sans MT';
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+0*(liFontSizeMM+liSpacerMM)),'MUSTERMANN');
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+1*(liFontSizeMM+liSpacerMM)),'Testfall und sonstiges GmbH');
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+2*(liFontSizeMM+liSpacerMM)),'Musterstraße 2');
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+3*(liFontSizeMM+liSpacerMM)),'12345 Musterort');
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+4*(liFontSizeMM+liSpacerMM)),'info@MustermannGmbH');
liY := liY + 5 * (liSpacerMM+liFontSizeMM) + liBlockMM;
SetMapMode(printer.canvas.handle, MM_LOMETRIC);
printer.Canvas.Font.Height := liFontSizeMM;
printer.Canvas.Font.Name := 'Gill Sans MT';
printer.Canvas.TextOut(200,-(liY+0*(liFontSizeMM+liSpacerMM)),'MUSTERMANN');
printer.Canvas.TextOut(200,-(liY+1*(liFontSizeMM+liSpacerMM)),'Testfall und sonstiges GmbH');
printer.Canvas.TextOut(200,-(liY+2*(liFontSizeMM+liSpacerMM)),'Musterstraße 2');
printer.Canvas.TextOut(200,-(liY+3*(liFontSizeMM+liSpacerMM)),'12345 Musterort');
printer.Canvas.TextOut(200,-(liY+4*(liFontSizeMM+liSpacerMM)),'info@MustermannGmbH');
liY := liY + 5 * (liSpacerMM+liFontSizeMM) + 2 * liBlockMM;
SetMapMode(printer.canvas.handle, MM_TEXT);
printer.Canvas.Font.Height := MMtoPX(liFontSizeMM);
printer.Canvas.Font.Name := 'Arial';
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+0*(liFontSizeMM+liSpacerMM)),'MUSTERMANN');
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+1*(liFontSizeMM+liSpacerMM)),'Testfall und sonstiges GmbH');
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+2*(liFontSizeMM+liSpacerMM)),'Musterstraße 2');
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+3*(liFontSizeMM+liSpacerMM)),'12345 Musterort');
printer.Canvas.TextOut(MMtoPX(200),MMtoPX(liY+4*(liFontSizeMM+liSpacerMM)),'info@MustermannGmbH');
liY := liY + 5 * (liSpacerMM+liFontSizeMM) + liBlockMM;
SetMapMode(printer.canvas.handle, MM_LOMETRIC);
printer.Canvas.Font.Height := liFontSizeMM;
printer.Canvas.Font.Name := 'Arial';
printer.Canvas.TextOut(200,-(liY+0*(liFontSizeMM+liSpacerMM)),'MUSTERMANN');
printer.Canvas.TextOut(200,-(liY+1*(liFontSizeMM+liSpacerMM)),'Testfall und sonstiges GmbH');
printer.Canvas.TextOut(200,-(liY+2*(liFontSizeMM+liSpacerMM)),'Musterstraße 2');
printer.Canvas.TextOut(200,-(liY+3*(liFontSizeMM+liSpacerMM)),'12345 Musterort');
printer.Canvas.TextOut(200,-(liY+4*(liFontSizeMM+liSpacerMM)),'info@MustermannGmbH');
printer.EndDoc;
end;
function TForm1.MMtoPX(inMM:Integer) : Integer;
begin
result := Round(inMM * printer.Canvas.Font.PixelsPerInch / 254)
end;
function TForm1.PXtoMM(inPX:Integer) : Integer;
begin
result := Round(inPX *254 / printer.Canvas.Font.PixelsPerInch)
end;
Was wird gemacht?
Es wird 4x derselbe Adressblock gedruckt; alles in ein und dasselbe Dokument.
- Block1: Schriftart "Gill Sans MT" - MapMode MM_TEXT - FontHeight 4mm (umgerechnet in Pixel)
- Block2: Schriftart "Gill Sans MT" - MapMode MM_LOMETRIC - FontHeight 4mm
- Block3: Schriftart "Arial" - MapMode MM_TEXT - FontHeight 4mm (umgerechnet in Pixel)
- Block4: Schriftart "Arial" - MapMode MM_LOMETRIC - FontHeight 4mm
Das Ergebnis findet ihr im Anhang.
Obwohl ich zwischen Block 1 und Block 2 eigentlich nur SetMapMode aufgerufen und die Schriftgröße auf den analogen mm-Wert umgestellt habe, ist der 2. Textblock zusammen geschoben.
Die Höhe scheint gleich zu sein, nur die Breite hat sich verändert.
Als Gegenbeispiel dienen Block 3 und 4. Hier das identische vorgehen mit der Schriftart Arial; dort wird jedoch nichts zusammen geschoben.
Es scheint also mit der Schriftart zusammen zu hängen (ist mit mehreren nachvollziehbar) und evtl. auch mit dem ausgewählten Drucker (hier: PDF-Printer; bei einem anderen Drucker auf demselben PC waren Block 1 und Block 2 beide zusammengeschoben, Block 3 und 4 hingegen nicht).
Kann sich das jemand erklären?
Kann man das Problem irgendwie umgehen ohne dass man die Schriftart wechselt?