Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИПОВС (2002) / Shimarik / Shimarik / Специальная часть.doc
Скачиваний:
31
Добавлен:
16.04.2013
Размер:
1.9 Mб
Скачать

2.6.3. Автоматизация ole. Компоненты — серверы сом в Delphi 5

Внедрение и связывание позволяют запустить приложение, обрабатывающее соответствующий документ как единое целое. Автоматизация OLE позволяет уп­равлять этим приложением (сервером OLE), используя экспонированные им функ­ции и процедуры. Это и было следующей задачей приложения – необходимо было использовать данные из таблицы Excel в программе.

Взаимодействие с Word, Excel и многими другими распространенными про­граммами, входящими в стандартную установку Word и Microsoft Office, может осуществляться из приложений Delphi 5 с помощью компонентов, размещен­ных в библиотеке на странице Servers. Эти компоненты отображают множество им­портируемых серверов СОМ. Все они являются потомками своего базового класса TOleServer. В этом классе объявлены абстрактные методы и свойства, позволяю­щие устанавливать связь с сервером. Поэтому объекты класса TOleServerg нельзя создавать непосредственно. В приложениях используются только потомки этого класса — конкретные серверы СОМ. Они создаются импортом библиотек типов, осуществляемым в среде Delphi командой Project | Import.

Рис 2.15. Закладка в среде Borland Delphi 5 с компонентами серверами COM.

В программе испоьзуются сервера ExcelApplication и WordApplication. Ниже приводится описание компонентa ExcelApplication.

Свойства этого компонента. Их очень немного. Кроме обычных для всех компонентов Name и Tag имеется всего 4 свойства (во многих компонентах — серверах их всего 3).

Свойство AutoConnect определяет, должен ли сервер автоматически загру­жаться с началом выполнения приложения. Бели установить AutoConnect = true, то соединение с сервером произойдет в момент начала выполнения вашего прило­жения. Если же оставить значение AutoConnect = false, принятое по умолчанию, то соединение с сервером можно установить вызовом метода Connect. Например;

ExcelApplicationl->Connect();

Впрочем, совершенно не обязательно устанавливать соединение свойством AutoConnect или методом Connect. Соединение автоматически устанавливается, когда выполняется вызов какого-то метода сервера или задается значение како­му-то его свойству.

При использовании свойства AutoConnect надо иметь в виду, что установка в true влияет только при запуске приложения, т.е. если это свойство установлено во время проектирования. Задание AutoConnect — true во время выполнения прило­жения ни на что не влияет;

Свойство ConnectKind определяет, как именно осуществляется соединение с сервером. Это свойство может принимать следующие значения:

Таблица 2.1

Значения свойства ConnectKind компонентов WordApplication и ExcelApplication

CkRunningOrNew

ckNewInstance ckRunninglnstance ckRemote

ckAttachTohiterface

Подсоединиться к выполняющемуся серверу или создать новый экземпляр сервера

Всегда создавать новый экземпляр сервера Только подсоединиться к выполняющемуся серверу

Подсоединиться к удаленному серверу. Эта опция должна сочетаться с заданием свойства RemoteMachineName

Не подсоединяться к серверу. Вместо этого приложение обеспечивает интерфейс методом ConnectTo (об этом ме­тоде будет сказано позднее). Опция ckAttachToInterface не может использоваться совместно с установкой в true свойства AutoConnect

После того, как установлено соединение с сервером, он еще не становится видимым пользователю. Впрочем, приложение может работать с этим сервером, вызывать любые его методы, изменять или читать свойства, но сам сервер останет­ся для пользователю за кадром. Имеенно в фоновом режиме происходит работа с COM серверами в программе Однако при отладке программы, для определения того корректно ли завершена работа с сервером я делал его видимым. Для этого свойству Visible сервера задавалось значение true. Например:

ExcelApplicationl->Visible = true;

Разрыв соединения с сервером осуществляется методом Disconnect.

Для работы с Excel в программе использовался следующий код:

procedure TfmFromExcel.BitBtn2Click(Sender: TObject);

var i:integer;

str2,str5:string[150];

str,str3,str4,str9,str8,str10,str12,str13,str14:string[20];

