OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 25 Сентябрь, 2020 06:14

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Обработка событий Microsoft Office
СообщениеДобавлено: Пятница, 02 Июнь, 2006 12:59 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Код:
IMPORT
      Excel := CtlExcel9, CtlT, OleViews, StdLog, Views,
      TextMappers, TextModels, TextViews, Dialog, WinOle;
      
VAR
      value: REAL;
      cell: CtlT.Any;
      sheet: Excel.Worksheet;
      range: Excel.Range;
      book: Excel.Workbook;
      view: Views.View;


   PROCEDURE RunExcel*;
   BEGIN
      view := OleViews.NewObjectView("Excel.Sheet");
      IF view # NIL THEN
         book := Excel.This_Workbook(OleViews.AutoObject(view));
         sheet := Excel.This_Worksheet(book.Worksheets().Item(CtlT.Int(1)));
         range := sheet.Range(CtlT.Str("A1"), NIL);
         range.PUTFormula(CtlT.Str("...ссылка на DDE-сервер"))
      END;
   END RunExcel;      
   
   PROCEDURE GetValue*;
   BEGIN
      cell := sheet.Range(CtlT.Str("A1"), CtlT.Str("A1")).Value();
      value := cell(CtlT.RealT).val
   END GetValue;


процедура RunExcel создает ячейку Excel и приконнекчивает ее к DDE-серверу, а GetValue считывает значение из этой ячейки. Все работает. Но я ни как не могу разобраться: как отследить, что значение ячейки изменилось...

в модуле (Ctl)Excel9 есть такие конструкции:
Код:
WorkbookEvents* = POINTER TO ABSTRACT RECORD (CtlT.OutObject) END;

PROCEDURE (this: WorkbookEvents) SheetChange* (Sh: CtlT.Object; Target: Range), NEW, ABSTRACT;

PROCEDURE (this: WorkbookEvents) Invoke* (id, n: INTEGER; VAR par: CtlT.ParList; VAR ret: CtlT.Variant);
   BEGIN
      CASE id OF
      ...............................
      
      | 1564: ASSERT(n = 2, 11); this.SheetChange(CtlC.VarObj(par[1]), ThisRange(CtlC.VarAny(par[0])))
      
      ...............................
      END
   END Invoke;


вот не могу понять как мне прикрутить/связать SheetChange к/с GetValue

ЗЫ: Я уже задавал подобный вопрос, был "отослан" к книжкам по COM и в MSDN :) Книги, какие нашел, читал, по M$ лазил, но так и не разобрался с обратным вызовом :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 13:31 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1027
А SheetChange вызывается? Вероятно в этот момент значение ячейки уже изменилось. Кстати может кто-нибудь посоветует где найти описания событий Excel: SheetSelectionChange SheetBeforeDoubleClick SheetBeforeRightClick SheetActivate SheetDeactivate SheetCalculate SheetFollowHyperlink?


Последний раз редактировалось Сергей Оборотов Пятница, 02 Июнь, 2006 14:20, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 14:01 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
GUEST писал(а):
А SheetChange вызывается?

Так я и не могу понять КАК "узнать" что вызвался SheetChange.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 14:05 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
В ВВ есть такая штука, как Message Spy. Так вот она однозначно реагирует на изменения в ячейке сообщением OleClient.UpdateMsg. Я копался в ее исходниках, но к сожалению безрезультатно :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 14:22 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1027
Вячеслав Бойко писал(а):
GUEST писал(а):
А SheetChange вызывается?

Так я и не могу понять КАК "узнать" что вызвался SheetChange.
Заставить её выполнить некую работу в результате чего она себя обнаружит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 14:28 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Цитата:
Заставить её выполнить некую работу в результате чего она себя обнаружит.


Она постоянно работу выполняет (я вижу как в ячейках данные меняются)... А как она себя обнаружит??? Как мне к ней привязаться-то?!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 14:36 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
GUEST писал(а):
Кстати может кто-нибудь посоветует где найти описания событий Excel: SheetSelectionChange SheetBeforeDoubleClick SheetBeforeRightClick SheetActivate SheetDeactivate SheetCalculate SheetFollowHyperlink?


А что означает "описание событий" ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 14:40 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 12:00
Сообщения: 79
Откуда: Россия, Санкт-Петербург
Попробую поставить вопрос иначе. Как мне указать в программе, что существует такое событие как SheetChange и на него надо реагировать определенным образом?

