StringGrid的打印,可是我不会!!(在线等待) (30分)

  • 主题发起人 主题发起人 wldandan
  • 开始时间 开始时间
W

wldandan

Unregistered / Unconfirmed
GUEST, unregistred user!
因为用到很多的统计,所以我用了StringGrid来显示。
其中显示的数据是用了几个Tquery分别插入到StringGrid的Cells中的
现在想把StringGrid的内容打出来,用QR肯定是不行了吧,请教一下!!
怎么打印。。。出表格的样子(就是带框框)。。。
谢谢
 
用QR可以呀
 
哈哈,给分分
Procedure TACDListerMain.PrintTable;
Var
margins: TRect;
spacing: Integer;
Cols: TList;
Dlg: TPrintProgressDlg;
Procedure SetColumnWidth;
Var
i, k, w: Integer;
begin
Printer.Canvas.Font.Style := [ fsBold ];
For i := 0 To Pred( Grid.ColCount )do
Cols.Add( Pointer( Printer.Canvas.TextWidth( Grid.Cells[ i,0 ] )));
Printer.Canvas.Font.Style := [];
For i := 1 To Pred( Grid.RowCount )do
For k := 0 To Pred( Grid.ColCount )do
begin
w:= Printer.Canvas.TextWidth( Grid.Cells[ k, i ] );
If w > Integer( Cols[ k ] ) then
Cols[ k ] := Pointer( w );
end;
{ For }
w := 2 * Printer.Canvas.Font.PixelsPerInch div 3;
margins :=
Rect( w, w, Printer.PageWidth-w, Printer.PageHeight - w );
spacing := Printer.Canvas.Font.PixelsPerInch div 10;
w := 0;
For i := 0 To Pred(cols.Count)do
w := w + Integer( cols[ i ] ) + spacing;
w := w - spacing;
If w > (margins.right-margins.left ) then
begin
w := w - (margins.right-margins.left );
cols[ cols.Count-2 ] :=
Pointer( Integer( cols[ cols.Count-2 ] ) - w );
end;
{ If }
w:= 0;
For i := 0 To Pred(cols.Count)do
w := w + Integer( cols[ i ] ) + spacing;
margins.right := w - spacing + margins.left;
end;
{ SetColumnWidth }
Proceduredo
Print;
Var
i: Integer;
y: Integer;
Proceduredo
Line(lineno: Integer);
Var
x, n: Integer;
r: TRect;
th: Integer;
begin
If Length(Grid.Cells[0,lineno]) = 0 then
Exit;
x:= margins.left;
With Printer.Canvasdo
begin
th := TextHeight( '膟' );
For n := 0 To Pred( Cols.Count )do
begin
r := Rect( 0, 0, Integer(Cols[ n ]), th);
OffsetRect( r, x, y );
TextRect( r, x, y, Grid.Cells[ n, lineno ] );
x := r.right + spacing;
end;
{ For }
end;
{ With }
y := y + th;
end;
{do
Line }
Proceduredo
Header;
begin
y:= margins.top;
With Printer.Canvasdo
begin
Font.Style := [ fsBold ];
do
Line( 0 );
Pen.Width := Font.PixelsPerInch div 72;
Pen.Color := clBlack;
MoveTo( margins.left, y );
LineTo( margins.right, y );
Inc( y, 2 * Pen.Width );
Font.Style := [ ];
end;
{ With }
end;
{do
Header }
begin
y:= 0;
For i := 1 To Pred( Grid.RowCount )do
begin
Dlg.Progress( i );
Application.ProcessMessages;
If FPrintAborted then
Exit;
If y = 0 then
do
Header;
do
Line( i );
If y >= margins.bottom then
begin
Printer.NewPage;
y:= 0;
end;
{ If }
end;
{ For }
end;
{do
Print }
begin
FPrintAborted := False;
Dlg := TPrintProgressDlg.Create( Application );
With Dlgdo
try
OnAbort := PrintAborted;
Display( cPrintPreparation );
SetProgressRange( 0, Grid.RowCount );
Show;
Application.ProcessMessages;
Printer.Orientation := poLandscape;
Printer.begin
Doc;
Cols:= Nil;
try
Cols:= TLIst.Create;
Printer.Canvas.Font.Assign( Grid.Font );
SetColumnWidth;
Display( cPrintProceeding );
Application.ProcessMessages;
do
Print;
finally
Cols.Free;
If FPrintAborted then
Printer.Abort
else
Printer.EndDoc;
end;
finally
Close;
end;
{ With }
end;
{ TACDListerMain.PrintTable }
 
To:lql0459 这位大哥能不能讲一下怎么用QR实现。。。谢谢,,感激不尽!
To:lcl_003
huhu..为什么编译错误。说undeclared TPrintProgressDlg,可是怎么定义阿!!
能用了一定献分,先谢谢谢谢。。。。。(小弟实在是too weak le)....:)
 
可以导出到excel中打印
 
"用到很多的统计....其中显示的数据是用了几个Tquery分别插入到StringGrid的Cells中"
我见过一个这样的设计,还是华中硕士生写的,数据都没1000条,就慢得不得了.
 
a?
不会吧,但是我觉得用一个sql语句太夸张了吧,好像实现不了阿
huhu....这下惨了!!
 
我也想知道这个问题。怎样打印STRINGGRID的数据,是否一定要把数据转到数据控件
才能打印。
 
用 lcl_003 的代码可以实现,错误:undeclared TPrintProgressDlg,只是你加入该单元。
 
问一下
在unit里加入TPrintProgressDlg就可以吗?
 
如果导入到EXCEL我倒是写过一个通用函数。可以很方便的调用。
 
程序员开发指南中有一个例子是打印DBGRID中显示的数据的
做得比较通用可调整列宽
直接使用了打印类和lcl_003的方法很相似但是有程序的一些说明应该更好理解
你可以参考一下
 
后退
顶部