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 за прекрасный инструмент.

Спонсор поста: пропонуємо вам переглянути блог, який веде блогер mcreper про партнерські програми в інтернеті.


  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>