如何在Delphi 7中的TreeView中显示注册表

Cyp*_*rUS 6 delphi registry treeview

我想显示一个包含所有注册表信息的树视图(即所有子项).我把以下Fn放在一起做同样的事情.但我得到的只是一个Key的信息,而不是全部.我的代码中缺少什么?

 function TForm1.DisplayKeys(TreeNode : TTreeNode;KeyToSearch:String):String;
 var
  i: Integer;
  RootKey : Integer;
  NewTreeNode : TTreeNode;
  str : TStringList;

 // str2: TStringList;
 begin
   i:=0;

   if reg.OpenKey(KeyToSearch,False) then
   begin
   str:=nil;
   str:=TStringList.create;
   reg.GetKeyNames(str);
   //For all SubKeys
   for i:=0 to str.Count-1 do
   begin
      NewTreeNode:=TreeView1.Items.AddChild(TreeNode, Str.Strings[i]);
      if reg.HasSubKeys then
      begin
        DisplayKeys(NewTreeNode,Str.Strings[i]);
      end;
   end;
 end;
Run Code Online (Sandbox Code Playgroud)

对函数的调用是

  procedure TForm1.FormCreate(Sender: TObject);
  begin
     reg:=nil;
    reg:=TRegistry.create;
    str2:=nil;
    str2:=TStringList.create;
   reg.RootKey:=HKEY_CURRENT_CONFIG;
   TreeView1.Items.BeginUpdate; //prevents screen repaint every time node is added
      DisplayKeys(nil,''); // call to fn here
   TreeView1.Items.EndUpdate; // Nodes now have valid indexes
 end;
Run Code Online (Sandbox Code Playgroud)

请注意,我没有收到任何错误,只是信息不完整

Dav*_*nan 4

一些问题:

  1. 您正在使用OpenKey它尝试以写访问权限打开密钥。相反,你应该使用OpenKeyReadOnly. 如果您确实打算写入这些键,那么您将必须以管理员身份运行提升权限。
  2. 使用完钥匙后,您无法关闭钥匙。

更严重的是,您对相关注册表项的使用是不够的。我相信您需要传递密钥的完整路径。我写了一个小演示控制台应用程序来展示我的意思:

program RegistryEnumerator;

{$APPTYPE CONSOLE}

uses
  Classes, Windows, Registry;

var
  Registry: TRegistry;

procedure DisplayKeys(const Key: string; const Depth: Integer);
var
  i: Integer;
  SubKeys: TStringList;
begin
  if Registry.OpenKeyReadOnly(Key) then begin
    Try
      SubKeys := TStringList.Create;
      Try
        Registry.GetKeyNames(SubKeys);
        for i := 0 to SubKeys.Count-1 do begin
          Writeln(StringOfChar(' ', Depth*2) + SubKeys[i]);
          DisplayKeys(Key + '\' + SubKeys[i], Depth+1);
        end;
      Finally
        SubKeys.Free;
      End;
    Finally
      Registry.CloseKey;
    End;
  end;
end;

begin
  Registry := TRegistry.Create;
  Try
    Registry.RootKey := HKEY_CURRENT_CONFIG;
    DisplayKeys('', 0);
    Readln;
  Finally
    Registry.Free;
  End;
end.
Run Code Online (Sandbox Code Playgroud)

  • @CyprUS我认为如果您查看生成的密钥并与regedit进行比较,您会发现您的列表不完整。我相信您需要维护注册表项的完整绝对路径。相对路径还不够好。请参阅我更新的代码,它演示了我认为应该如何完成。 (2认同)