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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение дерева реестра, Как оптимизировать алгоритм 
:(
    Опции темы
NetDigger
Дата 11.11.2004, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, уважаемые! Вот встала задача создать аналог РегЕдита для Вин. Все работает, просто замечательно, но долго =) Приведу примеры рекурсивной процедурыпостроения дерева реестра, а Вы, если вдруг кто знает посоветуйте - как оптимизировать данное или вообще может не стоит делать таким способом

Код

Const
 THKEYs : Array[1..6] of HKEY = ( HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE,
                                  HKEY_USERS, HKEY_CURRENT_CONFIG, HKEY_DYN_DATA );
 THKEYStrings: Array[1..6] of String = ( 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE',
                                         'HKEY_USERS', 'HKEY_CURRENT_CONFIG', 'HKEY_DYN_DATA' );


procedure ShowRegister( Key: HKEY; Node: TTreeNode; NextToAdd: String; NKey: Integer);

Var
 Index : LongInt;
 Buffer: Array[0..100] of Char;
 Node1 : TTreeNode;
 Key1: HKEY;
 Ind1: Integer;
 NextToAdd1: String; // следующий ключ для открытия (для поиска всех его подразделов

Begin
 Index := 0;
 While RegEnumKey(key, Index, Buffer,sizeof(Buffer)) = 0 do Begin
   NextToAdd1 := NextToAdd + StrPas(Buffer) + '\';
   Node1 := Form1.TreeView1.Items.AddChild( Node, Buffer );
   If not( NKey < 4 ) then begin // поставил специально - иначе комп думает ну ооочень долго
                                                 // потому как HKLM, HKCR очень объемны

     RegOpenKeyEx( THKEYs[NKey], PChar(NextToAdd1), 0, KEY_ALL_ACCESS, key1 );
     ShowRegister( key1, Node1, NextToAdd1, NKey );
   End;
   inc (index );
 End;
End;

procedure TForm1.FormShow(Sender: TObject);
Var
 I : Integer;
 Node: TTreeNode;
begin
 For i := 1 to 6 do begin
   Node := Form1.TreeView1.Items.Add(nil, THKEYStrings[i] );
   ShowRegister( THKEYs[i], Node, '',i  );

 End;



Вроде все правильно перенес.
Кроме того возникает еще один вопрос - как вывывести значения ключей (параметр - значение) -как в регедите при щелчке на узле? Проблема возникает с типами и как их выводить - пример далее: (полностью процедуру выводить не буду - только ключевой момент, который в принципе не работает =)
Код

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);

Var
 BufData: DWORD;
 Key, Key1: HKey;
 Index: Integer;
 Buffer: Array[0..100] of Char;
 ValueType: DWORD;
 BufSize, BufDataSize: DWORD;
 ListItem: TListItem;
Begin
 // открываем все ключи, находим хэндлэ и т.п. - все работает правильно, нужно лишь понять
    как это дело правильно выводить
RegOpenKeyEx( key, PChar(PathToKey), 0, KEY_ALL_ACCESS, key1 );
   While RegEnumValue( Key1, Index, Buffer,
                       BufSize, nil, @ValueType, @BufData{nil}, @BufDataSize ) = ERROR_SUCCESS do Begin
//       ShowMessage( StrPas(Buffer)+ IntToStr(BufData) );

      ListItem := ListView1.Items.Add;
      ListItem.Caption := StrPas(Buffer);



Большое спасибо за внимание, уважаемые
PM MAIL   Вверх
dm9
Дата 22.11.2004, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Погоди, какая рекурсия? smile Ты что? Ты строй только то, что отображается! Потом, когда юзер нажмёт на крестик (раскрытие раздела), тогда уже и строй этот раздел. Может быть, имеет смысл пройтись по отображаемым разделам и посмотреть, есть ли в них что-нибудь, и нужен ли крестик вообще, но это один вызов на каждый отображаемый элемент!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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