2016-07-21 8 views
3

Ich habe einen TVirtualStringTree (Version 5.2.2) und ich muss zu seinen Knoten Objekte anstelle von Datensätzen hinzufügen.TVirtualStringTree - Objekt anstelle von Datensatz hinzufügen

Ich habe bereits die Antworten auf die Frage zur Verfügung gestellt: Delphi, VirtualStringTree - classes (objects) instead of records aber sie funktionieren nicht.

Objekte I des Baumes Knoten hinzufügen möchten sind wie

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

diese Knoten zu einem TObjectList hinzugefügt werden:

FObjLst.Add(lNode); 

und dem Baum hinzugefügt:

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; 

Ich bekomme eine E2015 Operator not aplicable to this operand type error. Es ist wahrscheinlich etwas extrem einfach, was ich hier fehlt ...

Ich weiß, dass ich es als ein Datensatz mit einem Objekt Mitglied wie hinzufügen:

TNode = record 
obj: TMyObject; 
end; 

aber ich möchte verstehen, was ich bin falsch machen.

+1

V5.2.2 ist nicht die neueste Version. Beginnend mit V6 hat TVirutalNode generische Hilfsmethoden, um den Knoten hinzuzufügen oder zu setzen, der Typumwandlungen vermeidet. –

+0

Guter Punkt @JoachimMarder. Ich habe nur auf der Soft-Gems-Webseite geschaut, nicht auf Jam-Soft ... – RBA

Antwort

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

Offensichtlich ... Jetzt kann ich mich über den Kopf schlagen, weil ich dumm bin. – RBA

0

Eine andere Möglichkeit besteht darin, Index des Objekts in Tlist zu speichern. Dann arbeiten Sie nicht als Referenz. Es ist am einfachsten, schlechte Referenz zu überprüfen.

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; 
Verwandte Themen