4

既存の仮想 (ルート) ノードのセル テキストを変更したいと考えています。データを変更することはできますが、GetText が再度起動されるように TreeView 全体を更新する必要があります。ツリー全体ではなく、1 つのルート ノードのみを更新する簡単な方法または可能な方法はありますか?

ご協力ありがとうございました。

4

2 に答える 2

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;
于 2012-07-14T21:50:14.767 に答える