2016-07-21 5 views
3

私はTVirtualStringTree(バージョン5.2.2)を持っており、レコードの代わりにノードオブジェクトを追加する必要があります。TVirtualStringTree - レコードの代わりにオブジェクトを追加

質問: Delphi, VirtualStringTree - classes (objects) instead of recordsに記載されている回答はすでに見ていますが、機能していません。

FObjLst.Add(lNode); 

とツリーに追加:

var iPos: Integer; 
    lNode: PVirtualNode; 
    ldata: TNodeElem; 
begin 
    FTreeView.BeginUpdate; 
    for iPos := 0 to FObjLst.Count -1 do 
    begin 
    lNode := FTreeView.AddChild(nil); 
    lData := TNodeElem(FObjLst[iPos]); 
    FTreeView.getNodeData(lNode)^ := lData;//E2015 Operator not aplicable to this operand type 
    FTreeView.ValidateNode(lNode,False); 
    end; 
    FTreeView.EndUpdate; 
end; 

procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; 
    TextType: TVSTTextType; var CellText: UnicodeString); 
var 
Data: TNodeElem; 
begin 
Data := FTreeView.GetNodeData(Node); 
CellText := Data.LogMessage; 
end; 

TNodeElem = class 
    public 
    LineTimeS, LogMessage, MethName: String; 
    LineDate,LineTime: TDateTime; 
    LineDateTime: TDateTime; 
    ElemType: TLogLineType;//ordinal type 
.... 
    end; 

これらのノードはTObjectListをに追加されているように私は、ツリーのノードに追加する

オブジェクトがあります私はE2015 Operator not aplicable to this operand type errorを得る。それは私が私のようなオブジェクトのメンバーにレコードとして追加することができます知っている...おそらく私がここに欠けているものを、非常に単純なもの

です:

TNode = record 
obj: TMyObject; 
end; 

が、私は私は何を理解したいです間違っている。

+1

V5.2.2は最新バージョンではありません。 V6から始めるTVirutalNodeには、タイプキャストを避けるノードを追加または設定するための汎用ヘルパーメソッドがあります。 –

+0

良い点@JoachimMarder。私は柔らかい宝石のウェブページだけを見てきました。柔らかいジャムではありません... – RBA

答えて

4
function AddItem(Item: TNodeElem): PVirtualNode; 
begin 
    Result := FTreeView.InsertNode(nil, amAddChildLast, Item); 
end; 

function GetItem(Node: PVirtualNode): TNodeElem; 
var 
    NodeData: Pointer; 
begin 
    Result := nil; 
    if not Assigned(Node) then 
    exit; 
    NodeData := FTreeView.GetNodeData(Node); 
    if Assigned(NodeData) then 
    Result := TNodeElem(NodeData^); 
end; 
+0

明らか...今、私は愚かであるために頭の上で自分を叩くことができます。 – RBA

0

もう1つの方法は、Tlistにオブジェクトのインデックスを格納することです。 それで、あなたは参照によって作業しません。 悪い参照をチェックする方が簡単です。

procedure TForm1.Button2Click(Sender: TObject); 
var i : Integer; 
begin 
    for i := 0 to Pred(Mylist.count) do 
    VirtualStringTree1.AddChild(nil, pInteger(i)); 
end; 

procedure TForm1.VirtualStringTree1GetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); 
begin 
    NodeDataSize := SizeOf(integer); 
end; 

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; 
    TextType: TVSTTextType; var CellText: string); 
var i : Integer; 
begin 
    if Node = nil then Exit; 
    CellText := 'Unknown'; 
    i := pInteger(Sender.GetNodeData(node))^; 
    if (i >= 0) and (i < Mylist.Count) then begin 
    if Assigned(MyList[i]) then 
     Celltext := TmyObject(MyList[i]).MyText; 
    end; 
end; 
関連する問題