Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблема с реестор в Windows


Автор: Ak47black 3.5.2007, 17:47
Здраствуйте, врятли кто ответит на этот вопрос ,но всетаки попытаютаюсь объяснить проблему.

Что я пытаюсь сделать:
    Пытаюсь сделать дерево папок(TTreeView) на такое-же как в самой проге RegEdit.exe (при этом это дерево будет отображаться на удаленном компе, но этот момент неоноситься к проблеме), вообшем делаю дерево и заполняю его структуру по мере продвижения по папкам.
Тоесть когда юзер нажимает на крестик что-бы просмореть подпапки, то в этот момент прога получает подпапки и отоброжает их.

Проблема:
     Например юзер открыл(пролез по какомо-ту количеству папок) и сделал какие-то изменения и заходет обновить папки и вот тут возникает следушая проблема - некоторые папки например 
Цитата

HKEY_CLASSES_ROOT

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

Автор: _hunter 3.5.2007, 17:54
что-то проблемы совсем не увидел...

Автор: Ak47black 3.5.2007, 17:57
Цитата

что-то проблемы совсем не увидел... 

Так ты наверно не доконца опять непрочитал или неврубился, ну или такого неделал. Короч если невъежаешь то непиши smile

Добавлено @ 18:01
Уточню именно в чем проблема например путь
Цитата

HKEY_CLASSES_ROOT\.ad\OpenWithList

Сначала добавляю в дерево папку HKEY_CLASSES_ROOT
потом подпапки HKEY_CLASSES_ROOT, а потом что-бы к .ad добавить OpenWithList надо все перебирать иначе невижу вариантов как найти папку в дереве .ad куда добавить далше по дереву и этот процесс очень много времени занимает если две папки открыты например 
Цитата

HKEY_CLASSES_ROOT\.accdt\ShellEx
HKEY_CLASSES_ROOT\.ad\OpenWithList

то половины минуты

Автор: _hunter 3.5.2007, 18:23
зачем все перебирать? ты добавляеш к папке ".ad" значит у тебя есть ее хендл/указатель вот к этой папке и добавляй...

Добавлено через 1 минуту и 1 секунду
Цитата(Ak47black @  3.5.2007,  17:57 Найти цитируемый пост)
Так ты наверно не доконца опять непрочитал или неврубился, ну или такого неделал.

или (что более вероятно) ты так объяснил...

Автор: Ak47black 3.5.2007, 18:41
Ну во нарисую
user posted image
Значит делаю так 
разбил строку 
Цитата

HKEY_CLASSES_ROOT\.ad\OpenWithList

на массив из элементов(или уровней на картинке) HKEY_CLASSES_ROOT, .ad, OpenWithList
беру первый элемент, добовляю в TTreeView и запомянаю его, запрашиваю его дочерние папки, довляю эти дочерние папки как дочернии,
перебираю все дочернии нахожу с именем .ad и запрашиваю по этому пкти дочернии папки, добовляю дочернии ишю OpenWithList и т.д.
Так понятно, ну незнаю просто такая проблема что трудно объяснить саму суть.  smile 
Вот и этото процесс перебирания меня не устраивает, потому что очень много времени занимает.

Автор: _hunter 3.5.2007, 18:58
а зачем ты этим перебирательством занимаешся? заполняй детей пока они есть, как кончились -- поднимайся на уровень выше...
т.е.:
запросил всех детей корня, добавил первого, запросил всех его детей, запросил все детей ребенка, тут детей нету -- запрашивай всех детей второго узла корня (все это естественно рекурсивно)

Автор: MetalFan 3.5.2007, 19:30
извини конечн... но из-за ошибок(опечаток?) и построения предложений даже после 3го прочтения не понял, в чем проблема.

Автор: Ak47black 3.5.2007, 19:37
Извиняюсь за то что несмог описать проблему, просто трудно описать. Народ еше раз Sorry 
Шас посмотрю как-бы тут лучше объяснить.

Автор: Ak47black 3.5.2007, 20:39
Дано:
    1.TtreeView в котором отображаеться дерево папок из реестра.
    2.Массив из строк OpenedFolders, каждая строка представляет путь открытой папки из TtreeView , уточню – открытой папкой я сшитаю ту попку которая находитьяся не на самом последнем уровне ,а на предпоследнем относительно своих дочерних.
    Например: HKEY_CLASSES_ROOT\CrystalReports102.DTSConnection.0\CLSID тоесть CLSID будет иметь один уровень дочених.

Цель:
Построить такое-же дерево папок рееста с учетом того что эти в реестре произошли какието изменения.(Refresh)

Мой тот способ плохо работает, как предлогаете сделать?

_hunter, говорит похожий способ что и я, так вот чем он плох
Например возмем
HKEY_CLASSES_ROOT\CrystalReports102.DTSConnection.0\CLSID 
Делаем рекурсию
Сначала запрашиваем ‘детей’ smile HKEY_CLASSES_ROOT, получаем список детей, приклеиваем как Child к HKEY_CLASSES_ROOT ну а потом перебором ишем в этих детях, детя по имени CrystalReports102.DTSConnection.0 что-бы к нему детей приклеить от CLSID, ато никак или я нетак понял. Так вот когда по большому количеству детей ишем то это очень много времени занимает, особенно когда дети TTreeNode.


Очень надеюсь что в это раз понятно написал smile.

Автор: MetalFan 3.5.2007, 20:58
а ты видел, как системный диалог выбора папки работает...
что-то типа того:
1) "строишь" дерево сразу до необходимого узла без "лишних" детей.
2) В фоновом режиме подгружаешь "недостающих" детишек

Автор: Ak47black 3.5.2007, 21:05
Ну чтото такое я вчера придумал сам, но тут другая проблема появляеться.
Порядок отображения A-Z меняеться, а что-бы его пересортировать нужен опять перебор) получаеться та-же проблема.
Опять новые дубинки  smile .
  smile мда интересная проблема.

Автор: MetalFan 3.5.2007, 21:43
да не особо то и интересная.
просто пораскинуть мозгами.
зачем сортировать после подгрузки всех детей, если можно подгрузить их так, чтобы уже все было отсортировано....

Автор: _hunter 4.5.2007, 11:31
без полного перескана реестра ты и так не узнаеш где у тебя изменения произошли... а если делается полный перескан -- то и дерево строй заново.
или ты на уведомления об изменениях подписался? тогда храни рядом с хендлом папки жендл узла своего дерева.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)