Здравствуйте, уважаемые! Вот встала задача создать аналог РегЕдита для Вин. Все работает, просто замечательно, но долго =) Приведу примеры рекурсивной процедурыпостроения дерева реестра, а Вы, если вдруг кто знает посоветуйте - как оптимизировать данное или вообще может не стоит делать таким способом
| Код | 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);
|
Большое спасибо за внимание, уважаемые |