给你个参考的,一个可直接打印Panel组件,你的要求俺不会-_-||unit PPanel;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Printers, StdCtrls, DBCtrls, Mask, ComCtrls, Grids, DBGrids, Chart;type TPPanel = class(TPanel) private { Private declarations } FShowBorder:Boolean; protected { Protected declarations } public { Public declarations } published { Published declarations } Procedure Print(AGrid:TObject;PPI:Integer); Procedure About; Property ShowBorder:Boolean Read FShowBorder Write FShowBorder; end;procedure Register;implementationprocedure Register; begin RegisterComponents('Standard', [TPPanel]); end;Procedure TPPanel.About; Begin Application.MessageBox('PPanel 作者:彭富章 2000.03','关于 PPanel',MB_OK+MB_ICONINFORMATION); End;Procedure TPPanel.Print(AGrid:TObject;PPI:Integer); Var SX,SY:Real; NowPage:Integer; ControlCount,I,N:Integer; AObj:TControl; ARect:TRect; PX,PY:Integer; MorePage:Boolean; Stemp:String; WidthArray:Array[1..24] of Integer; ValueArray:Array[1..24] Of String; ColumnCount,X,Y,NowX,NowY:Integer; NowRow:Integer; Begin Try SX:=GetDeviceCaps(Printer.Handle,logPixelsX)/PPI; SY:=GetDeviceCaps(Printer.Handle,logPixelsY)/PPI; ControlCount:=Self.ControlCount; NowPage:=1; Printer.BeginDoc; MorePage:=True; With Printer Do While MorePage Do Begin MorePage:=False;
//print a page For I:=0 To ControlCount-1 Do Begin AObj:=Self.Controls[I]; ARect:=AObj.BoundsRect; PX:=Round((ARect.Left+4)*SX); PY:=Round((ARect.Top+2)*SY); ARect.Left:=Round(ARect.Left*SX); ARect.Top:=Round(ARect.Top*SY); ARect.Right:=Round(ARect.Right*SX); ARect.Bottom:=Round(ARect.Bottom*SY); If FShowBorder Then If ((AObj Is TEdit) OR (AObj Is TDBEdit) OR (AObj Is TMaskEdit) OR (AObj Is TDateTimePicker) OR (AObj Is TComboBox) OR (AObj Is TDbComboBox) OR (AObj Is TMemo) OR (AObj Is TDBmemo) OR (AObj Is TDBGrid) OR (AObj Is TStringGrid)) Then Begin Canvas.Pen.Width:=2; Canvas.MoveTo(ARect.Left,ARect.Top); Canvas.LineTo(ARect.Right,ARect.Top); Canvas.LineTo(ARect.Right,ARect.Bottom); Canvas.LineTo(ARect.Left,ARect.Bottom); Canvas.LineTo(ARect.Left,ARect.Top); Canvas.Pen.Width:=1; End; If AObj Is TLabel Then Begin Stemp:=Uppercase(TLabel(AObj).Caption); Canvas.Font:=TLabel(AObj).Font; If Stemp='%UP%' Then Begin If NowPage>1 Then Canvas.TextOut(ARect.Left,ARect.Top,'接上页'); End Else If Stemp='%DOWN%' Then Canvas.TextOut(ARect.Left,ARect.Top,'接下页') Else If Stemp='%PAGE%' Then Canvas.TextOut(ARect.Left,ARect.Top,'第 '+IntToStr(NowPage)+' 页') Else If Stemp='%DATE%' Then Canvas.TextOut(ARect.Left,ARect.Top,'日期:'+FormatDateTime('YYYY-MM-DD',Now)) Else If Stemp='%TIME%' Then Canvas.TextOut(ARect.Left,ARect.Top,'时间:'+FormatDateTime('HH:MM:SS',Now)) Else Canvas.TextOut(ARect.Left,ARect.Top,TLabel(AObj).Caption); End Else If AObj Is TDBText Then Begin Try If Not TDBText(AObj).DataSource.DataSet.Active Then Continue; Canvas.Font:=TDBText(AObj).Font; Canvas.TextOut(ARect.Left,ARect.Top,TDBText(AObj).Field.AsString); Except End; End Else If AObj Is TEdit Then Begin Canvas.Font:=TEdit(AObj).Font; Canvas.TextOut(PX,PY,TEdit(AObj).Text); End Else If AObj Is TDBEdit Then Begin Try If Not TDBEdit(AObj).DataSource.DataSet.Active Then Continue; Canvas.Font:=TDBEdit(AObj).Font; Canvas.TextOut(PX,PY,TDBEdit(AObj).Field.AsString); Except End; End Else If AObj Is TMaskEdit Then Begin Canvas.Font:=TMaskEdit(AObj).Font; Canvas.TextOut(PX,PY,TMaskEdit(AObj).Text); End Else If AObj Is TDateTimePicker Then Begin Canvas.Font:=TDateTimePicker(AObj).Font; If TDateTimePicker(AObj).ShowCheckBox Then If TDateTimePicker(AObj).Checked Then Stemp:='■' Else Stemp:='□'; If TDateTimePicker(AObj).Kind=dtkDate Then Stemp:=Stemp+FormatDateTime('YYYY-MM-DD',TDateTimePicker(AObj).Date) Else Stemp:=Stemp+FormatDateTime('HH:MM:SS',TDateTimePicker(AObj).Time); Canvas.TextOut(PX,PY,Stemp); End Else If AObj Is TBevel Then Begin If TBevel(AObj).Shape=bsBottomLine Then Begin Canvas.MoveTo(ARect.Left,ARect.Bottom); Canvas.LineTo(ARect.Right,ARect.Bottom); End Else If TBevel(Aobj).Shape=bsTopLine Then Begin Canvas.MoveTo(ARect.Left,ARect.Top); Canvas.LineTo(ARect.Right,ARect.Top); End Else If TBevel(AObj).Shape=bsLeftLine Then Begin Canvas.MoveTo(ARect.Left,ARect.Top); Canvas.LineTo(ARect.Left,ARect.Bottom); End Else If TBevel(AObj).Shape=bsRightLine Then Begin Canvas.MoveTo(ARect.Right,ARect.Top); Canvas.LineTo(ARect.Right,ARect.Bottom); End Else If TBevel(AObj).Shape=bsBox Then Begin Canvas.MoveTo(ARect.Left,ARect.Top); Canvas.LineTo(ARect.Right,ARect.Bottom); End Else Begin Canvas.MoveTo(ARect.Left,ARect.Top); Canvas.LineTo(ARect.Right,ARect.Top); Canvas.LineTo(ARect.Right,ARect.Bottom); Canvas.LineTo(ARect.Left,ARect.Bottom); Canvas.LineTo(ARect.Left,ARect.Top); End;
End Else If AObj Is TComboBox Then Begin Canvas.Font:=TComboBox(AObj).Font; Canvas.TextOut(PX,PY,TComboBox(AObj).Text); End Else If AObj Is TDBComboBox Then Begin If Not TDBComboBox(AObj).DataSource.DataSet.Active Then Continue; Canvas.Font:=TDBComboBox(AObj).Font; Canvas.TextOut(PX,PY,TDBComboBox(AObj).Field.AsString); End Else If AObj Is TCheckBox Then Begin Canvas.Font:=TCheckBox(AObj).Font; If TCheckBox(AObj).Checked Then Canvas.TextOut(PX,PY,'■'+TCheckBox(AObj).Caption) Else Canvas.TextOut(PX,PY,'□'+TCheckBox(AObj).Caption); End Else If AObj Is TDBCheckBox Then Begin If Not TDBCheckBox(AObj).DataSource.DataSet.Active Then Continue; Canvas.Font:=TDBCheckBox(AObj).Font; If TDBCheckBox(AObj).Checked Then Canvas.TextOut(PX,PY,'■'+TDBCheckBox(AObj).Caption) Else Canvas.TextOut(PX,PY,'□'+TDBCheckBox(AObj).Caption); End Else If AObj Is TRadioButton Then Begin Canvas.Font:=TRadioButton(AObj).Font; If TRadioButton(AObj).Checked Then Canvas.TextOut(PX,PY,'●'+TRadioButton(AObj).Caption) Else Canvas.TextOut(PX,PY,'◎'+TRadioButton(AObj).Caption); End Else If AObj Is TChart Then Begin TChart(AObj).DrawToMetaCanvas(Canvas,ARect); End {Else If AObj Is TDBChart Then Begin TDBChart(AObj).DrawToMetaCanvas(Canvas,ARect); End} Else If AObj Is TImage Then Begin Canvas.StretchDraw(ARect,TImage(AObj).Picture.Graphic); End Else If AObj Is TDBImage Then Begin Canvas.StretchDraw(ARect,TDBImage(AObj).Picture.Graphic); End Else If AObj Is TDBGrid Then Begin Canvas.Font:=TDBGrid(AObj).Font; ColumnCount:=TDBGrid(AObj).Columns.Count; If ColumnCount>24 Then ColumnCount:=24; NowX:=ARect.Left; For X:=0 To ColumnCount-1 Do Begin WidthArray[X+1]:=Round(TDBGrid(AObj).Columns[X].Width*SX); ValueArray[X+1]:=''; NowX:=NowX+WidthArray[X+1]; If NowX>ARect.Right Then Begin ColumnCount:=X; Break; End; End; //draw DBGrid Title NowX:=ARect.Left; NowY:=ARect.Top; For X:=0 To ColumnCount-1 Do Begin Canvas.TextOut(NowX+4,NowY+2,TDBGrid(AObj).Columns[X].Field.DisplayLabel); NowX:=NowX+WidthArray[X+1]; End; NowY:=NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY); Canvas.Pen.Width:=2; Canvas.MoveTo(ARect.Left,NowY); Canvas.LineTo(ARect.Right,NowY); Canvas.Pen.Width:=1; //draw records While Not TDBGrid(AObj).DataSource.DataSet.Eof Do Begin //draw a record NowX:=ARect.Left; For X:=0 To ColumnCount-1 Do Begin If TDBGrid(AObj).Columns[X].Field.AsString<>ValueArray[X+1] Then Begin ValueArray[X+1]:=TDBGrid(AObj).Columns[X].Field.AsString; Canvas.TextOut(NowX+8,NowY+2,TDBGrid(AObj).Columns[X].Field.AsString); End Else
Canvas.TextOut(NowX+8,NowY+2,TDBGrid(AObj).Columns[X].Field.AsString); NowX:=NowX+WidthArray[X+1]; End; TDBGrid(AObj).DataSource.DataSet.Next; NowY:=NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY); If (NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY))>ARect.Bottom Then Break; Canvas.MoveTo(ARect.Left,NowY); Canvas.LineTo(ARect.Right,NowY); NowY:=NowY+Round(4*SY); End; //draw lines Canvas.Pen.Width:=2; NowX:=ARect.Left; For X:=1 To ColumnCount-1 Do Begin NowX:=NowX+WidthArray[X]; Canvas.MoveTo(NowX,ARect.Top); Canvas.LineTo(NowX,ARect.Bottom); End; Canvas.Pen.Width:=1; End Else If AObj Is TStringGrid Then Begin Canvas.Font:=TStringGrid(AObj).Font; ColumnCount:=TStringGrid(AObj).ColCount; If ColumnCount>24 Then ColumnCount:=24; NowX:=ARect.Left; NowY:=ARect.Top; For X:=0 To ColumnCount-1 Do Begin WidthArray[X+1]:=Round(TStringGrid(AObj).ColWidths[X]*SX); NowX:=NowX+WidthArray[X+1]; If NowX>ARect.Right Then Begin ColumnCount:=X; Break; End; End; //draw NowRow:=0; While NowRow<TStringGrid(AObj).RowCount Do Begin //draw a record NowX:=ARect.Left; For X:=0 To ColumnCount-1 Do Begin Canvas.TextOut(NowX+8,NowY+2,TStringGrid(AObj).Cells[X,NowRow]); NowX:=NowX+WidthArray[X+1]; End; Inc(NowRow); NowY:=NowY+Round((ABS(TStringGrid(AObj).Font.Height)+4)*SY); If (NowY+Round((ABS(TStringGrid(AObj).Font.Height)+4)*SY))>ARect.Bottom Then Break; Canvas.MoveTo(ARect.Left,NowY); Canvas.LineTo(ARect.Right,NowY); NowY:=NowY+Round(4*SY); End; //draw lines Canvas.Pen.Width:=2; NowX:=ARect.Left; For X:=1 To ColumnCount-1 Do Begin NowX:=NowX+WidthArray[X]; Canvas.MoveTo(NowX,ARect.Top); Canvas.LineTo(NowX,ARect.Bottom); End; Canvas.Pen.Width:=1; End; End; //if need more page continue If AGrid=Nil Then Break; If AGrid Is TDBGrid Then If Not TDBGrid(AGrid).DataSource.DataSet.Eof Then MorePage:=True; If MorePage Then NewPage;
不过TNND,QuickRpt只有DCU,没有Pas文件
类似WORD里边的一个东西,我忘了
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Printers, StdCtrls, DBCtrls, Mask, ComCtrls, Grids, DBGrids,
Chart;type
TPPanel = class(TPanel)
private
{ Private declarations }
FShowBorder:Boolean;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
Procedure Print(AGrid:TObject;PPI:Integer);
Procedure About; Property ShowBorder:Boolean Read FShowBorder Write FShowBorder;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('Standard', [TPPanel]);
end;Procedure TPPanel.About;
Begin
Application.MessageBox('PPanel 作者:彭富章 2000.03','关于 PPanel',MB_OK+MB_ICONINFORMATION);
End;Procedure TPPanel.Print(AGrid:TObject;PPI:Integer);
Var SX,SY:Real;
NowPage:Integer;
ControlCount,I,N:Integer;
AObj:TControl;
ARect:TRect;
PX,PY:Integer;
MorePage:Boolean;
Stemp:String; WidthArray:Array[1..24] of Integer;
ValueArray:Array[1..24] Of String;
ColumnCount,X,Y,NowX,NowY:Integer; NowRow:Integer;
Begin
Try
SX:=GetDeviceCaps(Printer.Handle,logPixelsX)/PPI;
SY:=GetDeviceCaps(Printer.Handle,logPixelsY)/PPI; ControlCount:=Self.ControlCount; NowPage:=1;
Printer.BeginDoc;
MorePage:=True;
With Printer Do
While MorePage Do
Begin
MorePage:=False;
//print a page
For I:=0 To ControlCount-1 Do
Begin
AObj:=Self.Controls[I];
ARect:=AObj.BoundsRect; PX:=Round((ARect.Left+4)*SX);
PY:=Round((ARect.Top+2)*SY); ARect.Left:=Round(ARect.Left*SX);
ARect.Top:=Round(ARect.Top*SY);
ARect.Right:=Round(ARect.Right*SX);
ARect.Bottom:=Round(ARect.Bottom*SY); If FShowBorder Then
If ((AObj Is TEdit) OR (AObj Is TDBEdit) OR (AObj Is TMaskEdit) OR (AObj Is TDateTimePicker) OR (AObj Is TComboBox)
OR (AObj Is TDbComboBox) OR (AObj Is TMemo) OR (AObj Is TDBmemo) OR (AObj Is TDBGrid) OR (AObj Is TStringGrid)) Then
Begin
Canvas.Pen.Width:=2;
Canvas.MoveTo(ARect.Left,ARect.Top);
Canvas.LineTo(ARect.Right,ARect.Top);
Canvas.LineTo(ARect.Right,ARect.Bottom);
Canvas.LineTo(ARect.Left,ARect.Bottom);
Canvas.LineTo(ARect.Left,ARect.Top);
Canvas.Pen.Width:=1;
End; If AObj Is TLabel Then
Begin
Stemp:=Uppercase(TLabel(AObj).Caption); Canvas.Font:=TLabel(AObj).Font; If Stemp='%UP%' Then
Begin
If NowPage>1 Then
Canvas.TextOut(ARect.Left,ARect.Top,'接上页');
End
Else If Stemp='%DOWN%' Then
Canvas.TextOut(ARect.Left,ARect.Top,'接下页')
Else If Stemp='%PAGE%' Then
Canvas.TextOut(ARect.Left,ARect.Top,'第 '+IntToStr(NowPage)+' 页')
Else If Stemp='%DATE%' Then
Canvas.TextOut(ARect.Left,ARect.Top,'日期:'+FormatDateTime('YYYY-MM-DD',Now))
Else If Stemp='%TIME%' Then
Canvas.TextOut(ARect.Left,ARect.Top,'时间:'+FormatDateTime('HH:MM:SS',Now))
Else
Canvas.TextOut(ARect.Left,ARect.Top,TLabel(AObj).Caption);
End
Else If AObj Is TDBText Then
Begin
Try
If Not TDBText(AObj).DataSource.DataSet.Active Then Continue; Canvas.Font:=TDBText(AObj).Font;
Canvas.TextOut(ARect.Left,ARect.Top,TDBText(AObj).Field.AsString);
Except
End;
End
Else If AObj Is TEdit Then
Begin
Canvas.Font:=TEdit(AObj).Font;
Canvas.TextOut(PX,PY,TEdit(AObj).Text);
End
Else If AObj Is TDBEdit Then
Begin
Try
If Not TDBEdit(AObj).DataSource.DataSet.Active Then Continue; Canvas.Font:=TDBEdit(AObj).Font;
Canvas.TextOut(PX,PY,TDBEdit(AObj).Field.AsString);
Except
End;
End
Else If AObj Is TMaskEdit Then
Begin
Canvas.Font:=TMaskEdit(AObj).Font;
Canvas.TextOut(PX,PY,TMaskEdit(AObj).Text);
End
Else If AObj Is TDateTimePicker Then
Begin
Canvas.Font:=TDateTimePicker(AObj).Font;
If TDateTimePicker(AObj).ShowCheckBox Then
If TDateTimePicker(AObj).Checked Then
Stemp:='■'
Else
Stemp:='□'; If TDateTimePicker(AObj).Kind=dtkDate Then
Stemp:=Stemp+FormatDateTime('YYYY-MM-DD',TDateTimePicker(AObj).Date)
Else
Stemp:=Stemp+FormatDateTime('HH:MM:SS',TDateTimePicker(AObj).Time); Canvas.TextOut(PX,PY,Stemp);
End
Else If AObj Is TBevel Then
Begin
If TBevel(AObj).Shape=bsBottomLine Then
Begin
Canvas.MoveTo(ARect.Left,ARect.Bottom);
Canvas.LineTo(ARect.Right,ARect.Bottom);
End
Else If TBevel(Aobj).Shape=bsTopLine Then
Begin
Canvas.MoveTo(ARect.Left,ARect.Top);
Canvas.LineTo(ARect.Right,ARect.Top);
End
Else If TBevel(AObj).Shape=bsLeftLine Then
Begin
Canvas.MoveTo(ARect.Left,ARect.Top);
Canvas.LineTo(ARect.Left,ARect.Bottom);
End
Else If TBevel(AObj).Shape=bsRightLine Then
Begin
Canvas.MoveTo(ARect.Right,ARect.Top);
Canvas.LineTo(ARect.Right,ARect.Bottom);
End
Else If TBevel(AObj).Shape=bsBox Then
Begin
Canvas.MoveTo(ARect.Left,ARect.Top);
Canvas.LineTo(ARect.Right,ARect.Bottom);
End
Else
Begin
Canvas.MoveTo(ARect.Left,ARect.Top);
Canvas.LineTo(ARect.Right,ARect.Top);
Canvas.LineTo(ARect.Right,ARect.Bottom);
Canvas.LineTo(ARect.Left,ARect.Bottom);
Canvas.LineTo(ARect.Left,ARect.Top);
End;
Else If AObj Is TComboBox Then
Begin
Canvas.Font:=TComboBox(AObj).Font;
Canvas.TextOut(PX,PY,TComboBox(AObj).Text);
End
Else If AObj Is TDBComboBox Then
Begin
If Not TDBComboBox(AObj).DataSource.DataSet.Active Then Continue; Canvas.Font:=TDBComboBox(AObj).Font;
Canvas.TextOut(PX,PY,TDBComboBox(AObj).Field.AsString);
End
Else If AObj Is TCheckBox Then
Begin
Canvas.Font:=TCheckBox(AObj).Font;
If TCheckBox(AObj).Checked Then
Canvas.TextOut(PX,PY,'■'+TCheckBox(AObj).Caption)
Else
Canvas.TextOut(PX,PY,'□'+TCheckBox(AObj).Caption);
End
Else If AObj Is TDBCheckBox Then
Begin
If Not TDBCheckBox(AObj).DataSource.DataSet.Active Then Continue; Canvas.Font:=TDBCheckBox(AObj).Font;
If TDBCheckBox(AObj).Checked Then
Canvas.TextOut(PX,PY,'■'+TDBCheckBox(AObj).Caption)
Else
Canvas.TextOut(PX,PY,'□'+TDBCheckBox(AObj).Caption);
End
Else If AObj Is TRadioButton Then
Begin
Canvas.Font:=TRadioButton(AObj).Font;
If TRadioButton(AObj).Checked Then
Canvas.TextOut(PX,PY,'●'+TRadioButton(AObj).Caption)
Else
Canvas.TextOut(PX,PY,'◎'+TRadioButton(AObj).Caption);
End
Else If AObj Is TChart Then
Begin
TChart(AObj).DrawToMetaCanvas(Canvas,ARect);
End
{Else If AObj Is TDBChart Then
Begin
TDBChart(AObj).DrawToMetaCanvas(Canvas,ARect);
End}
Else If AObj Is TImage Then
Begin
Canvas.StretchDraw(ARect,TImage(AObj).Picture.Graphic);
End
Else If AObj Is TDBImage Then
Begin
Canvas.StretchDraw(ARect,TDBImage(AObj).Picture.Graphic);
End
Else If AObj Is TDBGrid Then
Begin
Canvas.Font:=TDBGrid(AObj).Font; ColumnCount:=TDBGrid(AObj).Columns.Count;
If ColumnCount>24 Then ColumnCount:=24; NowX:=ARect.Left;
For X:=0 To ColumnCount-1 Do
Begin
WidthArray[X+1]:=Round(TDBGrid(AObj).Columns[X].Width*SX);
ValueArray[X+1]:='';
NowX:=NowX+WidthArray[X+1];
If NowX>ARect.Right Then
Begin
ColumnCount:=X;
Break;
End;
End; //draw DBGrid Title
NowX:=ARect.Left;
NowY:=ARect.Top;
For X:=0 To ColumnCount-1 Do
Begin
Canvas.TextOut(NowX+4,NowY+2,TDBGrid(AObj).Columns[X].Field.DisplayLabel);
NowX:=NowX+WidthArray[X+1];
End; NowY:=NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY);
Canvas.Pen.Width:=2;
Canvas.MoveTo(ARect.Left,NowY);
Canvas.LineTo(ARect.Right,NowY);
Canvas.Pen.Width:=1; //draw records
While Not TDBGrid(AObj).DataSource.DataSet.Eof Do
Begin
//draw a record
NowX:=ARect.Left;
For X:=0 To ColumnCount-1 Do
Begin
If TDBGrid(AObj).Columns[X].Field.AsString<>ValueArray[X+1] Then
Begin
ValueArray[X+1]:=TDBGrid(AObj).Columns[X].Field.AsString;
Canvas.TextOut(NowX+8,NowY+2,TDBGrid(AObj).Columns[X].Field.AsString);
End
Else
End; TDBGrid(AObj).DataSource.DataSet.Next;
NowY:=NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY);
If (NowY+Round((ABS(TDBGrid(AObj).Font.Height)+4)*SY))>ARect.Bottom Then
Break; Canvas.MoveTo(ARect.Left,NowY);
Canvas.LineTo(ARect.Right,NowY);
NowY:=NowY+Round(4*SY);
End; //draw lines
Canvas.Pen.Width:=2;
NowX:=ARect.Left;
For X:=1 To ColumnCount-1 Do
Begin
NowX:=NowX+WidthArray[X];
Canvas.MoveTo(NowX,ARect.Top);
Canvas.LineTo(NowX,ARect.Bottom);
End;
Canvas.Pen.Width:=1;
End
Else If AObj Is TStringGrid Then
Begin
Canvas.Font:=TStringGrid(AObj).Font; ColumnCount:=TStringGrid(AObj).ColCount;
If ColumnCount>24 Then ColumnCount:=24; NowX:=ARect.Left;
NowY:=ARect.Top;
For X:=0 To ColumnCount-1 Do
Begin
WidthArray[X+1]:=Round(TStringGrid(AObj).ColWidths[X]*SX);
NowX:=NowX+WidthArray[X+1];
If NowX>ARect.Right Then
Begin
ColumnCount:=X;
Break;
End;
End; //draw
NowRow:=0;
While NowRow<TStringGrid(AObj).RowCount Do
Begin
//draw a record
NowX:=ARect.Left;
For X:=0 To ColumnCount-1 Do
Begin
Canvas.TextOut(NowX+8,NowY+2,TStringGrid(AObj).Cells[X,NowRow]);
NowX:=NowX+WidthArray[X+1];
End; Inc(NowRow);
NowY:=NowY+Round((ABS(TStringGrid(AObj).Font.Height)+4)*SY);
If (NowY+Round((ABS(TStringGrid(AObj).Font.Height)+4)*SY))>ARect.Bottom Then
Break; Canvas.MoveTo(ARect.Left,NowY);
Canvas.LineTo(ARect.Right,NowY);
NowY:=NowY+Round(4*SY);
End; //draw lines
Canvas.Pen.Width:=2;
NowX:=ARect.Left;
For X:=1 To ColumnCount-1 Do
Begin
NowX:=NowX+WidthArray[X];
Canvas.MoveTo(NowX,ARect.Top);
Canvas.LineTo(NowX,ARect.Bottom);
End;
Canvas.Pen.Width:=1;
End;
End; //if need more page continue
If AGrid=Nil Then
Break; If AGrid Is TDBGrid Then
If Not TDBGrid(AGrid).DataSource.DataSet.Eof Then
MorePage:=True; If MorePage Then
NewPage;
Inc(NowPage);
End;
Finally
Printer.EndDoc;
End;
End;end.
我现在知道怎么回事了
要求是要象WORD一样能够给表格自动调整行间距之类的
还有就是能调整表格的位置
大家帮忙
和WORD的功能差不多!
原来是这样
我还以为真是自动的呢?
同为河北老乡
给你顶建议:查看WORD宏,看完之后这样的问题就很容易解决了就