Материал: 2110

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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