2011-05-18 37 views
0

我需要向TVirtualStringTree插入一些新節點。我用UserData參數使用InsertNode方法。但樹不能顯示任何數據。我如何獲取GetText/FreeNode事件上的userdata?帶有UserData參數的InsertNode在TVirtualStringTree中

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; 

回答

5

在樹中插入用戶數據時,指針存儲在節點的內部記錄中。 GetNodeData不會返回您傳入的指針,而是指向存儲指針的內存指針。因此,您需要對其進行解引用:

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

實際上它取決於您存儲在VT節點中的內容。您可以存儲實際記錄,也可以將指針存儲到記錄中。如果將指針存儲到記錄中,則代碼是正確的,如果將實際記錄存儲在節點中,則該代碼不正確。將節點添加到樹中的代碼不在用戶的示例中,因此我們不知道用戶正在存儲什麼。而這其實可能是個問題! – 2011-05-18 10:43:16

+0

@Cosmin代碼在那裏,請參閱Button1Click。他將指針作爲UserData參數傳遞給InsertNode。 – 2011-05-18 10:46:13

+0

我現在看到它,OP正在存儲指向堆分配記錄的指針。 +1。 – 2011-05-18 10:48:53