|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MS Office как объект OLE (Делфи) |
|
|
MS Office как объект OLE (Делфи)
|
![]() Пользователь Сообщения: 73 |
работаю, к примеру, с 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, подключения ни к Ворду, ни к Экселю не происходит. Может имя класса разное в разных версиях???? |
|
Отправлено: 22:55, 26-10-2004 |
Engrossed by the Void Сообщения: 2229
|
Профиль | Отправить PM | Цитировать Возможно программа просто не умеет к ним подключаться. Если мне не изменяет память, то при установке D7 нужно выбирать тип Office'а.
|
------- Отправлено: 02:39, 27-10-2004 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Пользователь Сообщения: 73
|
Профиль | Отправить PM | Цитировать Prisoner
Цитата:
![]() Конечно, можно подключиться как к соответствующему серверу. Это решит проблему, но, млин, как всё таки быть с OLE Automation??? Я что-то не вижу путей к решению... |
|
Отправлено: 18:42, 27-10-2004 | #3 |
Пользователь Сообщения: 84
|
Профиль | Отправить PM | Цитировать А ты попробуй через COM-сервер или попробуй посмотреть в реестре HKEY_CLASSES, там "пробиндены" названия интерфейсов и их GUID'ов. Есть всякие варианты, типа "Application.Excel8" и т.п.
![]() |
Отправлено: 21:25, 27-10-2004 | #4 |
![]() Пользователь Сообщения: 73
|
Профиль | Отправить PM | Цитировать 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. Что ему ещё надо??? |
|
Отправлено: 00:47, 28-10-2004 | #5 |
Пользователь Сообщения: 84
|
Профиль | Отправить PM | Цитировать Я тоже считаю, что проще. Но медленно. Очень. Таскает все данные через 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 выдает? [s]Исправлено: Netscaper, 3:20 28-10-2004[/s] |
Отправлено: 03:12, 28-10-2004 | #6 |
![]() Пользователь Сообщения: 73
|
Профиль | Отправить PM | Цитировать Netscaper
Спасибо за подсказку! Скорость в моём случае не критична. Переслать нужно всего одно значение. Только мне нужно подключаться к уже работающему оффисному приложению, поэтому ошибку OleSysError я перехватываю, если она возникает. Для отладки я ввёл ShowMessage('хрен тебе а не Эксель'); ![]() uses ... ComObj, Excel97...; ... private * *Excel: Variant; ... ... procedure TForm1.Button1Click(Sender: TObject); begin Excel:=GetActiveOleObject ('Excel.Application') as _Application; Excel.ActiveCell.Value := 'Hello!'; end; Только мне потестить сегодня негде ![]() Если кто сможет выручить - тестовая программка здесь: http://www.allok.ru/progs/exl1.zip |
Отправлено: 20:32, 28-10-2004 | #7 |
Пользователь Сообщения: 84
|
Профиль | Отправить PM | Цитировать ![]() ![]() |
Отправлено: 00:59, 29-10-2004 | #8 |
![]() Пользователь Сообщения: 73
|
Профиль | Отправить PM | Цитировать Netscaper
Спасибо. Также проверил на 98/97. ![]() Но всплыла ещё одна проблема... Моя программка должна определить, что именно запущено - Ворд или Эксель, и исходя из этого подключиться. Теперь она подключается только к тому, чей модуль в uses последний. Т.е. если написано uses Word97, Excel97... - будет подключен Excel. А Word не видит вообще. Ну что ж... Будем искать... |
Отправлено: 02:23, 29-10-2004 | #9 |
Пользователь Сообщения: 84
|
Профиль | Отправить PM | Цитировать Тогда ты делай по-другому:
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.... [s]Исправлено: Netscaper, 15:02 29-10-2004[/s] [s]Исправлено: Netscaper, 15:04 29-10-2004[/s] |
Отправлено: 15:00, 29-10-2004 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Как убрать объект с картинки? | bigkuler | Цифровое изображение | 1 | 01-11-2009 14:20 | |
Сохранить объект как... в IE 6 | AMM | Microsoft Windows 2000/XP | 1 | 30-05-2007 10:15 | |
Win32 API | GDI. Как определить, что пользователь кликнул в объект | XCodeR | Программирование и базы данных | 12 | 30-07-2006 22:23 | |
OLE+WORD | AL CAPONE | Программирование и базы данных | 1 | 19-03-2005 17:13 | |
Как внедрить flash-объект в тело письма | AlexSaaa | Хочу все знать | 1 | 18-11-2004 11:39 |
|