N
NetDigger
Здравствуйте, уважаемые! Вот встала задача создать аналог РегЕдита для Вин. Все работает, просто замечательно, но долго =) Приведу примеры рекурсивной процедурыпостроения дерева реестра, а Вы, если вдруг кто знает посоветуйте - как оптимизировать данное или вообще может не стоит делать таким способом
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 );
ShowRegister( THKEYs, 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);
BufSize := sizeof(BufSize);
inc(Index)
End;
Хммм, странные проблемы возникли со вставкой кода - все черное получается
Большое спасибо за внимание, уважаемые
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 );
ShowRegister( THKEYs, 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);
BufSize := sizeof(BufSize);
inc(Index)
End;
Хммм, странные проблемы возникли со вставкой кода - все черное получается
Большое спасибо за внимание, уважаемые