Как отобразить реестр в TreeView в Delphi 7 - PullRequest
6 голосов
/ 11 ноября 2011

Я хочу отобразить древовидную структуру со всей информацией реестра (то есть со всеми подразделами). Я собрал следующий Fn, чтобы сделать то же самое. Но я получаю информацию только одного ключа, а не всех. Чего не хватает в моем коде?

 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;

вызов функции

  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;

Обратите внимание, что я не получаю никакой ошибки, просто эта информация неполная

Ответы [ 2 ]

4 голосов
/ 11 ноября 2011

Некоторые проблемы:

  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.
0 голосов
/ 06 января 2014

попробуйте это: -

procedure TForm1.Button1Click(Sender: TObject);
begin

  TreeView1.Items.Clear;
  path := Edit1.Text;
 // reg.RootKey := HKEY_LOCAL_MACHINE ;
  TreeView1.Items.BeginUpdate;

  drawtreeview(nil, path);
  TreeView1.Items.EndUpdate;

end;

procedure TForm1.drawtreeview( node: TTreeNode; name: string);
var
  i: Integer;
  NewTreeNode: TTreeNode;
  str, str2 : TStringList;
  reg : TRegistry;
begin
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  i := 0;
  if reg.OpenKeyReadOnly(name) then
  begin
    str := TStringList.create;
    reg.GetKeyNames(str);

    for i := 0 to str.Count - 1 do
    begin
      NewTreeNode := TreeView1.Items.AddChild(node, str.Strings[i]);
      if reg.HasSubKeys  then
      begin
        drawtreeview(NewTreeNode,  name + '\' + str.Strings[i]);
      end
      else
      ShowMessage('no sub keys');
    end;

  end;
  reg.CloseKey;
  reg.Free;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...