Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> События OLE-server Excel (без ExcelApplication), Как реализовать обработку событий ? 
:(
    Опции темы
realist11
Дата 29.1.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Организуем создание и доступ к OLE-server Excel без использования "оберточного" компонента ExcelApplication (CreateOleObject.....). Работа со СВОЙСТВАМИ и МЕТОДАМИ созданного объекта не вызывает особых затруднений... Все примеры кочуют из форума в форум почти под копирку...

Но вот как быть с СОБЫТИЯМИ ?
С ними понятно посложнее, но может ктото встречал или может предложить простенький пример реализации ? Допустим для примера часто используемое событие SheetChange.

Как это все ручками прописать ?
PM MAIL   Вверх
Romkin
Дата 30.1.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: нет
Всего: 5



Не так просто, как кажется smile
Тебе нужно реализовать кокласс, поддерживающий dispinterface передачи событий. "Свободного" в vcl нет (по крайней мере, я не нашел). Написать реализацию invoke не так уж просто ;)
Простейший путь - сделать импорт библиотеки типов, в этом случае IDE сама пишет код для подключения событий, надо только вырезать нужное. То, что тебе нужно - TServerEventDispatch (OleServer.pas), его просто нужно приспособить под тебя. Метод TOleServer.InvokeEvent пишется средой при импорте библиотеки, которая помещает туда нужные вызовы эвентов в зависимости от DispID. 
Сразу говорю: чтобы соединиться, ты должен знать DIID интерфейса событий и ClassID кокласса-источника событий smile
Может быть, все же проще сделать импорт? Никто не заставляет регистрировать компонент, можно просто пользоваться.
PM ICQ   Вверх
realist11
Дата 4.2.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Некую КЛАССИФИКАЦИЮ разных ТЕХНОЛОГИЙ организации взаимодействия нашел в статье 
http://delphiworld.narod.ru/base/delphi_an...automation.html . Статья не очень свежая, но по сути остается актуальной... Рекомендую...
Итак, с точки зрения ТЕХНОЛОГИЙ имеем деление на:
1.Позднее связывание (Интерфейс IDispatch).
2.Раннее связывание (Использование библиотеки типов/интерфейсов).

Автор статьи правильно отметил недостатки 1-го пути "получения доступа к серверам автоматизации" : хуже быстродействие, бо'льшая вероятность ошибок, и нашел единственный плюс...

2-й путь он определил как лучший, и дальше на нем зациклился...
Варианты реализации по 2-му пути (в порядке уменьшения трудозатрат):
2.1.Руками как у автора статьи.
2.2.Как у автора в конце статьи (Приложение 2 – Использование в Delphi класса-оболочки).
2.3.Использовать "оберточный" компонент ExcelApplication.

Но у 2-го пути есть неупомянутый еще один недостаток - свистопляска с версиями Excel :
а это разные вызовы одних и тех же функций, ладно бы только в своей программе, но еще и "оберточный" компонент ExcelApplication должен соответствовать версии Excel, установленной на машине. А если я компилирую на 1-й, а эксплуатировать буду на 10-ти с разными версиями Excel ...
Мне что под каждую версию Excel -- версию своей программы компилировать ?
И так с каждым релизом своей программы ?
Вот и сейчас бьюсь - вываливается в исключение, какой параметр конкретно не говорит...Ну перехватил на уровне приложения, чтоб в скомпилированном не вываливалась -- но это не есть хорошо...

Подскажите, может уже ктото сделал "оберточный" компонент ТИПА ExcelApplication, но отрабатывающий внутри себя все возможные версии Excel (т.е независящий от встретившейся версии Excel)....

По поводу СОБЫТИЙ вообще мало информации... 2.1, 2.2 - слишком простые и до событий не доходят...
2.3. С событиями нормально, но замучила "свистопляска" с версиями Excel...
Вот и пытаюсь разобраться с реализацией СОБЫТИЙ по 1-му пути...

Итак, (CreateOleObject.....). Работа со СВОЙСТВАМИ и МЕТОДАМИ созданного объекта не вызывает особых затруднений ... И что интересно - доступ то УЖЕ есть, значит  Интерфейс IDispatch уже инициализирован и работает... 
1.Я у себя в программе пишу обработчик события.
2.Мне (через Интерфейс IDispatch) нужно передать свойству OnSheetChange (созданного объекта -OleObject)-- Указатель на мой обработчик события, возможно с параметрами...
По этой схеме например работает "Перехват исключений на уровне приложений"...

Зачем же ??? "Тебе нужно реализовать кокласс, поддерживающий dispinterface передачи событий" ???

Это сообщение отредактировал(а) realist11 - 4.2.2007, 21:49
PM MAIL   Вверх
Romkin
Дата 5.2.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: нет
Всего: 5



1. Особенности работы с русским Excel
Пригодится, там разница для русифицированного и английского экселя.
2. Насчет указанной статьи - критиковать не буду, хотя некоторые предпосылки на мой взгляд странноваты.
Поздним связыванием называется использование invoke. Ранним - таблицы методов. Все. Импорт библиотеки типов имеет к этому опосредованное отношение, не надо путать VTABLE и TypeLib smile
3. Насчет быстродействия тоже поспорить можно - а где сравнение? ;)

Однако есть одна особенность, обращаю внимание: импортируется библиотека типов 8 версии экселя. Это Office 97 smile
Поясню: в СОМ есть множество соглашений, на которые редко обращают внимание, но которые делают использование этой технологии довольно простым делом. 
Например, соглашение о том, что если интерфейс выпущен - никаких изменений в VTABLE не должно быть в следующих версиях. Если надо - делается новый интерфейс. Ближайший пример - IClassFactory и IClassFactory2.
Нет никакой свистопляски версий smile Версии библиотек типов офиса совместимы снизу вверх, просто в старых версиях нет тех возможностей, что есть в новых. Достаточно взять библиотеку минимальной версии, на которую ориентируешься - и все будет работать, проверено (у меня именно excel8). Думаю, сейчас можно ориентироваться на Office2000.

