Fórum Imprimir StringGrid #191911
31/10/2003
0
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
Curtir tópico
+ 0Posts
18/04/2007
Daniel Martins
Gostei + 0
22/03/2008
Maicon Narciso
Estou necessitando um procedimento urgente para imprimir o conteudo do stringgrid em delphi....
por favor me ajudem.....
Gostei + 0
22/03/2008
Edilcimar
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
24/03/2008
Maicon Narciso
muito obrigado
Gostei + 0
25/03/2008
Edilcimar
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
25/03/2008
Rodc
sGrid.PaintTo(Printer.Handle,0, 0);
Gostei + 0
25/03/2008
Maicon Narciso
Se puder me passar o procedimento eu agradeço... muito obrigado..
por favor me ajude...
Gostei + 0
25/03/2008
Edilcimar
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
25/03/2008
Rodc
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
25/03/2008
Maicon Narciso
não estou entendendo referente aqueles (...) pontinhos eu boto aonde isso?
Gostei + 0
25/03/2008
Maicon Narciso
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
25/03/2008
Rodc
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
25/03/2008
Maicon Narciso
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
25/03/2008
Edilcimar
Gostei + 0
25/03/2008
Edilcimar
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)