Изменить текст ячейки корневого узла в VirtualTreeView
Я хотел бы изменить текст ячейки существующего виртуального (корневого) узла. Я могу изменить данные, но мне нужно обновить весь TreeView, чтобы GetText get снова запускался. Есть ли более простой способ или возможный способ обновления только 1 корневого узла, а не всего дерева?
Спасибо за помощь.
2 ответа
В следующем коде я попытался смоделировать событие обновления вашего узла. Здесь представлено нажатие кнопки 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;
Этот код изменяет редактировать текст выбранного узла с текстом поля редактирования
procedure Form1.btnEditTextClick(Sender: TObject);
var
Data: PTreeData;
begin
Data := VST.GetNodeData(VST.FocusedNode);
Data.Title := Edit2.Text;
VST.InvalidateNode(VST.FocusedNode);
end;