Delphi, VirtualStringTree — классы (объекты) вместо записей

Мне нужно использовать класс вместо записи для узла VirtualStringTree.

Должен ли я объявить это стандартным (но в данном случае - хитрым) способом:

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

или я должен использовать напрямую TMyObject? Если да - то как?! Как насчет назначения (конструкции) объекта и его освобождения?

Заранее спасибо м.


person migajek    schedule 18.02.2010    source источник


Ответы (4)


  1. Настройка размера данных для хранения объекта

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

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

    or

    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;
    
person APZ28    schedule 18.02.2010

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

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

или вы можете попробовать назначить его напрямую

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

person zz1433    schedule 18.02.2010

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

person Linas    schedule 18.02.2010
comment
Это должен быть комментарий к ответу Альдо. - person jpfollenius; 19.02.2010

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

person jpfollenius    schedule 18.02.2010