Разработка и эксплуатация АИС: Методическое пособие для выполнения лабораторных работ № 9-15, страница 13

‘ top    = ’ + Form1.Top +

‘ width  = ’ + Form1.Width +

‘ height = ’ + Form1.Height +

‘ font   = ’ + Form1.Font.Name +

‘ fsize  = ‘ + Form1.Font.Size + ‘;’;

settings_sql.ExecSQL;

CanClose := TRUE;

end;

Т.о. можно реализовать хранение программной информации в БД. Данный пример, конечно, не имеет практического смысла, т.к. эту же функциональность намного проще и удобнее организовать с помощью системного реестра или INI-файлов. Но общий метод работы с информацией позволяет придумать и реализовать более интересное и полезное применение данной технологии. Можно, например, сохранять в БД индексы иконок, присваиваемых пользователем тому или иному пункту представления информации, а сами иконки хранить в ресурсном файле (например, .DLL). Или можно хранить в БД информацию для построения деревьев (например, для компонента TTreeView). Рассмотрим простейший пример реализации этой задачи. Предположим, что мы хотим сохранить в БД одноуровневое дерево, листья которого имеют такие характеристики, как название, отображаемая иконка, содержание (ссылка на файл, информацию из которого нужно отобразить в расположенном на форме компоненте TMemo при выборе данного листа). Вся эта информация должна храниться в БД с возможностью последующего добавления новых листьев, а так же редактирования и удаления имеющихся. БД в данном примере прекрасно подходит в качестве контейнера для хранения такой информации.

Создадим в нашей БД еще одну таблицу и назовем ее “dbtree”. Примерная схема этой таблицы выглядит так:

Имя столбца

Тип данных

Комментарий (назначение)

num

INT

Порядковый номер (Первичный ключ)

caption

CHAR(20)

Заголовок (название)

icon_index

INT

Индекс иконки в файле графических ресурсов

file_name

CHAR(256)

Имя связанного файла

Создадим процедуру, строящую дерево в компоненте TTreeView (назовем его DBTree1) основываясь на информации, полученной из БД c помощью компонента TQuery (с именем tree_sql):

procedure TForm1.BuildTree;

var

rootNode : TTreeNode;

nodeName : String;

begin

tree_sql.Close;

tree_sql.SQL.Text := ‘SELECT num, caption, icon_index, file_name

FROM bdtree

ORDER BY num;’;

tree_sql.Open;

tree_sql.First;

rootNode:=TTreeNode.Items.Add(nil, ‘Корневой узел’);

while not tree_sql.Eof do begin

nodeName := tree_sql.FieldByName(‘caption’).AsString;

with DBTree1.Items.AddChild(rootNode, nodeName) do begin

ImageIndex := tree_sql.FieldByName(‘icon_index’).AsInteger;

Hint := tree_sql.FieldByName(‘file_name’).AsString;

end;

tree_sql.Next;

end;

DBTree1.Repaint;

end;

В данном примере сначала из БД извлекаются все записи, касающиеся дерева. Затем идет построчный цикл по всем извлеченным кортежам данных, в котором к корневому узлу дерева (созданному перед циклом) добавляются дочерние узлы с именами, полученными из БД. Для каждого узла помимо имени устанавливаются отображаемой рядом с именем узла изображение (свойство ImageIndex – номер изображения из подключенного к TTreeView через свойство Images компонента TImageList) и назначается всплывающая подсказка (свойство Hint), в которую записывается имя связанного с узлом файла. Саму подсказку можно и не отображать (выставив в FALSE свойство ShowHint компонента TTreeView), используется она потому, что в ней удобно хранить строковое значение как еще одно свойство компонента.

В приведенном примере строится одноуровневое дерево, что не всегда достаточно для решения возникающих на практике задач. Расширить возможности этого метода можно представив записи БД связанным списком и сохраняя указатель на родительские или дочерние компоненты в свойствах лита.