Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> освобождение памяти при удалении узлов в дереве 
V
    Опции темы
uwannadie
Дата 4.4.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



эх, а я то думал, что у меня индусский код... 
пойду шаманить дальше...
--------------------
PM MAIL   Вверх
Dom
Дата 4.4.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Попробуй FullExpand вызвать для дерева, и потом сделай Clear. При этом дерево должно память освободить. И связанных с этим утечек памяти не будет.
Это конечно не очень красиво, но пока не пойму как иначе сделать.
PM MAIL   Вверх
kami
Дата 4.4.2010, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Dom, точно!
Код

procedure TForm1.FillTreeviewWithFiles(directory: string;
  pTree: TVirtualStringTree; pNode: PVirtualNode);
var
  Mysearch: TSearchRec;
  FldrNode: PVirtualNode;
  FileData: PFileInfo;
begin
  Directory := IncludeTrailingPathDelimiter(Directory);
  if FindFirst(Directory + '*.*', faDirectory, Mysearch) = 0 then
    begin
      repeat
      //ïîèñê ïàïîê
        if ((Mysearch.Attr and faDirectory) = faDirectory) and (Mysearch.Name[1] <> '.') then
          begin
            pNode := pTree.AddChild(pNode, nil);
            FileData := pTree.GetNodeData(pNode);
            if Assigned(FileData) then
              begin
                FileData.FileName := Directory + Mysearch.Name;
                FileData.TreeName := Mysearch.Name;

                FileData.FilePriority := fpNormal;
                FileData.ImageIndex := 0;
                pNode.States := pNode.States + [vsInitialized, vsInitialUserData]; // ключевой момент.
              end;
            FldrNode := pNode.Parent;
            FillTreeviewWithFiles(Directory + Mysearch.Name, pTree, pNode);
            pNode := FldrNode;
          end;
      until FindNext(Mysearch) <> 0;
      FindClose(Mysearch);
    end;

  FldrNode := pNode;
  if FindFirst(Directory + '*.*', $23, Mysearch) = 0 then
    begin
      repeat
        pNode := pTree.AddChild(FldrNode, nil);
        FileData := pTree.GetNodeData(pNode);
        if Assigned(FileData) then
          begin
            FileData.FileName := Directory + Mysearch.Name;

            FileData.TreeName := Mysearch.Name;

            FileData.FilePriority := fpNormal;
            FileData.ImageIndex := 1;

            pNode.States := pNode.States + [vsInitialized, vsInitialUserData];
          end;
      until FindNext(Mysearch) <> 0;
      FindClose(Mysearch);
    end;
end;


Утечек =0, проверено на папке C:\
PM MAIL WWW   Вверх
Dom
Дата 5.4.2010, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



kami, да, работать будет. Но мне кажется что в таком красивом компоненте инициализация должна делаться как-то изящнее. Смотрел исходники, так пока и не увидел где и в какой момент добавляется состояние vsInitialized добавленному узлу, который отображается, видимо где-то при попытке вывести содержимое узла на экран он и инициализируется. Но суть не в этом, вопрос в том как правильно инициализировать узел?

И кстати если уже решать проблему в лоб, то достаточно добавить vsInitialized, состояние vsInitialUserData используется немного для других целей.
PM MAIL   Вверх
uwannadie
Дата 5.4.2010, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



ну если не ошибаюсь, то в мануалах по VT написано, что дочерние элементы в дерево рекомендуется добавлять через события
OnInitChildren, а метод AddChild не рекомендуется использовать.

Это сообщение отредактировал(а) uwannadie - 5.4.2010, 02:52
--------------------
PM MAIL   Вверх
Dom
Дата 5.4.2010, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Точно! Тоже нашел про инициализацию и добавление узлов в дерево через RootNodeCount, OnInitNode, OnInitChildren. Красиво конечно.
Только тут могут возникнуть заморочки с динамическим добавлением данных в узел, т.е. в рассматриваемом случае надо генерировать записи на лету при первом обращении к узлу. Либо надо где-то хранить предварительно созданный и заполненный список/массив исходных записей, что уже само по себе не есть правильно, т.к. при инициализации придется копировать эти данные в дерево. Следовательно расход памяти возрастет.
PM MAIL   Вверх
Dom
Дата 5.4.2010, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Вот процедура для ручной инициализации узла и если надо его наследников - ReinitNode.
Так что если нет желания переходить на OnInitNode и OnInitChildren, то после заполнения узлов по AddChild, надо пробежаться по ним всем и инициализировать этой процедурой. И тогда утечек не будет.
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.