Delphi 打印TDBGrid
如何在不安装或下载组件的情况下打印DBGrid 或Delphi 打印TDBGrid,delphi,tdbgrid,Delphi,Tdbgrid,如何在不安装或下载组件的情况下打印DBGrid 或 如何将DBGrid的数据获取到RichEdit中,以便从那里打印数据?数据感知控件从DataSource属性获取数据,请使用该属性。但是,您必须手动遍历它,这是不可能的(没有第三方库/组件)。您可以在网格中循环并手动将其全部放入richedit。 但为什么要重新发明轮子呢。只需使用一个报表组件。 在Delphi7-delphi2010上安装了rave组件 您需要能够为每个字段计算出适当的打印宽度,大致如下: function PrintFiel
如何将DBGrid的数据获取到RichEdit中,以便从那里打印数据?数据感知控件从DataSource属性获取数据,请使用该属性。但是,您必须手动遍历它,这是不可能的(没有第三方库/组件)。您可以在网格中循环并手动将其全部放入richedit。 但为什么要重新发明轮子呢。只需使用一个报表组件。
在Delphi7-delphi2010上安装了rave组件 您需要能够为每个字段计算出适当的打印宽度,大致如下:
function PrintFieldWidth(Field: TField): Integer;
var
CharWidth: Integer; // an average character width
TitleWidth: Integer; // the width of the field title
FieldWidth: Integer; // the width of the field content
begin
CharWidth := Printer.Canvas.TextWidth('0');
TitleWidth := Printer.Canvas.TextWidth(Field.DisplayName);
FieldWidth := Field.DisplayWidth*CharWidth;
if TitleWidth > FieldWidth then
Result := TitleWidth+CharWidth
else
Result := FieldWidth+CharWidth;
end;
然后遍历所有记录,并遍历每个字段进行打印
procedure PrintText(S: String; X, Y, W, H: Integer);
begin
Printer.Canvas.TextRect(Rect(X,Y,X+W,Y+H),S);
end;
procedure PrintHeader(DataSet: TDataSet; X, Y, H: Integer);
var
I: Integer; // record loop
W: Integer; // field width
begin
for I := 0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[I].Visible then
begin
W := PrintFieldWidth(DataSet.Fields[I]);
PrintText(DataSet.Fields[I].FieldName, X, Y, W, H);
X := X + W;
end;
end;
end;
procedure PrintRecord(DataSet: TDataSet; X, Y, H: Integer);
var
I: Integer; // record loop
W: Integer; // field width
begin
for I := 0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[I].Visible then
begin
W := PrintFieldWidth(DataSet.Fields[I]);
PrintText(DataSet.Fields[I].AsString, X, Y, W, H);
X := X + W;
end;
end;
end;
procedure PrintDataSet(DataSet: TDataSet; X, Y: Integer);
var
OldPos: TBookmark;
H: Integer; // line height
begin
if DataSet <> nil then
begin
H := Printer.Canvas.TextHeight('0');
SaveAfterScroll := DataSet.AfterScroll;
DataSet.AfterScroll := nil;
try
DataSet.DisableControls;
OldPos := DataSet.GetBookmark;
DataSet.First;
PrintHeader(DataSet, X, Y, H);
Y := Y + H * 2;
while not DataSet.Eof do
begin
PrintRecord(DataSet, X, Y, H);
Y := Y + H;
DataSet.Next;
end;
DataSet.GotoBookmark(OldPos);
DataSet.FreeBookmark(OldPos);
finally
DataSet.AfterScroll := SaveAfterScroll;
DataSet.EnableControls;
end; // try
end;
end;
过程打印文本(S:String;X,Y,W,H:Integer);
开始
Printer.Canvas.TextRect(Rect(X,Y,X+W,Y+H),S);
结束;
过程PrintHeader(数据集:TDataSet;X,Y,H:整数);
变量
I:整数;//记录循环
W:整数;//场宽
开始
对于I:=0到DataSet.FieldCount-1 do
开始
如果DataSet.Fields[I]可见,则
开始
W:=PrintFieldWidth(DataSet.Fields[I]);
PrintText(DataSet.Fields[I].FieldName,X,Y,W,H);
X:=X+W;
结束;
结束;
结束;
过程打印记录(数据集:TDataSet;X,Y,H:整数);
变量
I:整数;//记录循环
W:整数;//场宽
开始
对于I:=0到DataSet.FieldCount-1 do
开始
如果DataSet.Fields[I]可见,则
开始
W:=PrintFieldWidth(DataSet.Fields[I]);
PrintText(DataSet.Fields[I].AsString,X,Y,W,H);
X:=X+W;
结束;
结束;
结束;
过程PrintDataSet(数据集:TDataSet;X,Y:整数);
变量
OldPos:TBookmark;
H:整数;//线高
开始
如果数据集为零,则
开始
H:=Printer.Canvas.TextHeight('0');
SaveAfterScroll:=DataSet.AfterScroll;
DataSet.AfterScroll:=nil;
尝试
DataSet.DisableControls;
OldPos:=DataSet.GetBookmark;
数据集。首先;
打印头(数据集,X,Y,H);
Y:=Y+H*2;
而不是DataSet.Eof do
开始
打印记录(数据集,X,Y,H);
Y:=Y+H;
数据集。下一步;
结束;
DataSet.GotoBookmark(OldPos);
DataSet.FreeBookmark(OldPos);
最后
DataSet.AfterScroll:=SaveAfterScroll;
DataSet.EnableControls;
完尝试
结束;
结束;
您需要添加一些代码来处理分页符。这是一个学校项目,该项目在课堂上无人参与,我们可能不会下载或安装新组件,因为有人在安装组件时破坏了系统。你能给我举一个如何使用rave组件的例子吗?赛尔夫,我不使用rave。我使用ReportBuilder。但在delphi7-delphi2010上,Rave报告是正常的。示例:但是如果您没有de IDE上的组件。然后您必须循环到您的数据中。感谢您提供此信息