175 lines
4.0 KiB
ObjectPascal
175 lines
4.0 KiB
ObjectPascal
unit RegistryDemoMain;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
StdCtrls, ExtCtrls, ComCtrls,
|
|
JclRegistry, JclStrings;
|
|
|
|
type
|
|
TForm1 = class(TForm)
|
|
tvKeys: TTreeView;
|
|
Splitter1: TSplitter;
|
|
lvValues: TListView;
|
|
procedure tvKeysExpanding(Sender: TObject; Node: TTreeNode;
|
|
var AllowExpansion: Boolean);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure tvKeysChange(Sender: TObject; Node: TTreeNode);
|
|
private
|
|
function BuildPath(const Node: TTreeNode): string;
|
|
procedure InitTree;
|
|
function ExtractRootKey(const FullPath: string): string;
|
|
function ExtractKey(const FullPath: string): string;
|
|
function AddChildNode(const Node: TTreeNode; const Text: string): TTreeNode;
|
|
procedure GetKeyInfos(const Node: TTreeNode; var RootKey: HKEY;
|
|
var Key: string);
|
|
public
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
uses
|
|
JclSysUtils;
|
|
|
|
{$R *.DFM}
|
|
|
|
procedure TForm1.InitTree;
|
|
begin
|
|
tvKeys.Items.Clear;
|
|
with tvKeys.Items.AddChild(nil, 'HKEY_CLASSES_ROOT') do
|
|
HasChildren := true;
|
|
|
|
with tvKeys.Items.AddChild(nil, 'HKEY_CURRENT_USER') do
|
|
HasChildren := true;
|
|
|
|
with tvKeys.Items.AddChild(nil, 'HKEY_LOCAL_MACHINE') do
|
|
HasChildren := true;
|
|
|
|
with tvKeys.Items.AddChild(nil, 'HKEY_USERS') do
|
|
HasChildren := true;
|
|
|
|
end;
|
|
|
|
function TForm1.BuildPath(const Node: TTreeNode): string;
|
|
begin
|
|
if Node <> nil then
|
|
Result := BuildPath(Node.Parent) + Node.Text + '\'
|
|
else
|
|
Result := '';
|
|
end;
|
|
|
|
function TForm1.ExtractRootKey(const FullPath: string): string;
|
|
var
|
|
strTmp: string;
|
|
begin
|
|
strTmp := FullPath;
|
|
Result := StrToken(strTmp, '\');
|
|
end;
|
|
|
|
function TForm1.ExtractKey(const FullPath: string): string;
|
|
var
|
|
strTmp: string;
|
|
begin
|
|
strTmp := FullPath;
|
|
StrToken(strTmp, '\');
|
|
Result := strTmp;
|
|
end;
|
|
|
|
procedure TForm1.GetKeyInfos(const Node: TTreeNode; var RootKey: HKEY; var Key: string);
|
|
var
|
|
strTmp,
|
|
strRootKey: string;
|
|
begin
|
|
strTmp := BuildPath(Node);
|
|
strRootKey := ExtractRootKey(strTmp);
|
|
|
|
if strRootKey = 'HKEY_CLASSES_ROOT' then
|
|
RootKey := HKEY_CLASSES_ROOT;
|
|
if strRootKey = 'HKEY_CURRENT_USER' then
|
|
RootKey := HKEY_CURRENT_USER;
|
|
if strRootKey = 'HKEY_LOCAL_MACHINE' then
|
|
RootKey := HKEY_LOCAL_MACHINE;
|
|
if strRootKey = 'HKEY_USERS' then
|
|
RootKey := HKEY_USERS;
|
|
|
|
Key:= ExtractKey(strTmp);
|
|
end;
|
|
|
|
procedure TForm1.tvKeysExpanding(Sender: TObject; Node: TTreeNode; var AllowExpansion: Boolean);
|
|
var
|
|
strTmp,
|
|
Key: string;
|
|
RootKey: HKEY;
|
|
stlSubKeys: TStrings;
|
|
i: Integer;
|
|
NewNode: TTreeNode;
|
|
begin
|
|
GetKeyInfos(Node, RootKey, Key);
|
|
|
|
stlSubKeys := TStringList.Create;
|
|
RegGetKeyNames(RootKey, Key, stlSubKeys);
|
|
|
|
for i := 0 to stlSubKeys.Count - 1 do begin
|
|
strTmp := stlSubKeys[i];
|
|
NewNode := AddChildNode(Node, strTmp);
|
|
if NewNode <> nil then
|
|
NewNode.HasChildren := RegHasSubKeys(RootKey, Key + strTmp);
|
|
end;
|
|
|
|
stlSubKeys.Free;
|
|
|
|
end;
|
|
|
|
function TForm1.AddChildNode(const Node: TTreeNode; const Text: string): TTreeNode;
|
|
var
|
|
i: integer;
|
|
DoesExist: boolean;
|
|
begin
|
|
DoesExist := false;
|
|
Result := nil;
|
|
|
|
for i := 0 to Node.Count - 1 do
|
|
if Node.Item[i].Text = Text then begin
|
|
DoesExist := true;
|
|
break;
|
|
end;
|
|
|
|
if not DoesExist then
|
|
Result := tvKeys.Items.AddChild(Node, Text);
|
|
end;
|
|
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
begin
|
|
InitTree;
|
|
end;
|
|
|
|
procedure TForm1.tvKeysChange(Sender: TObject; Node: TTreeNode);
|
|
var
|
|
strTmp,
|
|
Key: string;
|
|
RootKey: HKEY;
|
|
stlValueNames: TStrings;
|
|
i: integer;
|
|
begin
|
|
lvValues.Items.Clear;
|
|
GetKeyInfos(Node, RootKey, Key);
|
|
|
|
stlValueNames := TStringList.Create;
|
|
if RegGetValueNames(RootKey, Key, stlValueNames) then begin
|
|
for i := 0 to stlValueNames.Count - 1 do begin
|
|
strTmp := stlValueNames[i];
|
|
with lvValues.Items.Add do begin
|
|
Caption := strTmp;
|
|
SubItems.Add(RegReadString(RootKey, Key, strTmp));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
end.
|