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


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

Код

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);



Большое спасибо за внимание, уважаемые

Автор: dm9 22.11.2004, 14:02
Погоди, какая рекурсия? smile Ты что? Ты строй только то, что отображается! Потом, когда юзер нажмёт на крестик (раскрытие раздела), тогда уже и строй этот раздел. Может быть, имеет смысл пройтись по отображаемым разделам и посмотреть, есть ли в них что-нибудь, и нужен ли крестик вообще, но это один вызов на каждый отображаемый элемент!

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