我想更改現有虛擬(根)節點的單元格文本。我可以更改數據,但我必須刷新整個TreeView,以便GetText get再次被觸發。有沒有更簡單的方法或可能的方法來刷新只有1根節點,而不是整個樹?在VirtualTreeView中編輯根節點celltext
謝謝你的幫助。
我想更改現有虛擬(根)節點的單元格文本。我可以更改數據,但我必須刷新整個TreeView,以便GetText get再次被觸發。有沒有更簡單的方法或可能的方法來刷新只有1根節點,而不是整個樹?在VirtualTreeView中編輯根節點celltext
謝謝你的幫助。
在下面的代碼中,我試圖模擬您的節點更新事件。這裏的按鈕點擊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;
非常感謝。這工作完美! – 2012-07-15 03:40:39
這個代碼改變編輯與編輯框中的文本
procedure Form1.btnEditTextClick(Sender: TObject);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(VST.FocusedNode);
Data.Title := Edit2.Text;
VST.InvalidateNode(VST.FocusedNode);
end;
的'InvalidateNode'函數總是迫使節點重新繪製選擇的節點文本,從而也引發了'OnGetText'事件。你必須做錯事。如果你願意,我會發佈一個證明。 – TLama 2012-07-14 21:19:28