La opción 1 no la he citado porque eso supondría imprimir con el Canvas de la impresora lo cual resulta harto complicado cuando además habrá que alinear números por la derecha etc...
Mira un extracto para que te hagas una idea del problema:
Código Delphi
[-]
procedure ImpAlba(n:Integer);
var
nSaltLin:Integer;
nSaltPun:Integer;
nLinea:Integer;
lEuro:Boolean;
cCadena:String;
begin
nSaltLin:=0;
DmXXXX.Cli.IndexName:='Codigos'; DmXXXX.Cli.FindKey([DmXXXX.AlbaCodCliente.Value]);
SetPaperSize(DmXXXX.ConfAltoAlbaran.Value,DmXXXX.ConfAnchoAlbaran.Value);
Printer.Canvas.Font.Size:=DmXXXX.ConfFontSizeEncabezado.value;
Printer.Canvas.Font.Name:=DmXXXX.ConfFontEncabezado.Value;
With Printer.canvas do
Begin
printer.BeginDoc;
HeadIMpalba(1);
Printer.Canvas.Font.Size:=DmXXXX.ConfFontSizeDetalle.value;
Printer.Canvas.Font.Name:=DmXXXX.ConfFontDetalle.Value;
DmXXXX.Linalba.First;
nSaltLin:=0;
nSaltPun:=DmXXXX.ConfASaltoLinea.Value;
While Not DmXXXX.LinAlba.Eof do
begin
nLinea:=nLinea + 1;
if nLinea > DmXXXX.ConfASaltoPagina.Value then
begin
Textout(DmXXXX.ConfAcolDescripcion.value,DmXXXX.ConfAlinNArticulo.Value + (nSaltLin * nSaltPun) ,'..........');
nLinea:=0;
nSaltLin:=0;
Printer.NewPage;
HeadImpalba(1);
end;
cCadena:=numero2Texto(DmXXXX.AlbaRecargo1.Value,2,7);
Textout(DmXXXX.ConfAcolRecTtl.value ,DmXXXX.ConfAlinBase.Value + (nSaltLin * nSaltPun) , cCadena);
end;
nSaltLin:= nSaltLin + 1;
end;
if DmXXXX.AlbaRecargo3.Value <> 0 then
begin
cCadena:=numero2Texto(DmXXXX.AlbaTRec3.Value,2,5);
Textout(DmXXXX.ConfAcolRec100.value ,DmXXXX.ConfAlinBase.Value + (nSaltLin * nSaltPun) , cCadena);
cCadena:=numero2Texto(DmXXXX.AlbaRecargo3.Value,2,7);
Textout(DmXXXX.ConfAcolRecTtl.value ,DmXXXX.ConfAlinBase.Value + (nSaltLin * nSaltPun) , cCadena);
end;
nSaltLin:= nSaltLin + 1;
end;
cCadena:=numero2Texto(DmXXXX.AlbaETotal.Value,0,11);
Printer.EndDoc;
end;
end;
Esto con un Constructor de informes sin embargo es pan comido.
Un Saludo.