Caption := ValueNames[i];
DataType := Reg.GetDataType(ValueNames[i]);
Case DataType of rdString: s := Reg.ReadString(ValueNames[i]);
rdlnteger: s:= 'Ox'tlntToHex(Reg.Readlnteger(ValueNames[i]),8);
rdBinary: s:='Binary';
else s:= '???';
end;
Subltems.Add(s);
Imagelndex :=1;
end;
ValueNames.Free;
end;
procedure TForml.ShowSubKeys(ParentNode: TTreeNode;depth: Integer);
var ParentKey: string;
KeyNames : TStringList;
Keylnfo : TRegKeylnfo;

CurNode : TTreeNode; i : Integer; begin Cursor := crHourglass; TreeViewl.Items.BeginUpdate; ParentKey := GetFullNodeName(ParentNode); if ParentKeyo'' then Reg.OpenKeyReadOnly(ParentKey) else

Reg.OpenKeyReadOnly('\') ;
Reg.GetKeylnfo(Keylnfo) ;
if Keylnfo.NumSubKeys<=0 then Exit;
KeyNames := TStringList.Create;
Reg.GetKeyNames(KeyNames);

While ParentNode.GetFirstChildonil do ParentNode.GetFirstChild.Delete; if (KeyNames.Count>0) then for i:=0 to KeyNames.Count-1 do

begin
Reg.OpenKeyReadOnly(ParentKeyt'\'tKeyNames[i]);
Reg.GetKeylnfo(Keylnfo);
CurNode := TreeViewl.Items.AddChild(ParentNode,KeyNames[i]);
if Keylnfo.NumSubKeys>0 then begin
TreeViewl. Items .AddChild (CurNode,1 1 ) ;
end;
end;
KeyNames.Free;
TreeViewl.Items.EndUpdate;
Cursor := crDefault;
end;
procedure TForml.TreeViewlExpanded(Sender: TObject;
Node: TTreeNode);
begin ShowSubKeys(Node,1);
end;
procedure TForml.TreeViewlGetlmagelndex(Sender: TObject;
Node: TTreeNode);
begin
with Node do begin
if Expanded then ImageIndex := 2 else Imagelndex := 3;
end;
end;

end.

Для работы с системным реестром используется объект VCL TRegistry, удачно инкапсулирующий все предназначенные для этого функции Windows API. В обработчике события onCreate главной формы создается объект Reg, а также к списку Listviewi добавляются два заголовка (свойство columns).

Пояснений требует принцип построения дерева ключей. Во-первых, это приложение отображает только один из системных ключей (а именно hkey_localjmachine); при желании его можно заменить или добавить остальные. Во-вторых, попытка построить все "развесистое" дерево ключей сразу займет слишком много времени и наверняка не понравится пользователям. Вспомним, ведь утилита Registry Editor работает довольно быстро. Значит, придется строить дерево динамически - создавать и показывать дочерние узлы в момент развертывания родительского узла. Для этого используется событие OnExpand компонента TreeViewl.

Остановимся на секунду. А какие узлы помечать кнопкой разворачивания (с пометкой " + "), ведь у родительского узла еще нет потомков? Выход из положения такой - в момент построения ключа проверить, есть ли у него дочерние. Если да, то к нему добавляется один (фиктивный) пустой ключ. Его единственная роль - дать системе поставить " +" против родительского узла.

Когда же пользователь щелкнул на кнопке, отмеченной знаком " + ", и родительский узел разворачивается, фиктивный дочерний узел удаляется и вместо него создаются узлы настоящие, полученные путем сканирования реестра (СМ. метод ShowSubKeys).

Снабдим узлы картинками. Для этого в компонент imageListl поместим картинки, соответствующие открытой и закрытой папкам. Напомним, что для отрисовки и смены картинок есть специальные события - OnGetlmagelndex И OnGetSelectedlndex. В ДЭННОМ примере у двух ЭТИХ событий один обработчик: развернутому узлу он сопоставляет картинку раскрытой папки, а свернутому - закрытой.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Октябрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс