KeyField на model_id; ListField на Model_name.
У 2-го компонента DBLookupComboBox изменить следующие свойства:
Name на DBCombo_Version; ListSource на DataVersion; KeyField на version_id;
ListField на version.
7.Добавьте на форму два компонента Label (рис. 10.2).
У1-го компонента Label изменить следующие свойства:
Caption на Выберите модель для работы. У 2-го компонента Label изменить следующие свойства:
Caption на Выберите версию модели.
8.Добавьте на форму два компонента Button (рис. 10.2).
У1-го компонента Button изменить следующие свойства:
Name на BCreate_ModelTree;
Caption на Дерево модели с версией.
У 2-го компонента Button изменить следующие свойства:
Name на BCreate_VersionTree;
Caption на Сформировать дерево версий.
9. Добавьте на форму компонент ADOStoredProc (рис. 10.2) и устано- вите ему следующие свойства:
Name на ADOTreeVersion; Connection на ADOConnection1;
ProcedureName на TreeVersion_Model.
10. Добавьте на форму компонент ADOTable (рис. 10.2) и установите ему следующие свойства:
Name на ADOTreeVersion_Temp; Connection на ADOConnection1; TableName на TreeVersion_Temp;
Active на True.
11. В методе Create компонента Form написать следующий код:
procedure TForm1.FormCreate(Sender: TObject); begin
ADOModels.Open;
ADOVersion.Open;
end;
115
Рис. 10.2. Схема формы для работы с версиями
12. В методе Click компонента Button с именем Create_ModelTree на-
писать код, который выполняет прорисовку дерева модели с учетом вы- бранной версии:
procedure TForm1.BCreate_ModelTreeClick(Sender: TObject); var
i: integer; Node_:TTreeNode;
begin
if (DBCombo_Models.KeyValue>0) AND (DBCombo_Version.KeyValue>0) then begin
ADOTreeVersion.Close; ADOTreeVersion_Temp.Close;
ADOTreeVesion.Parameters.ParamByName('idModel').Value:= StrToInt(VarToStr(DBCombo_Models.KeyValue));
ADOTreeVersion.Parameters.ParamByName('VersionIN').Value:= StrToInt(VarToStr(DBCombo_Version.Text));
ADOTreeVersion.ExecProc; ADOTreeVersion_Temp.Open;
ADOView_table.Filter:='Parent_node = null AND model_id = '+ VarToStr(DBCombo_Models.KeyValue);
ADOView_table.Filtered:=True; ADOView_table.Open; ADOView_table.First; Tree.Items.Clear;
116
while not ADOView_table.Eof do
begin
node_:=Tree.Items.AddObject(nil, 'Модель " ' + ADOView_table.FieldByName('model_name').AsString +'"', nil);
Tree.Items.AddChildObject(node_, ADOView_table.FieldByName('Child_Node').AsString, Pointer(ADOView_table.FieldByName('relation_id').asInteger));
ADOView_table.Next;
end; ADOTreeVersion_Temp.First;
while not ADOTreeVersion_Temp.Eof do begin
i := 0;
while i < Tree.Items.Count do
if ( Tree.Items.Item[i].Data = Pointer(ADOTreeVersion_Temp.FieldByName('Parent_relation_id').asInteger) ) AND (VarToStr(ADOTreeVersion_Temp.FieldByName('operation').Value)='i') then
begin
Node_:=Tree.Items.AddChildObject(Tree.Items.Item[i], ADOTreeVersion_Temp.FieldByName('Child_Node').AsString, Pointer(ADOTreeVersion_Temp.FieldByName('relation_id').asInteger));
break;
end else
Inc(i); ADOTreeVersion_Temp.Next;
end;
//удаляем лишние узлы, которые в версии помечены буквой ‘d’ - удалены
ADOTreeVersion_Temp.First;
while not ADOTreeVersion_Temp.Eof do begin
i := 0;
while i < Tree.Items.Count do
if (Tree.Items.Item[i].Data = Pointer(ADOTreeVersion_Temp.FieldByName('relation_id').asInteger) ) AND (VarToStr(ADOTreeVersion_Temp.FieldByName('operation').Value)='d') then
begin Tree.Items.Delete(Tree.Items.Item[i]); break;
end else
Inc(i); ADOTreeVersion_Temp.Next;
end;
end //конец if (DBCombo_Models....
else
Showmessage('Выберите модель и ее версию');
end;
117
13. В методе Click компонента Button с именем Create_VersionTree на-
писать код, который выполняет прорисовку дерева всех версий с учетом выбранной модели, т.к. версии модели тоже образуют иерархическую структуру:
procedure TForm1.BCreate_VersionTreeClick(Sender: TObject); var
i: integer; begin
if (DBCombo_Models.KeyValue>0) then begin
ADOVersii.Close;
ADOVersii.Filter:='Parent_version_id = null AND model_id = '+ VarToStr(DBCombo_Models.KeyValue);
ADOVersii.Filtered:=True;
ADOVersii.Open;
ADOVersii.First;
TV2.Items.Clear;
while not ADOVersii.Eof do begin
TV2.Items.AddObject(nil, ADOVersii.FieldByName('version_name').AsString, Pointer(ADOVersii.FieldByName('version_id').asInteger));
ADOVersii.Next;
end;
ADOVersii.Filtered:=false;
ADOVersii.First;
while not ADOVersii.Eof do begin
i := 0;
while i < TV2.Items.Count do begin
if TV2.Items.Item[i].Data = Pointer(ADOVersii.FieldByName('Parent_version_id').asInteger) then
begin
TV2.Items.AddChildObject(TV2.Items.Item[i], ADOVersii.FieldByName('version_name').AsString, Pointer(ADOVersii.FieldByName('version_id').asInteger));
break;
end else
Inc(i);
end;
ADOVersii.Next;
end;
end;
end;
14. В методе AdvancedCustomDrawItem компонента TreeView с именем
Tree для более наглядного представления уровней иерархии написать сле- дующий код:
118
procedure TForm1.TreeAdvancedCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
begin
if (stage = cdPrePaint) AND ((Node.Level MOD 2)=0) AND (Node.Level>0) then
begin
Sender.Canvas.Font.Color:=clred; //цвет шрифта узла будет красным Sender.Canvas.Font.Style:=[fsbold]; //шрифт узла будет полужирным
end else begin
if Node.Level>0 then
Sender.Canvas.Font.Color:=clblue; //цвет шрифта узла будет голубым
end;
end;
15. В методе CloseUp компонента DBLookupComboBox с именем
DBCombo_Models для проверки наличия версий у выбранной модели на- писать следующий код:
procedure TForm1.DBCombo_ModelsCloseUp(Sender: TObject); begin
if adoversion.RecordCount<=0 then begin
DBCombo_Version.Enabled:=False;
BCreate_VersionTree.Enabled:=False;
ShowMessage('Выбранная модель не содержит ни одной версии');
end else begin
DBCombo_Version.Enabled:=true; BCreate_VersionTree.Enabled:=true;
end;
end;
16. Сохраните проект и проверьте работу.
На рис. 10.3 представлен фрагмент программной реализации И-ИЛИ дерева модели и его версий в режиме текстового описания. На нулевом уровне иерархии указывается информация о самой модели. На первом уровне иерархии выделена искомая величина, на втором уровне (все узлы И-типа обозначены жирным шрифтом) представлены И-узлы, для каждого из которых должен быть обязательно выбран из числа им соответствую- щих дочерних узлов ИЛИ-типа (обозначены нежирным шрифтом) вариант зависимости, по которым будет определяться значения узлов И-типа и т.д.
При необходимости можно редактировать дерево в СУБД, что приве- дет к появлению очередной версии модели на базе выбранной, после со- хранения будет преобразовано дерево версий.
119