Imprimir StringGrid

Delphi

31/10/2003

Eu tenho duas funções onde imprime o conteúdo do meu StringGrid. Eu tenho tb mais dois StringGrid que fiz de cabeçalho e gostaria de imprimi-los tb, mas ja tentei n possibilidades e não dá certo, será que vc consegue me ajuda?

A primeira procedure Imprime direto para impressora
A segunda imprime para aquivo
Gostaria de fazer isso nas duas procedures

procedure PrintGrid(sGrid: TStringGrid; sTitle : string);
var
  X, Y,
  Lin,
  Col          : Integer;
  TR           : TRect;
  cab1         : string;
begin
   //Titulo
   Printer.Orientation := poPortrait;
   Printer.Title := sTitle;
   Printer.Orientation := poPortrait;
   Printer.BeginDoc;
   Printer.Canvas.Pen.Color  := 0;
   Printer.Canvas.Font.Name  := ´MS Sans Serif´;
   Printer.Canvas.Font.Size  := 8;
   Printer.Canvas.TextOut(0, 100, Printer.Title );

   // Percorre cada coluna
   for Col := 0 to sGrid.ColCount - 1 do
   begin
     // Identifica as coordenadas (X,Y) da coluna de acordo com a largura da
     // mesma, conforme o Grid.
     X := 0;
     for Lin := 0 to (Col - 1) do
        X := X + 5 * (sGrid.ColWidths[Lin]);

     // Imprime cada linha da coluna.
     for Lin := 1 to sGrid.RowCount - 1 do
     begin
        // Define as corrdenadas (X,Y) e uma área Retangular
        Y := 150 * Lin + 300;
        TR := Rect(X, Y, X2 - 1, Y2);
        // Se for a primeira coluna (0) põe fundo cinza
        if Col = 0 then
           Printer.Canvas.Brush.Color := clLtGray
        else
           Printer.Canvas.Brush.Color := clWhite;

        // Imprime o conteúdo da célula (TextRect) e a borda da célula (FrameRect)
        Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[Col, Lin - 1]);
        Printer.Canvas.Brush.Color := clBlack;
        Printer.Canvas.FrameRect(TR);
        Printer.Canvas.Brush.Color := clWhite;
     end;
   end;
   Printer.EndDoc;
end;

//-----------------------------------------------------------------------------

procedure SaveGridToFile(Grid, Grid2: TStringGrid; const Filename: String);
var
  I, J        : Integer;
  Text        : TextFile;
  Widths      : array of Integer;
  TotalWidth  : Integer;
begin
  AssignFile(Text, Filename);
  Rewrite(Text);

  try
    SetLength(Widths, Grid.ColCount);
    TotalWidth := 0;

    for I := 0 to Grid.ColCount - 1 do
    begin
      Widths[I] := 0;
      for J := 0 to Grid.RowCount - 1 do
      begin
        if Length(Grid.Cells[I, J]) > Widths[I] then
          Widths[I] := Length(Grid.Cells[I, J]);
      end;
      Inc(Widths[I], 2);
      Inc(TotalWidth, Widths[I]);
    end;

    for I := 0 to Grid.RowCount - 1 do
    begin
      if I <> 0 then
      begin
        for J := 0 to TotalWidth + Length(Widths) + 3 do Write(Text, ´-´);
        Write(Text, 1310);
      end;

      for J := 0 to Grid.ColCount - 1 do
      begin
        if J <> 0 then
          Write(Text, ´ |´);
        Write(Text, Grid.Cells[J, I]:Widths[J]);
      end;

      Write(Text, 1310);
    end;
  finally
    CloseFile(Text);
  end;
end;




Marcela

Marcela

Curtidas 0

Respostas

Daniel Martins

Daniel Martins

31/10/2003

olá o que é o ´Printer´?


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

Amigo testei seu código mas ele naum imprime o conteudo do striggrid em delphi, ou seja ele imprime somente o desenho do stringgrid ou seja a tabela sem os dados dentro....

Estou necessitando um procedimento urgente para imprimir o conteudo do stringgrid em delphi....

por favor me ajudem.....


GOSTEI 0
Edilcimar

Edilcimar

31/10/2003

printer.canvas.textout(coluna, linha, StringGrid1.Cells[I,J]);
Onde I e J são respectivamente o conteúdo da voluna e linha do stringgrid.
É claro que vai ter que colocar isto dentro do seu loop


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