"Оберточный" класс совсем необязательно при этом писать ручками, он по заказу создается при импорте библиотеки типов (пункт "Generate wrapper"). При этом также не обязательно регистрировать этот компонент на палитре - просто Create unit, и у тебя будет модуль с нужным классом, куда ты спокойно можешь присоединить обработчики событий smile

Цитата(realist11 @  4.2.2007,  21:41 Найти цитируемый пост)
2.Мне (через Интерфейс IDispatch) нужно передать свойству OnSheetChange (созданного объекта -OleObject)-- Указатель на мой обработчик события, возможно с параметрами...


Если у тебя есть wrapper - код передачи событий уже написан, дельфийские эвенты есть. Присоединяй smile
Если нет - я очень хотел бы увидеть, как ты передаешь указатель на метод Delphi в другое приложение, да еще писаное на VC++  smile 

Дело в том, что как бы ни реализовывались обратные вызовы (а событие - это именно обратный вызов), они в СОМ сводятся к одному: к передаче интерфейса класса, который будет принимать эти самые вызовы. Сервер при наступлении события просто дергает нужный метод этого интерфейса. Вот этот-то класс тебе и нужен. 
PM ICQ   Вверх
realist11
Дата 7.2.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



1.По поводу статьи http://delphiworld.narod.ru/base/delphi_an...automation.html
Заслуга ее в КЛАССИФИКАЦИИ разных ТЕХНОЛОГИЙ ...
Ты сильно буквально воспринял то что указывается в скобках.
Основное не там... 
Деление 2-х путей(технологий) происходит по ВРЕМЕНИ когда происходит связывание.
1.Позднее связывание - во время выполнения программы.
2.Раннее связывание - во время компиляции.

Понятно, что и1 и 2-й использует модули и библиотеки... А в них реализованы программные интерфейсы...
Хорошо, давай добавим недостающее звено, имя модули и библиотеки, что проще определяется чем реализованный внутри интерфейс...
В Пути используется :
1.ComObj.pas.
2.Excel_TLB.pas - создан на основе файла библиотеки типов c:\program files\microsoft office\office\excel8.olb.

Варианты реализации по 2-му пути (в порядке уменьшения трудозатрат):
2.1.Руками как у автора статьи.
2.2.Как у автора в конце статьи (Приложение 2 – Использование в Delphi класса-оболочки).
2.3.Использовать "оберточный" компонент ExcelApplication.
В 2.3 я имел в виду использование компонентов, расположенных на закладке "Servers" в Delphi6.
Вобщем это тоже 2-й путь (Раннее связывание), хотя есть отличие - использование не напрямую Excel_TLB.pas, а вместо нее Excel97.pas. 
У 2.3 есть плюсы по сравнению с Excel_TLB.pas : т.к это компонент то более удобное использование - подсказчик свойст, методов, событий в среде Delphi.
Но есть и минусы - 
1.слабая документированность, хотя все форумы практически этот 2.3 и обсуждают.
2.существенная трансформация свойст, методов, событий, что не позволяет напрямую использовать запись макросов в Excel.
3.свистопляска с версиями Excel - разные вызовы одних и тех же функций, ладно бы только в своей программе, но еще и "оберточный" компонент ExcelApplication должен соответствовать версии Excel, установленной на машине.


Почему я так дотошно пытаюсь классифицировать(пронумеровать) разные реализации ?
Да потому что они разные, и например про "свистопляска с версиями Excel " я говорю применительно к 2.3. , а ты мне отвечаешь что ее нет в пути 1.
Про "2.3.Использовать "оберточный" компонент ExcelApplication." - я говорю применительно к 2.3, и заметь компонент, а не класс... На что ты отвечаешь ""Оберточный" класс совсем необязательно при этом писать ручками...." - понятно что это Excel_TLB.pas, созданный если поставить галку "Generate wrapper". 
То что в статье импортируется библиотека типов 8 версии экселя97 - тоже очевидно, а есть еще 9, 10, 11.

По поводу событий - основного вопроса обсуждения, цитирую ранее:

По поводу СОБЫТИЙ вообще мало информации... 2.1, 2.2 - слишком простые и до событий не доходят...
2.3. С событиями нормально, но замучила "свистопляска" с версиями Excel...
Вот и пытаюсь разобраться с реализацией СОБЫТИЙ по 1-му пути...

По поводу идеи реализации - в чем же разница, почему нельзя по работающей схеме  "Перехват исключений на уровне приложений"... ??? Достаточно распространенный пример, если надо приведу...

Вообще отправил с форума ICQ со своим номером 425-659-951. Не мешает иметь микрофон - был бы голосовой чат - быстрее и конкретнее, т.к диалог а не переписка и возможно голосом...
PM MAIL   Вверх
Romkin
Дата 9.2.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: нет
Всего: 5



Я ни слова не говорил об использовании компонент-серверов в поставке Delphi. Там они привязаны к определенной версии Офиса, которая выбирается при установке. С более старыми версиями эти компоненты работать, скорее всего, не будут. 
Я говорил о том, что ты сам можешь сделать себе такой же класс, как на этой вкладке, под самую старую версию Офиса, которую планируешь использовать. И говорю еще о том, что эти компоненты будут работать в более новых версиях офиса, поскольку у них обратная совместимость.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.