Apr 14

Finalize

Я часто работаю с VirtualTreeView. Очень удобный и мощный компонент, да еще бесплатный и с открытым кодом. Работу с данными я обычно веду следующим образом:

type

  PData = ^TData;

  TData = record

    Caption: WideString;

    Data: WideString;

    Count: Integer;

  end;

 

var

  lData: PData;

begin

  lData := VT.GetNodeData(Node);

  if Assigned(lData) then

  begin

    // Тут код

  end;

end;

 

Т.е., все данные храню в самом дереве. Знаю, что это не самый лучший способ. Например, во многих случаях, особенно когда необходима не стандартная сортировка или нестандартная обработка данных, правильнее было бы хранить данные в отдельном массиве, а в дереве держать только указатели на нужные данные, но так уж я привык.

И у моего подхода есть один минус. Точнее он есть у любого подхода, связанного с VT - необходимо при удалении узла, удалить и данные, связанные с этим узлом. Я всегда делал так:

var

  lData: PData;

begin

  lData := VT.GetNodeData(Node);

  if Assigned(lData) then

  begin

    lData^.Caption := EmptyWideStr;

    lData^.Data := EmptyWideStr;

  end;

end;

 

А если стринговых полей будет пара сотен? Сегодня узнал, что можно все делать проще:

var

  lData: PData;

begin

  lData := VT.GetNodeData(Node);

  if Assigned(lData) then

    Finalize(lData^);

end;

 

И все. Действительно - "век живи - век учись". Спасибо VICTAR за подсказку и Codegear за прекрасный инструмент.


  1. Deniz
     Add karma Subtract karma  +0
    Цитировать.

    Я обычно делаю так:
    TMyNodeData = class(TObject)
    public
    { Public declarations }
    IspID : Integer;
    IspName : string;
    IspDate : TDate;
    Expanded : Boolean;

    end;

    procedure TfmDokIn.IspTreeDeletion(Sender: TObject; Node: TTreeNode);
    var NodeData : TMyNodeData;
    begin
    if Node.Data nil then begin
    NodeData:=TMyNodeData(Node.Data);
    if IsDeleteNode then // delete from DataSet
    NodeData.Free;
    end;
    end;

    1
  2. aktuba
     Add karma Subtract karma  +0
    Цитировать.
    Комментарий автора

    А зачем хранить данные в классе? Это же дополнительные данные для хранения самих данных…

    2

Поделитесь вашими мыслями

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>