2012-07-14 107 views
3

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

谢谢你的帮助。

+1

的'InvalidateNode'函数总是迫使节点重新绘制选择的节点文本,从而也引发了'OnGetText'事件。你必须做错事。如果你愿意,我会发布一个证明。 – TLama 2012-07-14 21:19:28

回答

4

在下面的代码中,我试图模拟您的节点更新事件。这里的按钮点击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; 
+1

非常感谢。这工作完美! – 2012-07-15 03:40:39

1

这个代码改变编辑与编辑框中的文本

procedure Form1.btnEditTextClick(Sender: TObject); 
var 
    Data: PTreeData; 
begin 
    Data := VST.GetNodeData(VST.FocusedNode); 

    Data.Title := Edit2.Text; 
    VST.InvalidateNode(VST.FocusedNode); 

end;