Für ganz einfache Sachen (Tabellen, ein Bild) kann man schon TPrinter verwenden. Für flexible Formulare wie Rechnungen etc. ist das wirklich ein Haufen Arbeit und ein ReportDesigner wirklich empfehlenswert.
Beim "manuellen" drucken muss man sich noch entscheiden, ob man die Koordinaten/Maße an den Drucker anpasst oder den Drucker an den Maßstab (letzeres mit SetMapMode, SetViewPort etc.)
Ein kleines Beispiel für die erste Variante:
Delphi-Quellcode:
private
{ Private-Deklarationen Form1 }
FxFactor,
FyFactor : Double;
[...]
procedure TForm1.CalculateLoMetricFactor;
var
xDPI, yDPI : Integer;
begin
xDPI := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
yDPI := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
FxFactor := xDPI / 254;
FyFactor := yDPI / 254;
end;
function TForm1.CalcX(XValue : Integer): Integer;
begin
Result := Round(XValue * FxFactor);
end;
function TForm1.CalcY(YValue : Integer): Integer;
begin
Result := Round(YValue * FyFactor);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if PrintDialog1.Execute then
begin
CalculateLoMetricFactor;
Printer.BeginDoc;
with Printer.Canvas do
begin
// Maßangaben in 1/10 mm
StretchDraw(Rect(CalcX(400),CalcY(100),CalcX(400+400),CalcY(100+400)),
Image1.Picture.Graphic);
Font.Size := 12;
TextOut(CalcX(100), CalcY(100), '- Zeile 1');
TextOut(CalcX(100), CalcY(200), '- Zeile 2');
end;
Printer.EndDoc;
end;
end;
Selbst bei so einem einfachen Beispiel muss schon viel berechnet werden, damit das auf jedem Drucker gleich aussieht.