Т.е. как реализовать в программе вот такое:
Код:
if sheet.SheetChange then  GetValue


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 18:33 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1027
Описание событий я полагаю - это при каких условиях они происходят. А какие параметры у сообщения OleClient.UpdateMsg?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 19:06 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9283
Откуда: Россия, Орёл
Вячеслав, понял наконец-то, что Вам нужно.

Я так понимаю, что нужно создать свой тип - потомок от WorkbookEvents и реализовать для него нужную процедуру On..., которая и будет делать все, что Вам нужно.
Потом создать экземпляр этого типа и передать workbook'у. Вот пытаюсь найти, как это сделать. Пока безуспешно... Надо где-то найти примеры работы с этой штукой - это ведь не специфично для ББ, механизм один и тот же всюду. А уж как написать в ББ, тогда будет ясно.
Сейчас покопаюсь еще...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 19:44 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9283
Откуда: Россия, Орёл
Вот ссылки, нарытые в Гугле по теме. Вкратце - нужно использовать некий интерфейс IConnectionPoint. Глубже не разбирался, но что это геморрой изрядный - уже ясно. Т.е. это не геморрой только из VB и VBA, как обычно у MS и бывает.

http://rsdn.ru/Forum/Message.aspx?mid=274837
http://rsdn.ru/article/qna/com/comevents.xml


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 19:46 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1027
Вячеслав Бойко писал(а):
Цитата:
Заставить её выполнить некую работу в результате чего она себя обнаружит.


Она постоянно работу выполняет (я вижу как в ячейках данные меняются)
Почему Вы думаете, что данные в ячейках меняются в результате работы SheetChange? И ещё. Если Excel под отладчиком запустить - то при старте клиента в BlackBox он будет к существующей копии сервера подключаться или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 20:04 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9283
Откуда: Россия, Орёл
Цитата:
Она постоянно работу выполняет (я вижу как в ячейках данные меняются)

Вячеслав, она не может выполнять никакой работы, потому что это всего лишь COM-интерфейс. А реализовываете его именно Вы, как нужно Вам. А потом создаете экземпляр вашего типа и привязываете его к Excel через IConnectionPoint. Посмотрите пока ссылки выше. Если не разберетесь - тогда поглядим вместе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 20:05 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9283
Откуда: Россия, Орёл
Цитата:
он будет к существующей копии сервера подключаться или нет?

Это уже от Excel зависит, как у них это сделано...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 20:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9283
Откуда: Россия, Орёл
Да, нашел объявление для IConnectionPoint - в модуле WinOle.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 20:24 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9283
Откуда: Россия, Орёл
Вот еще материал - я отсканировал 5 страничек про ConnectionPoint из старой книжки по COM:
files/224/ConnectionPoint.rar


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 21:35 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1027
Илья Ермаков писал(а):
Цитата:
он будет к существующей копии сервера подключаться или нет?

Это уже от Excel зависит, как у них это сделано...
Вот и я думаю что будет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 21:46 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1027
Илья Ермаков писал(а):
Цитата:
Она постоянно работу выполняет (я вижу как в ячейках данные меняются)

Вячеслав, она не может выполнять никакой работы, потому что это всего лишь COM-интерфейс. А реализовываете его именно Вы, как нужно Вам.
SheedChange всё-таки не интерфейс, а событие. Оно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 22:10 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9283
Откуда: Россия, Орёл
Ну хорошо, скажем так:
... потому что обсуждаемое "ОНО" (SheetChange)- это всего лишь абстрактный метод COM-интерфейса WorkbookEvents, который нужно описать в своей реализации этого интерфейса.

Посему смысла в строке
if sheet.SheetChange then GetValue
нет никакого.

Так же как и в фразе "где найти описание событий...". Нет никаких "описаний событий", есть сигнатуры методов, которые мы определяем, и которые будут вызываться при наступлении событий. Эти сигнатуры видим собственно в описании интерфейса CtlExcel9.WorkbookEnents.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 02 Июнь, 2006 22:33 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1027
Илья Ермаков писал(а):
Посмотрите пока ссылки выше. Если не разберетесь - тогда поглядим вместе.
Вам, Вячеслав, где-нибудь это предлагали? Если задача будет решена (вопрос времени, по-моему) неплохо будет её в архив скинуть тоже. Правда как этот раздел организовать пока не знаю.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2020, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB