Адрес этой странички : http://doc-prg.narod.ru/art_00701/art_00701-02.htm
Дата обновления: 15.05.2009
© 15.05.2009 Сергей Попов
Rational
Rose.
Информационный обмен с
использованием механизма OLE Automation.
Модель: открыть и
получить ссылку.
Откроем Rational Rose (в качестве приложения, но
не OLE Automation server).
Создадим пустую модель, выберем визуальный объект типа Note :
Разместим его с соотв. надписью :
Сохраним модель в файл с именем : rrose_example.mdl и закроем Rational Rose
Чтобы загрузить модель из файла и получить для нее ссылку, можно использовать след. код:
Листинг 3.1
function RRose_Model_Load(RRose : variant; fn_Model : string = ''; YesReadOnly : boolean = true) : variant;
//Загрузить модель из файла fn_Model и получить на нее ссылку
//RRose - ссылка на Rational Rose (OLE Automation server)
//YesReadOnly - если TRUE, то открыть модель только для чтения
begin
Result:=UnAssigned;
if
not VarIsEmpty(RRose) then begin
fn_Model:=trim(fn_Model);
if length(fn_Model)>0 then begin
if FileExists(fn_Model) then begin
//загружаем модель
Result:=RRose.OpenModel(fn_Model);
//Устанвливаем (или сбрасываем) флаг ReadOnly
для модели
Result.Modifiable(not YesReadOnly);
end;
end;
end;
end;
Чтобы получить ссылку на текущую модель, загруженную в Rational Rose, можно использовать след. код:
Листинг 3.2
function RRose_Model_Get(RRose : variant) : variant;
//Получить ссылку на текущую модель Rational Rose
//RRose - ссылка на Rational Rose (OLE Automation server)
begin
Result:=UnAssigned;
if not VarIsEmpty(RRose) then begin
Result:=RRose.CurrentModel;
end;
end;
Посмотрим, как это работает на практике.
Откроем проект из нашего прошлого примера и доработаем его след. образом.
1. Добавим в секцию public еще одну переменную.
Листинг 3.3
public
{ Public declarations }
//ссылка на текущую модель Rational Rose
model_ole : variant;
...
...
end;
2. Добавим на форму еще 3 компонента: кнопку, TLabel и TOpenDialog:
3. Создадим обработчик события "нажатие на кнопку "3" (загрузить модель из файла).
Листинг 3.4
procedure TForm1.btn3Click(Sender: TObject);
begin
if not VarIsEmpty(rrose_ole) then begin
if dlgOpen1.Execute then begin
//сначала закрываем текущую модель, если она существует
RRose_Model_Close(model_ole);
lbl_fnModel.Caption:=ExtractFileName(dlgOpen1.FileName);
//теперь делаем попытку загрузить модель из файла и получить на нее ссылку
model_ole :=
RRose_Model_Load(rrose_ole,
dlgOpen1.FileName, True);
end;
end
else begin
ShowMessage('Нет соединения с Rational Rose');
end;
end;
4. Создадим обработчик события "нажатие на кнопку "4" (выгрузить текущую модель).
Листинг 3.5
procedure TForm1.btn4Click(Sender: TObject);
begin
RRose_Model_Close(model_ole);
lbl_fnModel.Caption:='';
end;
Теперь посмотрим, как все это работает ...
Скомилируем, запустим наше приложение и откроем Rational Rose.
Нажмем на кнопку "3"
и выберем файл с нашей моделью (rrose_example.mdl).
После выбора файла, следует запрос (со
стороны Rational Rose) на подтверждение о
закрытии текущей модели :
И, далее, загружается выбранная модель :
Как видно, загрузилась именно наша модель ...
Здесь следует отметить, что по "нажатию"
на кнопку "2" (закрыть Rational Rose), запрос
на подтверждение закрытия текущей модели
уже не появляется.
Это связано с тем, модель мы открыли с флагом "только для чтения".
Теперь можно доработать функцию RRose_Open таким образом, чтобы нужная модель могла загружаться по запуске Rational Rose.
Листинг 3.6
function RRose_Open(YesVisible : boolean = true; fn_Model : string = ''; YesReadOnly : boolean = true) : variant;
//Открыть Rational Rose и загрузить модель fn_Model (если существует) и вернуть ссылку на него
//(как OLE Automation Server)
//YesReadOnly - если TRUE, то открыть модель только для чтения
Var
oleModel : variant;
begin
Result:= CreateOleObject('Rose.Application');
fn_Model:=trim(fn_Model);
if length(fn_Model)>0 then begin
if FileExists(fn_Model) then begin
oleModel:=Result.OpenRoseModel(fn_Model,false);
oleModel.Modifiable(not YesReadOnly);
end;
end;
Result.Visible:=YesVisible;
end;
Исходные тексты иллюстрирующего примера здесь: rrose_ole_02.zip (260 кб)
© 15.05.2009 Сергей Попов