![]() |
|
Модераторы: MetalFan |
![]()
|
|
| realist11 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 7.1.2007 Репутация: нет Всего: нет |
Организуем создание и доступ к OLE-server Excel без использования "оберточного" компонента ExcelApplication (CreateOleObject.....). Работа со СВОЙСТВАМИ и МЕТОДАМИ созданного объекта не вызывает особых затруднений... Все примеры кочуют из форума в форум почти под копирку...
Но вот как быть с СОБЫТИЯМИ ? С ними понятно посложнее, но может ктото встречал или может предложить простенький пример реализации ? Допустим для примера часто используемое событие SheetChange. Как это все ручками прописать ? |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
Не так просто, как кажется
Тебе нужно реализовать кокласс, поддерживающий dispinterface передачи событий. "Свободного" в vcl нет (по крайней мере, я не нашел). Написать реализацию invoke не так уж просто ;) Простейший путь - сделать импорт библиотеки типов, в этом случае IDE сама пишет код для подключения событий, надо только вырезать нужное. То, что тебе нужно - TServerEventDispatch (OleServer.pas), его просто нужно приспособить под тебя. Метод TOleServer.InvokeEvent пишется средой при импорте библиотеки, которая помещает туда нужные вызовы эвентов в зависимости от DispID. Сразу говорю: чтобы соединиться, ты должен знать DIID интерфейса событий и ClassID кокласса-источника событий Может быть, все же проще сделать импорт? Никто не заставляет регистрировать компонент, можно просто пользоваться. |
|||
|
||||
| realist11 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
1. Особенности работы с русским Excel
Пригодится, там разница для русифицированного и английского экселя. 2. Насчет указанной статьи - критиковать не буду, хотя некоторые предпосылки на мой взгляд странноваты. Поздним связыванием называется использование invoke. Ранним - таблицы методов. Все. Импорт библиотеки типов имеет к этому опосредованное отношение, не надо путать VTABLE и TypeLib 3. Насчет быстродействия тоже поспорить можно - а где сравнение? ;) Однако есть одна особенность, обращаю внимание: импортируется библиотека типов 8 версии экселя. Это Office 97 Поясню: в СОМ есть множество соглашений, на которые редко обращают внимание, но которые делают использование этой технологии довольно простым делом. Например, соглашение о том, что если интерфейс выпущен - никаких изменений в VTABLE не должно быть в следующих версиях. Если надо - делается новый интерфейс. Ближайший пример - IClassFactory и IClassFactory2. Нет никакой свистопляски версий "Оберточный" класс совсем необязательно при этом писать ручками, он по заказу создается при импорте библиотеки типов (пункт "Generate wrapper"). При этом также не обязательно регистрировать этот компонент на палитре - просто Create unit, и у тебя будет модуль с нужным классом, куда ты спокойно можешь присоединить обработчики событий Если у тебя есть wrapper - код передачи событий уже написан, дельфийские эвенты есть. Присоединяй Если нет - я очень хотел бы увидеть, как ты передаешь указатель на метод Delphi в другое приложение, да еще писаное на VC++ Дело в том, что как бы ни реализовывались обратные вызовы (а событие - это именно обратный вызов), они в СОМ сводятся к одному: к передаче интерфейса класса, который будет принимать эти самые вызовы. Сервер при наступлении события просто дергает нужный метод этого интерфейса. Вот этот-то класс тебе и нужен. |
|||
|
||||
| realist11 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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. Не мешает иметь микрофон - был бы голосовой чат - быстрее и конкретнее, т.к диалог а не переписка и возможно голосом... |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
Я ни слова не говорил об использовании компонент-серверов в поставке Delphi. Там они привязаны к определенной версии Офиса, которая выбирается при установке. С более старыми версиями эти компоненты работать, скорее всего, не будут.
Я говорил о том, что ты сам можешь сделать себе такой же класс, как на этой вкладке, под самую старую версию Офиса, которую планируешь использовать. И говорю еще о том, что эти компоненты будут работать в более новых версиях офиса, поскольку у них обратная совместимость. |
|||
|
||||
![]()
|
| Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |