2010-02-18 4 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.

ответ

8
  1. DataSize Установка для проведения объекта

    vstTree.NodeDataSize := SizeOf(TMyObject); 
    
  2. Получить держатель DataSize и привязку к объекту

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

    или

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

    или
    использование метода vstTree.InsertNode

  3. Чтобы освободить объект привязки Подвод событие OnFreeNode

    vstTree.OnFreeNode := FreeNodeMethod; 
    

    с

    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

можно создать экземпляр объекта после получения данных узла, как:

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

или вы можете попробовать и назначить его непосредственно

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

1

И вы можете освободить свой объект Событие OnFreeNode.

+0

Это должно быть комментарий к ответу Альдо. – jpfollenius

1

Просто добавьте ссылку на объект для своей записи. Используйте события OnInitNode и OnFreeNode для создания и уничтожения вашего объекта.

Смежные вопросы