Листинг 7.23.
Первоначальная инициализация дерева разделов реестра
procedure TForm1.FormCreate(Sender: TObject);
var
item: TTreeNode;
begin
//Формирование списка корневых разделов реестра
item := keys.Items.AddChild(nil, \'HKEY_CLASSES_ROOT\');
item.Data := Pointer(HKEY_CLASSES_ROOT);
CheckSubKeys(item);
item := keys.Items.AddChild(nil, \'HKEY_CURRENT_USER\');
item.Data := Pointer(HKEY_CURRENT_USER);
CheckSubKeys(item);
item := keys.Items.AddChild(nil, \'HKEY_LOCAL_MACHINE\');
item.Data := Pointer(HKEY_LOCAL_MACHINE);
CheckSubKeys(item);
item := keys.Items.AddChild(nil, \'HKEY_USERS\');
item.Data := Pointer(HKEY_USERS);
CheckSubKeys(item);
item := keys.Items.AddChild(nil, \'HKEY_CURRENT_CONFIG\');
item.Data := Pointer(HKEY_CURRENT_CONFIG);
CheckSubKeys(item);
end;
Процедура CheckSubKeys, вызываемая для каждого нового элемента дерева (листинг 7.23), реализована следующим образом (листинг 7.24).
Листинг 7.24.
Оформление элемента дерева в зависимости от наличия вложенных разделов
procedure TForm1.CheckSubKeys(item: TTreeNode);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
//Проверка, есть ли в разделе реестра вложенные подразделы
reg.RootKey := GetRootKey(item);
if reg.OpenKeyReadOnly(GetKeyPath(item)) then
begin
if reg.HasSubKeys then
begin
//Добавляем фиктивный элемент (чтобы показывался "+" для
//разворачивания раздела). Одновременно помечаем
//фиктивный элемент
keys.Items.AddChild(item, \'\').Data := Pointer(-1);
end;
reg.CloseKey;
end;
reg.Free;
end;
По сравнению с примером (дерево каталогов), рассмотренным в подразд. «Построение дерева каталогов» разд. 4.2, определение наличия дочерних разделов реестра – относительно легковесная операция, поэтому эту проверку производим сразу при составлении списка подразделов. Как и в только что упомянутом примере из гл. 4, мы добавляем в дерево фиктивный дочерний элемент для тех элементов дерева, для которых соответствующие им разделы реестра содержат подразделы.
Важно то, что фиктивный элемент помечается значением -1. Как раз по наличию дочернего элемента с полем Data, равным -1, можно определить, зачитывалось ли содержимое раздела, соответствующего определенному элементу дерева. Содержимое раздела читается при разворачивании элемента дерева (листинг 7.25).