Показать полную графическую версию : MS Office как объект OLE (Делфи)
работаю, к примеру, с Excel:
uses ComObj, ...
...
var e: OleVariant;
...
...
// подключаюсь к экземпяру
e := GetActiveOleObject('Excel.Application');
// дальше применяю объекты, методы и cв-ва Excel, например:
e.Application.ActiveCell.Value:= StrEdit.Text;
Проблема в том, что всё это работает у меня только в Win XP, Office XP. При запуске ехешника под Win 98SE, Office2000, подключения ни к Ворду, ни к Экселю не происходит. Может имя класса разное в разных версиях????
Prisoner
27-10-2004, 02:39
Возможно программа просто не умеет к ним подключаться. Если мне не изменяет память, то при установке D7 нужно выбирать тип Office'а.
Prisoner
при установке D7 нужно выбирать тип Office'а.
Это так, но ведь я не объявлял никаких оффисных модулей в uses. Даже если бы я выполнил проверку на соответствующую версию, и накидал модулей от разных версий Оффиса, дальше то что делать? Это ничего не даст по-моему...:(
Конечно, можно подключиться как к соответствующему серверу. Это решит проблему, но, млин, как всё таки быть с OLE Automation??? Я что-то не вижу путей к решению...
Netscaper
27-10-2004, 21:25
А ты попробуй через COM-сервер или попробуй посмотреть в реестре HKEY_CLASSES, там "пробиндены" названия интерфейсов и их GUID'ов. Есть всякие варианты, типа "Application.Excel8" и т.п.:o
Netscaper
Работать через OLE намного проще. Имена классов одинаковые для 2000 и ХР. Объект COM с CLSID-ом «{00024500-0000-0000-C000-000000000046}» принадлежит Excel.
Из Хелпа:
Retrieves a reference to an IDispatch interface to a currently running, registered COM object.
function GetActiveOleObject(const ClassName: string): IDispatch;
перевожу(насколько знаю английский)
Возвращает ссылку на интерфейс IDisptch запущенного зарегистрированного объекта COM.
Что ему ещё надо???
Netscaper
28-10-2004, 03:12
Я тоже считаю, что проще. Но медленно. Очень. Таскает все данные через DDE (т.е. всякие WM_... сообщения)... Это, так, кстати..
uses ... ComObj, ExcelNN...;
// где ExcelNN - Excel97 или Excel2000
const
xlLCID = LOCALE_USER_DEFAULT;
procedure TForm1.Button1Click(Sender: TObject);
var Excel : _Application;
Workbook : _Workbook;
begin
Excel := CreateComObject(CLASS_ExcelApplication) as _Application;
Excel.Workbooks.Add(EmptyParam, xlLCID);
Excel.ActiveCell.Value := 'Hello!';
Excel.Visible[xlLCID]:=True;
end;
Думаю, что в случае ошибки ты точно увидишь проблему.
А что программа в '98 выдает?
Исправлено: Netscaper, 3:20 28-10-2004
Netscaper
Спасибо за подсказку!
Скорость в моём случае не критична. Переслать нужно всего одно значение. Только мне нужно подключаться к уже работающему оффисному приложению, поэтому ошибку OleSysError я перехватываю, если она возникает. Для отладки я ввёл
ShowMessage('хрен тебе а не Эксель');
:) Вот так она и ругается под 98. Но теперь попробую так:
uses ... ComObj, Excel97...;
...
private
* *Excel: Variant;
...
...
procedure TForm1.Button1Click(Sender: TObject);
begin
Excel:=GetActiveOleObject ('Excel.Application') as _Application;
Excel.ActiveCell.Value := 'Hello!';
end;
Только мне потестить сегодня негде:( *Но, кажется, должно работать. W98 с Office2000 у меня на работе. Под WinXP с OfficeXP полёт нормальный.
Если кто сможет выручить - тестовая программка здесь:
http://www.allok.ru/progs/exl1.zip
Netscaper
29-10-2004, 00:59
:type: Работает вроде... Правда на 2000/2000:wow:
Netscaper
Спасибо. Также проверил на 98/97. :)
Но всплыла ещё одна проблема... Моя программка должна определить, что именно запущено - Ворд или Эксель, и исходя из этого подключиться. Теперь она подключается только к тому, чей модуль в uses последний. Т.е. если написано uses Word97, Excel97... - будет подключен Excel. А Word не видит вообще.
Ну что ж... Будем искать...
Netscaper
29-10-2004, 15:00
Тогда ты делай по-другому:
uses ... ComObj, Excel97, Word97...;
const
xlLCID = LOCALE_USER_DEFAULT;
procedure TForm1.Button1Click(Sender: TObject);
var
Excel : Excel97._Application;
Word : Word97._Application;
Workbook : _Workbook;
begin
Excel := CreateComObject(CLASS_ExcelApplication) as Excel97._Application;
Word := CreateComObject(CLASS_WordApplication) as Word97._Application;
Excel.Workbooks.Add(EmptyParam, xlLCID);
Word....
Исправлено: Netscaper, 15:02 29-10-2004
Исправлено: Netscaper, 15:04 29-10-2004
Netscaper
Спасибо, до меня допёрло только через час... Надо спать ночью а не заниматься всякой фигнёй:)
А ещё самый лучший вариант был бы - при установке Делфи указывать Office97, тогда всё работало бы и так. Если только не используешь примочки ХР-шные.
Prisoner
Знал ведь ответ???:)
Netscaper
29-10-2004, 19:14
Согласен, что разбираться с этим очень сложно, особенно, если документации практически нет. На самом деле, при установке Delphi спрашивает, какой модуль использовать для компонентов на вкладке "Servers", а включать, в принципе, можно любой. Прелесть Delphi в том, что можно посмотреть в исходнки всей библиотеки VCL и RTL. Кстати, исходники Excel97, Word97, Excel2000, Word2000 поставляются с Delphi и обычно лежат в %DelphiDir%/Ocx/Servers. Пожалуйста. :)
Prisoner
30-10-2004, 02:39
Kroc
Знал, не знал - не знаю :). Сам с интересом наблюдаю за беседой :).
Netscaper
А ещё "прелесть" Делфи в том, что при одном только упоминании модуля в uses программа поправляется на несколько килобайт:). Конечно, это неактуально сейчас, но всё же...
Netscaper
30-10-2004, 13:06
А что сделаешь? Можно, конечно, использовать Microsoft Visual C++ и Microsoft Foundation Classes™, тогда программа будет меньше :biggrin: . Для Delphi есть набор классов KOL http://kol.mastak.ru/ которая позволяет сильно уменьшить размер приложения :dandy:. Но ничто не сравнится с Windows API :puke:.:insane:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC