2016-07-21 1 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

또 다른 방법은 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; 
관련 문제