首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印TDBGrid

打印TDBGrid
EN

Stack Overflow用户
提问于 2011-09-21 16:32:50
回答 3查看 3.9K关注 0票数 3

如何在不安装或下载组件的情况下打印DBGrid?

如何将数据库网格的数据转换成RichEdit,以便从那里打印出来?

EN

回答 3

Stack Overflow用户

发布于 2011-09-21 16:40:06

数据感知控件从DataSource属性获取数据,使用该属性。不过,你必须手动遍历它,没有即时的方法(没有第三方库/组件)。

票数 2
EN

Stack Overflow用户

发布于 2011-09-21 20:57:54

您需要能够计算出每个字段的适当打印宽度,如下所示:

代码语言:javascript
复制
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;

然后遍历所有记录,并遍历要打印的每个字段。

代码语言:javascript
复制
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;

您需要添加一些代码来处理分页符。

票数 1
EN

Stack Overflow用户

发布于 2011-09-21 19:05:35

您可以循环到您的网格,并将其全部手动放入您的richedit中。但为什么要重新发明轮子呢?只需使用报告组件即可。在Delphi7- delphi2010上,您已经安装了rave组件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7496813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档