Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to display registry in A treeView in Delphi 7

I want to display a treeview with all the registry information in it ( i.e all the subkeys ). I have put together the following Fn to do the same. But i am getting the info of only one Key, not all. What is missing in my code ?

 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;

the call to the Function is

  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;

Note that i am not getting any error, just that info is incomplete

like image 591
CyprUS Avatar asked Nov 11 '11 05:11

CyprUS


1 Answers

Some problems:

  1. You are using OpenKey which attempts to open the key with write access. Instead you should use OpenKeyReadOnly. If you really do mean to write to those keys then you will have to run elevated as an administrator.
  2. You are failing to close the keys once you have finished with them.

More seriously, your use of relative registry keys is not sufficient. I believe you will need to pass around the full path to the key. I wrote a little demo console app to show what I mean:

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.
like image 157
David Heffernan Avatar answered Sep 19 '22 03:09

David Heffernan