![]() |
работаю, к примеру, с 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, подключения ни к Ворду, ни к Экселю не происходит. Может имя класса разное в разных версиях???? |
Возможно программа просто не умеет к ним подключаться. Если мне не изменяет память, то при установке D7 нужно выбирать тип Office'а.
|
Prisoner
Цитата:
Конечно, можно подключиться как к соответствующему серверу. Это решит проблему, но, млин, как всё таки быть с OLE Automation??? Я что-то не вижу путей к решению... |
А ты попробуй через 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. Что ему ещё надо??? |
Я тоже считаю, что проще. Но медленно. Очень. Таскает все данные через DDE (т.е. всякие WM_... сообщения)... Это, так, кстати..
Код:
uses ... ComObj, ExcelNN...; А что программа в '98 выдает? [s]Исправлено: Netscaper, 3:20 28-10-2004[/s] |
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 |
:type: Работает вроде... Правда на 2000/2000:wow:
|
Netscaper
Спасибо. Также проверил на 98/97. :) Но всплыла ещё одна проблема... Моя программка должна определить, что именно запущено - Ворд или Эксель, и исходя из этого подключиться. Теперь она подключается только к тому, чей модуль в uses последний. Т.е. если написано uses Word97, Excel97... - будет подключен Excel. А Word не видит вообще. Ну что ж... Будем искать... |
Тогда ты делай по-другому:
Код:
uses ... ComObj, Excel97, Word97...; [s]Исправлено: Netscaper, 15:02 29-10-2004[/s] [s]Исправлено: Netscaper, 15:04 29-10-2004[/s] |
Netscaper
Спасибо, до меня допёрло только через час... Надо спать ночью а не заниматься всякой фигнёй:) А ещё самый лучший вариант был бы - при установке Делфи указывать Office97, тогда всё работало бы и так. Если только не используешь примочки ХР-шные. Prisoner Знал ведь ответ???:) |
Согласен, что разбираться с этим очень сложно, особенно, если документации практически нет. На самом деле, при установке Delphi спрашивает, какой модуль использовать для компонентов на вкладке "Servers", а включать, в принципе, можно любой. Прелесть Delphi в том, что можно посмотреть в исходнки всей библиотеки VCL и RTL. Кстати, исходники Excel97, Word97, Excel2000, Word2000 поставляются с Delphi и обычно лежат в %DelphiDir%/Ocx/Servers. Пожалуйста. :)
|
Kroc
Знал, не знал - не знаю :). Сам с интересом наблюдаю за беседой :). |
Netscaper
А ещё "прелесть" Делфи в том, что при одном только упоминании модуля в uses программа поправляется на несколько килобайт:). Конечно, это неактуально сейчас, но всё же... |
А что сделаешь? Можно, конечно, использовать Microsoft Visual C++ и Microsoft Foundation Classes™, тогда программа будет меньше :biggrin: . Для Delphi есть набор классов KOL http://kol.mastak.ru/ которая позволяет сильно уменьшить размер приложения :dandy:. Но ничто не сравнится с Windows API :puke:.:insane:
|
Время: 09:00. |
Время: 09:00.
© OSzone.net 2001-