Листинг 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).

...
Перейти на страницу:

Поиск

Похожие книги