Hallo
Ich habe in meinem Programm den PrintDialog eingefügt um den Drucker bestimmen zu können.
Auf einem zweiten Formular existiert eine TImage-Komponente (Align=alClient) für die Druckvorschau.
Ich habe folgenden QuellText:
Delphi-Quellcode:
procedure TForm1.Drucken1;
var
Image: TImage;
pmaxx: Integer; // Breite der Ausgabe auf Drucker;
pmaxy: Integer; // Entsprechend Höhe;
begin
if PrintDialog1.Execute then
begin
pmaxx := Printer.PageWidth-1;
pmaxy := Printer.PageHeight-1;
Application.CreateForm(TForm2, Form2);
Image := Form2.Image1;
// Berechnung der Breite der Druckausgabe in Variable widt
...
//
Form2.ClientWidth := widt;
Form2.ClientHeight := Round(widt*Power(2, 0.5)); // DIN A-Format einrichten
Image.Picture.Bitmap.Width := widt;
Image.Picture.Bitmap.Height := Round(widt*Power(2, 0.5)); // DIN A-Format einrichten
with Image.Canvas do
begin
// Ausgabe auf Image.Canvas
...
//
end;
Printer.Title := 'Druckausgabe';
Printer.BeginDoc;
Printer.Canvas.StrechDraw(Rect(0,0,pmaxx,pmaxy), Image.Picture.Bitmap);
Printer.EndDoc;
FreeAndNil(Form2);
end;
end;
procedure TForm1.Drucken2;
var
pmaxx : Integer;
pmaxy : Integer;
begin
if PrintDialog1.Execute then
begin
Printer.Title := 'Test';
pmaxx := Printer.PageWidth-1;
pmaxy := Printer.PageHeight-1;
Printer.BeginDoc;
Printer.Canvas.TextOut(pmaxx div 2 - Printer.Canvas.TextWidth('TEUEUZGJ') div 2,pmaxy div 15,'TEUEUZGJ');
Printer.EndDoc;
end;
end;
Ich habe 2 Drucker in meinem System installiert:
1 Lexmark Z65
1 PDFCreater
Wenn ich bei der Methode Drucken1 den PDFCreator wähle, dann funzt das drucken. Wähle ich aber den Lexmark, so schmeißt der Drucker ein leeres Blatt aus.
Zeichne ich aber direkt auf den Canvas von Printer (Methode Drucken2), dann erscheint die Ausgabe wie gewünscht auf dem Papier.
Den Umweg über ein TImage mache ich deshalb, weil man den Drucker und die Größe des Ausgabe-Papiers (A5, A4, A3) auswählen kann. So kann ich die Ausgabe mit fixen Daten vorbereiten und dann auf die entsprechende Ausgabegröße skalieren lassen (Ich weiß, dass dadurch Qualität verloren geht, aber das ist bei der Ausgabe unwichtig).