Ver Mensaje Individual
  #1  
Antiguo 31-10-2013
Avatar de Dexter182
Dexter182 Dexter182 is offline
Miembro
 
Registrado: jul 2005
Ubicación: Argentina
Posts: 95
Reputación: 21
Dexter182 Va por buen camino
Imprimiendo un StringGrid

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);
//Realiza las impresiones en papel de los presupuestos
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;

    //Altura en pixeles de cada renglón
    AltRenglon   := Printer.Canvas.TextHeight('H') + (Printer.Canvas.TextHeight('H') * 0.2);
    //Cantidad de renglones por página
    CantRenglon     := Round(Printer.PageHeight / AltRenglon) - 7;

    //Calcula la cantidad de páginas que necesitará el presupuesto
    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

      //Define desde que página comenzará la impresión
      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; {while}

      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!
Responder Con Cita