Amigo não sei como completar o codigo para imprimir dados em delphi do stringgrid... por favor se possivel me passe o codigo completo... desde ja agradeço ou me add no msn: maiconinfoway@hotmail.com

muito obrigado


GOSTEI 0
Edilcimar

Edilcimar

31/10/2003

with printer.canvas do
begin
...For I := 1 to N do
...begin
......TextOut(ColunaOndeQueroImprimir, LinhaOndeQueroImprimir, StringGrid1.Cells[0, I]);
......TextOut(NovaColunaOndeQueroImprimir, AMesmaLinhaAnterior, StringGrid1.Cells[1,I]);
......etc;
......TextOut(UltimaColunaOndeQueroImprimir, AMesmaLinhaAnterior, StringGrid1.Cells[UltimaColunaDaStringGrid,I]);
...end;
end;

N deverá ser a quantidade de linhas da StringGrid que deseja imprimir, no for começa em 1 se não quiser imprimir o cabeçalho, caso queira, substitua por 0


GOSTEI 0
Rodc

Rodc

31/10/2003

O comando abaixo desenha o grid com os dados no canvas da impressora. Porém, você perderia o ´zebrado´ do seu relatório. Mas talvês se você fizer o ´zebrado´ no grid ele também será impresso neste comando.
sGrid.PaintTo(Printer.Handle,0, 0);



GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

Amigo... desculpa estar te perturbando, mas não estou conseguindo imprimir, meu stringgrid tem 5 colunas e gostaria de imprimir o conteudo do stringgrid isso td em delphi....

Se puder me passar o procedimento eu agradeço... muito obrigado..

por favor me ajude...


GOSTEI 0
Edilcimar

Edilcimar

31/10/2003

with printer.canvas do
begin
...Linha := 20;
...For I := 1 to N do
...begin
......TextOut(10, Linha, StringGrid1.Cells[0, I]);
......TextOut(100, Linha, StringGrid1.Cells[1,I]);
......TextOut(200, Linha, StringGrid1.Cells[2,I]);
......TextOut(300, Linha, StringGrid1.Cells[3,I]);
......TextOut(400, Linha, StringGrid1.Cells[4,I]);
......Linha := Linha + 30;
...end;
end;
se imprimir isto em uma matricial funciona, porém se imprimir em uma impressora com boa qualidade gráfica vai embolar tudo, tanto na horizontal quanto na vertical
Veja esta dica http://forum.devmedia.com.br/viewtopic.php?t=70693&highlight=indicevertical


GOSTEI 0
Rodc

Rodc

31/10/2003

with printer.canvas do begin ...Linha := 20; ...For I := 1 to N do ...begin ......TextOut(10, Linha, StringGrid1.Cells[0, I]); ......TextOut(100, Linha, StringGrid1.Cells[1,I]); ......TextOut(200, Linha, StringGrid1.Cells[2,I]); ......TextOut(300, Linha, StringGrid1.Cells[3,I]); ......TextOut(400, Linha, StringGrid1.Cells[4,I]); ......Linha := Linha + 30; ...end; end;

Por acaso os ´....´ (pontos) são para fazer a tabulação? Coloque o código entre as tags Code (Botão ´Code´ no editor) que ele não perde a formatação. :wink:


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

Como assim o botão code do editor....

não estou entendendo referente aqueles (...) pontinhos eu boto aonde isso?


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

Veja como estou fazendo o meu procedimento....

Se puder dar uma organizada no meu procedimento e me mandar novamente eu agradeço...

Por favor me ajude.... preciso fazer isso essa semana ainda...

var
X,X1,X2, Y,Y1,Y2,
Lin,l,j,I,linha,N,
Col : Integer;
TR : TRect;
cab1 : string;
begin
//Titulo
Printer.Orientation := poPortrait;
Printer.Title := sTitle;
Printer.Orientation := poPortrait;
Printer.BeginDoc;
Printer.Canvas.Pen.Color := 0;
Printer.Canvas.Font.Name := ´MS Sans Serif´;
Printer.Canvas.Font.Size := 8;
Printer.Canvas.TextOut(0, 100, Printer.Title );

// Percorre cada coluna
for Col := 0 to sGrid.ColCount - 1 do
begin
// Identifica as coordenadas (X,Y) da coluna de acordo com a largura da
// mesma, conforme o Grid.
X := 0;
for Lin := 0 to (Col - 1) do
X := X + 4 * (sGrid.ColWidths[Lin]);

