Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   MS Office как объект OLE (Делфи) (http://forum.oszone.net/showthread.php?t=29337)

Kroc 26-10-2004 22:55 203406

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

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

Kroc 27-10-2004 18:42 203408

Prisoner
Цитата:

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

Netscaper 27-10-2004 21:25 203409

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

Kroc 28-10-2004 00:47 203410

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 203411

Я тоже считаю, что проще. Но медленно. Очень. Таскает все данные через 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]

Kroc 28-10-2004 20:32 203412

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 203413

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

Kroc 29-10-2004 02:23 203414

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

Netscaper 29-10-2004 15:00 203415

Тогда ты делай по-другому:
Код:

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]

Kroc 29-10-2004 17:22 203416

Netscaper
Спасибо, до меня допёрло только через час... Надо спать ночью а не заниматься всякой фигнёй:)
А ещё самый лучший вариант был бы - при установке Делфи указывать Office97, тогда всё работало бы и так. Если только не используешь примочки ХР-шные.
Prisoner
Знал ведь ответ???:)

Netscaper 29-10-2004 19:14 203417

Согласен, что разбираться с этим очень сложно, особенно, если документации практически нет. На самом деле, при установке Delphi спрашивает, какой модуль использовать для компонентов на вкладке "Servers", а включать, в принципе, можно любой. Прелесть Delphi в том, что можно посмотреть в исходнки всей библиотеки VCL и RTL. Кстати, исходники Excel97, Word97, Excel2000, Word2000 поставляются с Delphi и обычно лежат в %DelphiDir%/Ocx/Servers. Пожалуйста. :)

Prisoner 30-10-2004 02:39 203418

Kroc
Знал, не знал - не знаю :). Сам с интересом наблюдаю за беседой :).

Kroc 30-10-2004 07:52 203419

Netscaper
А ещё "прелесть" Делфи в том, что при одном только упоминании модуля в uses программа поправляется на несколько килобайт:). Конечно, это неактуально сейчас, но всё же...  

Netscaper 30-10-2004 13:06 203420

А что сделаешь? Можно, конечно, использовать 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-