【问题标题】:Edit a root node celltext in VirtualTreeView在 VirtualTreeView 中编辑根节点单元格文本
【发布时间】:2012-07-14 07:07:18
【问题描述】:

我想更改现有虚拟(根)节点的单元格文本。我可以更改数据,但我必须刷新整个 TreeView 以便 GetText 再次被触发。是否有更简单的方法或可能的方法来仅刷新 1 个根节点而不是整个树?

感谢您的帮助。

【问题讨论】:

  • InvalidateNode 函数总是强制节点重新绘制,因此也会触发OnGetText 事件。你必须做错事。如果你愿意,我会给你一个证明。

标签: delphi delphi-7 virtualtreeview tvirtualstringtree


【解决方案1】:

在以下代码中,我尝试模拟您的节点更新事件。这里由按钮单击Button1Click 事件表示。在这里,如果您单击按钮,数据记录中的值将增加,并且节点将被强制重新绘制(将触发OnGetText 事件,您将在该记录中准备好获取该新增加的值)。在您的真实代码中,您需要执行以下操作:

  • 找到你要更新的节点(我找到了TopNode :-)
  • 更新该节点的数据记录(在我的例子中,Count 的值是递增的)
  • 为那个节点调用InvalidateNode(什么会触发一些事件的虚拟事件链,但OnGetText会在其中)

type
  PTreeData = ^TTreeData;
  TTreeData = record
    Title: string;
    Count: Integer;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  TreeData: PTreeData;
  TreeNode: PVirtualNode;
begin
  // this is just for memory leaks report
  ReportMemoryLeaksOnShutdown := True;
  // initialize data size for our data record
  VirtualTree.NodeDataSize := SizeOf(TTreeData);
  // add one node and store it to the TreeNode variable
  TreeNode := VirtualTree.AddChild(nil);
  // get the pointer to just created node data record
  TreeData := VirtualTree.GetNodeData(TreeNode);
  // and assign some values to that data record
  TreeData.Title := 'Count: ';
  TreeData.Count := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  TreeData: PTreeData;
  TreeNode: PVirtualNode;
begin
  // now I take the the top node just as an example
  TreeNode := VirtualTree.TopNode;
  // get the pointer to its data record
  TreeData := VirtualTree.GetNodeData(TreeNode);
  // increase the value in data record for this node
  TreeData.Count := TreeData.Count + 1;
  // and force the node to repaint, what will except
  // other events trigger also the OnGetText one
  VirtualTree.InvalidateNode(TreeNode);
end;

procedure TForm1.VirtualTreeGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
var
  TreeData: PTreeData;
begin
  // here I'll get the pointer to data of the currently refreshed cell's node
  TreeData := VirtualTree.GetNodeData(Node);
  // and return the caption of the cell
  CellText := TreeData.Title + IntToStr(TreeData.Count);
end;

procedure TForm1.VirtualTreeFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  TreeData: PTreeData;
begin
  // this is here because of VT memory leaks, so get the pointer to data
  TreeData := Sender.GetNodeData(Node);
  // and finalize them
  Finalize(TreeData^);
end;

【讨论】:

    【解决方案2】:

    此代码是用编辑框文本更改编辑所选节点文本

    procedure Form1.btnEditTextClick(Sender: TObject);
    var
      Data: PTreeData;
    begin
      Data := VST.GetNodeData(VST.FocusedNode);
    
      Data.Title := Edit2.Text;
      VST.InvalidateNode(VST.FocusedNode);
    
    end;
    

    【讨论】:

      猜你喜欢
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      相关资源
      最近更新 更多