Изменить текст ячейки корневого узла в 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;
Другие вопросы по тегам