Delphi, VirtualStringTree - классы (объекты) вместо записей - PullRequest
4 голосов
/ 18 февраля 2010

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 19 февраля 2010
  1. Настройка размера данных для объекта удержания

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

    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 голос
/ 19 февраля 2010

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

1 голос
/ 19 февраля 2010

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

1 голос
/ 18 февраля 2010

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

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

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

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

...