Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TExcellApplication как определить,


Автор: P&$ 24.12.2002, 21:13
Привет!
Моя прога вызывает Excell для этого в Delphi 5 использую компонент TExcellApplication. Программа соединяется с Excell срезу после запуска, затем в нужный момент : ExcellApplication.Visible=true (делаем его видимым), но вот если пользовательзакроет Excell  :notify  то тут и возникает проблемма,  :notify  при повторном ExcellApplication.Visible=true, появляется глюканное окно Excell`a. И так пока не выполниш процедуруы Disconnect, Connect. ???  Но каждый раз вызывать эти методы неудобно (время...), КАК ОПРЕДЕЛИТЬ ЗАГРУЖЕН ЛИ Excell?

Автор: Step 24.12.2002, 21:25
через поиск окна екселя, если найдено то згаружен, если нет то не загружен, или глюканул какойто из его модулей


findwindow() -  искать нужно окно с названием XLMAIN помоему так, это не я придумал, это из учебника по ком и оле.

Автор: AntonSaburov 24.12.2002, 22:51
Если посмотреть в FAQ, то там строчка есть
Excel := CreateOleObject('Excel.Application');

Я делал когда-то так (точно функцию не помню), надо в хелпе посмотреть
try
 Excel := OpenOleObject('Excel.Application'); // вот эта фунция, уточни сам
except
 Excel := CreateOleObject('Excel.Application');

Если Excel открыт, то используется уже созданный экземпляр.

Автор: Fantasist 25.12.2002, 10:34
Хм, неужто TExcelApplication не предоставляет способов проверки этого?

В общем случае - GetActiveObject. Если сервер запущен - вернет интерфейс на него.

Автор: Oleg 27.12.2002, 18:19
Вот как делаю я, но это раннее связывание без класса
 TExcelApplication вместо него _Application из импортированной библиотеки типов:

...
uses Excel_TLB, ActiveX, ComObj;
const LCID:Integer = LOCALE_USER_DEFAULT
var Unknown: IUnknown;
   Result: HResult;  // для проверки запущен ли
   Excel: _Application;
begin
try
 Result:= GetActiveObject(CLASS_ExcelApplication, nil, Unknown);
 if (Result = MK_E_UNAVAILABLE) then begin
   Excel:= CoExcelApplication.Create; //если нет генерируем ко-класс
   Book:= Excel.Workbooks.Add(EmptyParam, lcid);
   Sheet:= Book.ActiveSheet as _Worksheet;
   Excel.WindowState[LCID]:= xlMaximized;
   Excel.Visible[LCID]:= True;
 end
 else begin
   OleCheck(Result); // гасим ошибки OLE
   OleCheck(Unknown.QueryInterface(_Application, Excel));
 end;
except
  Excel.DisplayAlerts[lcid]:= False;
  Excel.Quit;
end;
Разбирайтесь! :-)

Автор: Fantasist 28.12.2002, 05:22
Цитата
Вот как делаю я


Точно так же делается в VCL'ном TOleServer, от которого и унаследован TExcelApplication. В методе Connect, вроде.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)