// Imprime cada linha da coluna.
for Lin := 1 to sGrid.RowCount - 1 do
begin
// Define as corrdenadas (X,Y) e uma área Retangular
Y := 150 * Lin + 300;
TR := Rect(X, Y, X2 - 1, Y2);

// Se for a primeira coluna (0) põe fundo cinza

with printer.canvas do
begin
Linha := 20;
For I := 1 to N do
begin
TextOut(10, Linha, StringGrid1.Cells[0, I]);
TextOut(100, Linha, StringGrid1.Cells[1,I]);
TextOut(200, Linha, StringGrid1.Cells[2,I]);
TextOut(300, Linha, StringGrid1.Cells[3,I]);
TextOut(400, Linha, StringGrid1.Cells[4,I]);
Linha := Linha + 30;
end;
end;


if Col = 0 then
Printer.Canvas.Brush.Color := clLtGray
else
Printer.Canvas.Brush.Color := clWhite;

// Imprime o conteúdo da célula (TextRect) e a borda da célula (FrameRect)
Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[Col, Lin - 1]);
Printer.Canvas.Brush.Color := clBlack;
Printer.Canvas.FrameRect(TR);
Printer.Canvas.Brush.Color := clWhite;
//sGrid.PaintTo(Printer.Handle,0, 0);
//Printer.Canvas.TextOut(Col,Lin, StringGrid1.Cells[l,j]);
end;
end;
Printer.EndDoc;
end;


GOSTEI 0
Rodc

Rodc

31/10/2003

[quote:2277757c47=´maicon narciso´]Como assim o botão code do editor....[/quote:2277757c47]
Exatamente... Ao invés de postar o código assim:
with printer.canvas do
begin
...Linha := 20;
...For I := 1 to N do
...begin
......TextOut(10, Linha, StringGrid1.Cells[0, I]);
......TextOut(100, Linha, StringGrid1.Cells[1,I]);
......TextOut(200, Linha, StringGrid1.Cells[2,I]);
......TextOut(300, Linha, StringGrid1.Cells[3,I]);
......TextOut(400, Linha, StringGrid1.Cells[4,I]);
......Linha := Linha + 30;
...end;
end;

Posta assim:
with printer.canvas do 
begin 
   Linha := 20; 
   For I := 1 to N do 
   begin 
      TextOut(10, Linha, StringGrid1.Cells[0, I]); 
      TextOut(100, Linha, StringGrid1.Cells[1,I]); 
      TextOut(200, Linha, StringGrid1.Cells[2,I]); 
      TextOut(300, Linha, StringGrid1.Cells[3,I]); 
      TextOut(400, Linha, StringGrid1.Cells[4,I]); 
      Linha := Linha + 30; 
   end; 
end;

Desta forma, se alguém quiser testar o código é só copiar e colar, sem precisar ficar apagando os pontos de cada linha.
O seu último post é um exemplo clássico, ele perdeu toda a tabulação do código, ficando difícil para quem quer lhe ajudar a entender o código.
Tente postar novamente o código com a tag Code. Faça o seguinte, copie o código, no editor da mensagem no forum, clique no botão ´Code´ (encima da escolha da cor do texto), cole o texto e depois clique novamente no botão ´Code´ para fechar a tag.


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

Amigo esse é meu procedimento completo..... Ele esta correto? Se tiver q fazer alguma mudança, você poderia me ajudar?

Mais uma coisa quando mando imprimir na impressora a jato de tinta e demora pra começar a imprimir tem vezes q leva até 20 minutos pra começar a imprimir..... Amigo se puder teste meu codigo lembrando q oq estou tentando fazer é imprimir um relatorio de compras ou seja o cliente X chega na loja e faz uma compra e no final sai um relatorio é semelhante a uma nota. ou seja se tiver uma dica melhor de como emitir uma nota após a compra feita pelo cliente eu fico muito agradecido...

por favor me ajude...


var
  X,X1,X2, Y,Y1,Y2,
  Lin,l,j,I,linha,N,
  Col          : Integer;
  TR           : TRect;
  cab1         : string;
