Estoy armando un procedimiento de Impresión para imprimir un presupuesto, cuyo origen es un StringGrid.
He logrado que calcule la cantidad de hojas que necesitará imprimir, que se pueda seleccionar el intervalo de impresión, que se adecue mínimamente al tamaño de la hoja, etc.
Cuando parecía que estaba listo, me doy cuenta que el procedimiento siempre calcula el tamaño de hoja con respecto a la impresora predeterminada (por ejemplo, una de las impresoras está definida con hoja A4 y otra en un tamaño personalizado).
Si bien mediante el PrintDialog me deja elegir e imprimir en cualquiera de las dos impresoras, me encuentro con dos problemas:
- por más que elija la otra impresora, siempre intentará imprimir en el tamaño de hoja de la impresora predeterminada
- no encuentro manera de actualizar las opciones a mostrar en el PrintDialog acorde a la impresora elegida en el mismo.
Les dejo el código del procedimiento:
Código Delphi
[-]procedure TForm_Venta.Imprimir(StringGrid: TStringGrid; Edit: TEdit);
var
i : byte;
Y : Integer;
Fila : byte;
AltRenglon : Single;
CantRenglon : Integer;
Paginas : Integer;
begin
try
Printer.Canvas.Font.Name := 'Arial';
Printer.Canvas.Font.Size := 10;
AltRenglon := Printer.Canvas.TextHeight('H') + (Printer.Canvas.TextHeight('H') * 0.2);
CantRenglon := Round(Printer.PageHeight / AltRenglon) - 7;
If CantRenglon > (StringGrid.RowCount - 1) then
Paginas := 1
Else
If CantRenglon > 0 then
Paginas := Ceil((StringGrid.RowCount - 1) / CantRenglon)
Else begin
Paginas := 0;
MessageBox(Handle, 'Imposible imprimir.'+#13#10+'Tamaño de hoja incorrecto.', 'Error!', MB_OK+MB_ICONERROR);
end;
PrintDialog.FromPage := 1;
PrintDialog.MinPage := 1;
PrintDialog.ToPage := Paginas;
PrintDialog.MaxPage := Paginas;
If PrintDialog.Execute then begin
If PrintDialog.FromPage = 1 then
Fila := 1
Else
Fila := ((PrintDialog.FromPage - 1) * CantRenglon) + 1;
Printer.BeginDoc;
While Fila < StringGrid.RowCount do begin
Printer.Canvas.Font.Name := 'Arial';
Printer.Canvas.Font.Size := 10;
Printer.Canvas.Font.Style := [fsBold, fsUnderline];
Printer.Canvas.TextOut(80, Round(AltRenglon * 2), 'Descripción');
Printer.Canvas.TextOut(Round(Printer.PageWidth * 0.68) - Printer.Canvas.TextWidth('Cant.'), Round(AltRenglon * 2), 'Cantidad');
Printer.Canvas.TextOut(Round(Printer.PageWidth * 0.83) - Printer.Canvas.TextWidth('Precio'), Round(AltRenglon * 2), 'Precio');
Printer.Canvas.TextOut(Printer.PageWidth - 80 - Printer.Canvas.TextWidth('Subtotal'), Round(AltRenglon * 2), 'Subtotal');
Printer.Canvas.MoveTo(0, Round(AltRenglon * 2.5));
Printer.Canvas.Font.Style := [];
For i := 1 to CantRenglon do
begin
Y := Printer.Canvas.PenPos.Y + Round(AltRenglon);
Printer.Canvas.TextOut(80, Y, StringGrid.Cells[1,Fila]);
Printer.Canvas.TextOut(Round(Printer.PageWidth * 0.68) - Printer.Canvas.TextWidth(StringGrid.Cells[2,Fila]), Y, StringGrid.Cells[2,Fila]);
Printer.Canvas.TextOut(Round(Printer.PageWidth * 0.83) - Printer.Canvas.TextWidth(StringGrid.Cells[3,Fila]), Y, StringGrid.Cells[3,Fila]);
Printer.Canvas.TextOut(Printer.PageWidth - 84 - Printer.Canvas.TextWidth(StringGrid.Cells[4,Fila]), Y, StringGrid.Cells[4,Fila]);
Fila := Fila + 1;
end;
Printer.Canvas.Font.Style := [fsBold];
Printer.Canvas.TextOut(80, Printer.PageHeight - Round(AltRenglon * 2 ), 'Hoja Nº ' + IntToStr(Printer.PageNumber));
Printer.Canvas.Font.Size := 14;
Printer.Canvas.TextOut(Printer.PageWidth - 80 - Printer.Canvas.TextWidth('TOTAL: ' + Edit.Text), Printer.PageHeight - Round(AltRenglon * 2 ), 'TOTAL: '+Edit.Text);
If Printer.PageNumber < Paginas then
Printer.NewPage;
end;
Printer.EndDoc;
end;
except
on EPrinter do
MessageBox(Handle, 'Imposible imprimir.'+#13#10+'No se encuentra impresora.', 'Error!', MB_OK+MB_ICONERROR);
end;
end;
Desde ya muchas gracias de antemano!
Saludos!
![Mano Arriba](images/smilies/DeAcuerdo.gif)