str6,str7:string[60];

str11:string[100];

FileName1: OleVariant;

begin

Filename1:=Edit1.Text;

xa1.Workbooks.Open(Filename1, EmptyParam, EmptyParam,

EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,

EmptyParam, EmptyParam, EmptyParam, EmptyParam, false, 0);

i:=2;

str:='A'+IntToStr(i);

xa1.Connect;

while xa1.Range[str,EmptyParam].Text<>'' do begin

str2:='B'+IntToStr(i);

str3:='C'+IntToStr(i);

str4:='D'+IntToStr(i);

str5:='F'+IntToStr(i);

str6:='E'+IntToStr(i);

str7:='G'+IntToStr(i);

str8:='H'+IntToStr(i);

str9:='I'+IntToStr(i);

str10:='K'+IntToStr(i);

str11:='M'+IntToStr(i);

str12:='J'+IntToStr(i);

str13:='L'+IntToStr(i);

str14:='N'+IntToStr(i);

Modal.taPclient.Insert;

Modal.taPclient.FieldByName('CompanyName').Value:=xa1.Range[str2,EmptyParam].Text;

Modal.taPclient.FieldByName('Adres').Value:=xa1.Range[str3,EmptyParam].Text+' '+//

xa1.Range[str4,EmptyParam].Text+' '+//

xa1.Range[str5,EmptyParam].Text;

Modal.taPclient.FieldByName('Director').Value:=xa1.Range[str6,EmptyParam].Text;

Modal.taPclient.FieldByName('EMail').Value:=xa1.Range[str7,EmptyParam].Text;

Modal.taPclient.FieldByName('Thone').Value:=xa1.Range[str8,EmptyParam].Text;

Modal.taPclient.FieldByName('Fax').Value:=xa1.Range[str9,EmptyParam].Text;

Modal.taPclient.FieldByName('Type').Value:=xa1.Range[str10,EmptyParam].Text;

Modal.taPclient.FieldByName('Comments').Value:=xa1.Range[str11,EmptyParam].Text;

if xa1.Range[str14,EmptyParam].Text='Интернет' then begin

Modal.taPClient.FieldByName('CManage').asString:='Интернет';

Modal.taPClient.FieldByName('Manage').asString:='i';

end;

………………………………………………………………………..

if xa1.Range[str14,EmptyParam].Text='Каталоги' then begin

Modal.taPClient.FieldByName('CManage').asString:='Каталоги';

Modal.taPClient.FieldByName('Manage').asString:='k';

end;

if xa1.Range[str14,EmptyParam].Text='Другие источники' then begin

Modal.taPClient.FieldByName('CManage').asString:='Другие источники';

Modal.taPClient.FieldByName('Manage').asString:='d';

end;

if xa1.Range[str13,EmptyParam].Text='НИИ' then begin

Modal.taPClient.FieldByName('COtrasl').asString:='НИИ';

Modal.taPClient.FieldByName('Otrasl').asString:='n';

end;

…………………………………………………………….

if xa1.Range[str13,EmptyParam].Text='Юр. лицо' then begin

Modal.taPClient.FieldByName('COtrasl').asString:='Юр. лицо';

Modal.taPClient.FieldByName('Otrasl').asString:='j';

end;

if xa1.Range[str13,EmptyParam].Text='Другое' then begin

Modal.taPClient.FieldByName('COtrasl').asString:='Другое';

Modal.taPClient.FieldByName('Otrasl').asString:='d';

end;

if xa1.Range[str12,EmptyParam].Text='Ген. директор' then begin

Modal.taPClient.FieldByName('CDoljnost').asString:='Ген. директор';

Modal.taPClient.FieldByName('Doljnost').asString:='g';

end;

………………………………………….

if xa1.Range[str12,EmptyParam].Text='Сотрудник' then begin

Modal.taPClient.FieldByName('CDoljnost').asString:='Сотрудник';

Modal.taPClient.FieldByName('Doljnost').asString:='s';

end;

Modal.taPclient.Post;

i:=i+1;

str:='A'+IntToStr(i);

end;

xa1.Disco nnect;

end;

Титул Экономики

Сегментация рынка