Delphi 如何自动展开和打印树视图

Delphi 如何自动展开和打印树视图,delphi,printing,treeview,delphi-xe2,Delphi,Printing,Treeview,Delphi Xe2,我创建了一个应用程序,可以扫描每台计算机,并在树视图中填充硬件、软件和更新/修补程序信息: 我遇到的问题是打印,如何自动展开树视图并将所选计算机的结果发送到打印机?我目前使用的方法是将内容发送到画布(BMP),然后将其发送到打印机,但这并不能仅捕获屏幕上显示的所有内容。有什么建议吗?非常感谢。打印预览的问题是,不可见的零件没有任何图形。(Windows仅绘制控件的可见部分,因此当您使用PrintTo或APIPrintWindow函数时,它只有可见节点可供打印-未显示的内容尚未绘制,因此无法打印

我创建了一个应用程序,可以扫描每台计算机,并在树视图中填充硬件、软件和更新/修补程序信息:


我遇到的问题是打印,如何自动展开树视图并将所选计算机的结果发送到打印机?我目前使用的方法是将内容发送到画布(BMP),然后将其发送到打印机,但这并不能仅捕获屏幕上显示的所有内容。有什么建议吗?非常感谢。

打印预览的问题是,不可见的零件没有任何图形。(Windows仅绘制控件的可见部分,因此当您使用
PrintTo
或API
PrintWindow
函数时,它只有可见节点可供打印-未显示的内容尚未绘制,因此无法打印。)

如果表格布局有效(没有行,只有缩进的级别),最简单的方法是创建文本并将其放入隐藏的
TRichEdit
,然后让
TRichEdit.Print
处理输出。下面是一个例子:

// File->New->VCL Forms Application, then
// Drop a TTreeView and a TButton on the form.
// Add the following for the FormCreate (to create the treeview content)
// and button click handlers, and the following procedure to create
// the text content:

procedure TreeToText(const Tree: TTreeView; const RichEdit: TRichEdit);
var
  Node: TTreeNode;
  Indent: Integer;
  Padding: string;
const
  LevelIndent = 4;
begin
  RichEdit.Clear;
  Node := Tree.Items.GetFirstNode;
  while Node <> nil do
  begin
    Padding := StringOfChar(#32, Node.Level * LevelIndent);
    RichEdit.Lines.Add(Padding + Node.Text);
    Node := Node.GetNext;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  HideForm: TForm;
  HideEdit: TRichEdit;
begin
  HideForm := TForm.Create(nil);
  try
    HideEdit := TRichEdit.Create(HideForm);
    HideEdit.Parent := HideForm;
    TreeToText(TreeView1, HideEdit);
    HideEdit.Print('Printed TreeView Text');
  finally
    HideForm.Free;
  end;
end;

procedure TForm3.FormCreate(Sender: TObject);
var
  i, j: Integer;
  RootNode, ChildNode: TTreeNode;
begin
  RootNode := TreeView1.Items.AddChild(nil, 'Root');
  for i := 1 to 6 do
  begin
    ChildNode := TreeView1.Items.AddChild(RootNode, Format('Root node %d', [i]));
    for j := 1 to 4 do
      TreeView1.Items.AddChild(ChildNode, Format('Child node %d', [j]));
  end;
end;
//文件->新建->VCL表单应用程序,然后
//在窗体上放置一个TTreeView和一个TButton。
//为FormCreate添加以下内容(以创建treeview内容)
//和按钮单击处理程序,并执行以下步骤来创建
//文本内容:
过程树文本(const-Tree:TTreeView;const-RichEdit:TRichEdit);
变量
节点:TTreeNode;
缩进:整数;
填充:字符串;
常数
LevelIndent=4;
开始
RichEdit.Clear;
节点:=Tree.Items.GetFirstNode;
而节点nil do
开始
填充:=StringOfChar(#32,Node.Level*LevelIndent);
RichEdit.Lines.Add(Padding+Node.Text);
Node:=Node.GetNext;
结束;
结束;
程序TForm1.按钮1单击(发送方:TObject);
变量
HideForm:TForm;
隐藏:欺骗;
开始
HideForm:=TForm.Create(nil);
尝试
HideEdit:=TRichEdit.Create(HideForm);
HideEdit.Parent:=HideForm;
TreeToText(TreeView 1,隐藏);
HideEdit.Print('Printed TreeView Text');
最后
HideForm.Free;
结束;
结束;
程序TForm3.FormCreate(发送方:TObject);
变量
i、 j:整数;
RootNode,ChildNode:TTreeNode;
开始
RootNode:=TreeView1.Items.AddChild(nil,'Root');
对于i:=1到6 do
开始
ChildNode:=TreeView1.Items.AddChild(根节点,格式('Root节点%d',[i]);
对于j:=1到4 do
TreeView1.Items.AddChild(ChildNode,格式('ChildNode%d',[j]);
结束;
结束;

只是树视图的文本格式正确吗?还是您想要图形视图?对图形视图不感兴趣,只是树视图的文本,如果格式正确就好了。这个答案不错,但至少在Lazarus中已经有了一种类似SaveToFile的TTreeView方法,它可以为您保存一个tab删除限制的文本文件。(尽管如此,上述方法还是适合生成固定布局文件、HTML等。)