InsertNode с параметром UserData в TVirtualStringTree - PullRequest
0 голосов
/ 18 мая 2011

Мне нужно вставить несколько новых узлов в TVirtualStringTree.Я использую метод InsertNode с параметром UserData.Но дерево не может показать никаких данных.Как я могу получить данные пользователя по событию GetText / FreeNode?

  TMyData = record
    Name: string;
    size: Integer;
  end;
  PMyData = ^TMyData;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  VirtualStringTree1.NodeDataSize := SizeOf(TMyData);
  Randomize;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Data: PMyData;
  Node: PVirtualNode;
begin
  New(Data);
  Data.Name := DateTimeToStr(now);
  Data.size := Random(100);
  Node := VirtualStringTree1.InsertNode(nil, amInsertAfter, Data);
end;

procedure TForm2.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node:
    PVirtualNode);
var
  Data: PMyData;
begin
  Data := Sender.GetNodeData(Node);
  Data.Name := '';
end;

procedure TForm2.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node:
    PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText:
    WideString);
var
  Data: PMyData;
begin
  Data := Sender.GetNodeData(Node);
  case Column of
    0: CellText := Data.Name;
    1: CellText := IntToStr(Data.size);
  end;
end;

1 Ответ

6 голосов
/ 18 мая 2011

Когда вы вставляете пользовательские данные в дерево, ваш указатель сохраняется во внутренней записи узла.GetNodeData не возвращает указатель, который вы передали, это указатель на память, где хранится ваш указатель.Поэтому вам нужно разыменовать его:

Data := PMyData(Sender.GetNodeData(Node)^);
...