begin
   //Titulo
   Printer.Orientation := poPortrait;
   Printer.Title := sTitle;
   Printer.Orientation := poPortrait;
   Printer.BeginDoc;
   Printer.Canvas.Pen.Color  := 0;
   Printer.Canvas.Font.Name  := ´MS Sans Serif´;
   Printer.Canvas.Font.Size  := 8;
   Printer.Canvas.TextOut(0, 100, Printer.Title );

   // Percorre cada coluna
   for Col := 0 to sGrid.ColCount - 1 do
   begin
     // Identifica as coordenadas (X,Y) da coluna de acordo com a largura da
     // mesma, conforme o Grid.
     X := 0;
     for Lin := 0 to (Col - 1) do
        X := X + 4 * (sGrid.ColWidths[Lin]);

     // Imprime cada linha da coluna.
     for Lin := 1 to sGrid.RowCount - 1 do
     begin
        // Define as corrdenadas (X,Y) e uma área Retangular
        Y := 150 * Lin + 300;
        TR := Rect(X, Y, X2 - 1, Y2);

        // Se for a primeira coluna (0) põe fundo cinza

        with printer.canvas do
begin
   Linha := 20;
   For I := 1 to N do
   begin
      TextOut(10, Linha, StringGrid1.Cells[0, I]);
      TextOut(100, Linha, StringGrid1.Cells[1,I]);
      TextOut(200, Linha, StringGrid1.Cells[2,I]);
      TextOut(300, Linha, StringGrid1.Cells[3,I]);
      TextOut(400, Linha, StringGrid1.Cells[4,I]);
      Linha := Linha + 30;
   end;
end;


        if Col = 0 then
           Printer.Canvas.Brush.Color := clLtGray
        else
           Printer.Canvas.Brush.Color := clWhite;

        // Imprime o conteúdo da célula (TextRect) e a borda da célula (FrameRect)
        Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[Col, Lin - 1]);
        Printer.Canvas.Brush.Color := clBlack;
        Printer.Canvas.FrameRect(TR);
        Printer.Canvas.Brush.Color := clWhite;
          //sGrid.PaintTo(Printer.Handle,0, 0);
        //Printer.Canvas.TextOut(Col,Lin, StringGrid1.Cells[l,j]);
     end;
   end;
   Printer.EndDoc;
end;



GOSTEI 0
Edilcimar

Edilcimar

31/10/2003

sim, os pontos são para tabular, para melhor visualizar


GOSTEI 0
Edilcimar

Edilcimar

31/10/2003

se vc usa jato de tinta, e usar o código exatamente como falei, a impressão vai ficar ´encavalada´, leia o link que enviei o qual é usado para fazer este tipo decorreção, colocando as coisas nos respectivos locais


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

Amigo oq esta ocorrendo agora é q o texto esta sendo impresso fora do stringgrid e quando mando imprimir demora muito para começar a impressão... oq faço?


GOSTEI 0
Edilcimar

Edilcimar

31/10/2003

Se o texto sai fora do stringgrid é porque você fez uma compensação de resolução no stringgrid e não fez a mesma compensação no texto do mesmo, quanto a demora, não vejo razão alguma uma vez que você colocou printer.begindoc e depois printer.enddoc, quando não se coloca o enddoc ele realmente demora a imprimir, algumas vezes só imprime ao sair do programa, teste mandar imprimir e fechar o programa para ver se acelera


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

è possivel eu imprimir somente os dados dentro do stringgrid e não as linhas do stringgrid junto?

Como faço?

O meu objetivo é imprimir as compras q uma pessoa fez numa determinada loja


GOSTEI 0
Edilcimar

Edilcimar

31/10/2003

do jeito que expliquei imprime apenas o conteúdo sem as linhas


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

..


GOSTEI 0
Wanderok

Wanderok

31/10/2003

Coloque o código entre as tags Code (Botão ´Code´ no editor) que ele não perde a formatação. :wink:


Caramba !!!!!!!!

Isto
     resolveu
     a
     minha
              vida
              obrigado
     mesmo
valeu!


:D:D:D


GOSTEI 0
Maicon Narciso

Maicon Narciso

31/10/2003

Cara se vc conseguiu tem como passar pra mim.... eu agradeço, pois fui eu quem postei aqueles procedimentos, mas naum consegui organizar para ele poder imprimir de forma ordenada dentro do stringgrid.... ou seja, pretendo apenas imprimir uma certa quantia de compras q certo cliente comprou em uma loja..... igual a uma nota...


GOSTEI 0
POSTAR