2012-07-14 106 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;