2010-02-18 2 views
4

VirtualStringTree 노드의 레코드 대신 클래스를 사용해야합니다.Delphi, VirtualStringTree - 레코드 대신 클래스 (객체)

나는 선언해야 그 표준 (그러나이 경우에는 - 교묘 한) 그런 방법 :

PNode = ^TNode; 
TNode = record 
obj: TMyObject; 
end; 
//.. 
var 
fNd: PNode; 
begin 
fNd:= vstTree.getNodeData(vstTree.AddChild(nil)); 
fNd.obj:= TMyObject.Create; 
//.. 

또는 내가 TMyObject 직접 사용해야합니까? 그렇다면 어떻게?! 개체를 할당 (구성)하고 해제하는 것은 어떻습니까?

미리 감사드립니다. m.

fNd:= vstTree.getNodeData(vstTree.AddChild(nil)); 
fnd.obj := TMbyObject.Create; 

를하거나 시도하고 직접

Pointer(Obj) := vstTree.getNodeData(...);

답변

8
  1. 설정 datasize 개체에 datasize 홀더와 결합을 얻기

    vstTree.getNodeData(passed in interested node)^ := your object 
    

    또는

    vstTree.getNodeData(vstTree.AddChild(nil))^ := TMyObject.Create; 
    

    또는
    바인딩 개체를 해제하려면사용 vstTree.InsertNode 방법

  2. 는 알도의 대답에 설명해야

    procedure TFoo.FreeNodeMethod(Sender: TBaseVirtualTree; Node: PVirtualNode); 
    var 
        P: ^TMyObject; 
    begin 
        P := Sender.getNodeData(Node); 
        if P <> nil then 
        begin 
         P^.Free; 
         P^ := nil; //for your safety or you can omit this line 
        end; 
    end; 
    
1

당신은 같이 노드 데이터를 수신 한 후 객체 인스턴스를 만들 수 있습니다 OnFreeNode 이벤트입니다.

1

를 할당 그리고 당신이 개체를 확보 할 수 있었다 :

+0

이 함께 OnFreeNode 이벤트

vstTree.OnFreeNode := FreeNodeMethod; 

를 연결 시설. – jpfollenius

1

레코드에 개체 참조를 추가하기 만하면됩니다. OnInitNodeOnFreeNode 이벤트를 사용하여 개체를 만들고 파괴하십시오.

vstTree.NodeDataSize := SizeOf(TMyObject); 
  • 객체

    를 보유

  • 관련 문제