Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MS Office как объект OLE (Делфи)

Ответить
Настройки темы
MS Office как объект OLE (Делфи)

Аватара для Kroc

Пользователь


Сообщения: 73
Благодарности: 0

Профиль | Отправить PM | Цитировать


работаю, к примеру, с 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

 

Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Возможно программа просто не умеет к ним подключаться. Если мне не изменяет память, то при установке D7 нужно выбирать тип Office'а.

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 02:39, 27-10-2004 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Kroc

Пользователь


Сообщения: 73
Благодарности: 0

Профиль | Отправить PM | Цитировать


Prisoner
Цитата:
при установке D7 нужно выбирать тип Office'а.
Это так, но ведь я не объявлял никаких оффисных модулей в uses. Даже если бы я выполнил проверку на соответствующую версию, и накидал модулей от разных версий Оффиса, дальше то что делать? Это ничего не даст по-моему...
Конечно, можно подключиться как к соответствующему серверу. Это решит проблему, но, млин, как всё таки быть с OLE Automation??? Я что-то не вижу путей к решению...

Отправлено: 18:42, 27-10-2004 | #3


Аватара для Netscaper

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить PM | Цитировать


А ты попробуй через COM-сервер или попробуй посмотреть в реестре HKEY_CLASSES, там "пробиндены" названия интерфейсов и их GUID'ов. Есть всякие варианты, типа "Application.Excel8" и т.п.

Отправлено: 21:25, 27-10-2004 | #4


Аватара для Kroc

Пользователь


Сообщения: 73
Благодарности: 0

Профиль | Отправить 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


Аватара для Netscaper

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить 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


Аватара для Kroc

Пользователь


Сообщения: 73
Благодарности: 0

Профиль | Отправить PM | Цитировать


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


Отправлено: 20:32, 28-10-2004 | #7


Аватара для Netscaper

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить PM | Цитировать


Работает вроде... Правда на 2000/2000

Отправлено: 00:59, 29-10-2004 | #8


Аватара для Kroc

Пользователь


Сообщения: 73
Благодарности: 0

Профиль | Отправить PM | Цитировать


Netscaper
Спасибо. Также проверил на 98/97.
Но всплыла ещё одна проблема... Моя программка должна определить, что именно запущено - Ворд или Эксель, и исходя из этого подключиться. Теперь она подключается только к тому, чей модуль в uses последний. Т.е. если написано uses Word97, Excel97... - будет подключен Excel. А Word не видит вообще.
Ну что ж... Будем искать...

Отправлено: 02:23, 29-10-2004 | #9


Аватара для Netscaper

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MS Office как объект OLE (Делфи)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как убрать объект с картинки? 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




 
Переход