GARANTIR DESCONTO

Fórum Imprimir StringGrid #191911

31/10/2003

0

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

Responder

Posts

18/04/2007

Daniel Martins

olá o que é o ´Printer´?


Responder

Gostei + 0

22/03/2008

Maicon Narciso

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.....


Responder

Gostei + 0

22/03/2008

Edilcimar

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


Responder

Gostei + 0

24/03/2008

Maicon Narciso

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


Responder

Gostei + 0

25/03/2008

Edilcimar

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


Responder

Gostei + 0

25/03/2008

Rodc

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);



Responder

Gostei + 0

25/03/2008

Maicon Narciso

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...


Responder

Gostei + 0

25/03/2008

Edilcimar

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


Responder

Gostei + 0

25/03/2008

Rodc

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:


Responder

Gostei + 0

25/03/2008

Maicon Narciso

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

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


Responder

Gostei + 0

25/03/2008

Maicon Narciso

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;


Responder

Gostei + 0

25/03/2008

Rodc

[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.


Responder

Gostei + 0

25/03/2008

Maicon Narciso

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;



Responder

Gostei + 0

25/03/2008

Edilcimar

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


Responder

Gostei + 0

25/03/2008

Edilcimar

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar