OberonCore
https://forum.oberoncore.ru/

Обработка событий Microsoft Office
https://forum.oberoncore.ru/viewtopic.php?f=27&t=224
Страница 1 из 4

Автор:  Вячеслав Бойко [ Пятница, 02 Июнь, 2006 12:59 ]
Заголовок сообщения:  Обработка событий Microsoft Office

Код:
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 ]
Заголовок сообщения: 

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

Автор:  Вячеслав Бойко [ Пятница, 02 Июнь, 2006 14:01 ]
Заголовок сообщения: 

GUEST писал(а):
А SheetChange вызывается?

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

Автор:  Вячеслав Бойко [ Пятница, 02 Июнь, 2006 14:05 ]
Заголовок сообщения: 

В ВВ есть такая штука, как Message Spy. Так вот она однозначно реагирует на изменения в ячейке сообщением OleClient.UpdateMsg. Я копался в ее исходниках, но к сожалению безрезультатно :(

Автор:  Сергей Оборотов [ Пятница, 02 Июнь, 2006 14:22 ]
Заголовок сообщения: 

Вячеслав Бойко писал(а):
GUEST писал(а):
А SheetChange вызывается?

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

Автор:  Вячеслав Бойко [ Пятница, 02 Июнь, 2006 14:28 ]
Заголовок сообщения: 

Цитата:
Заставить её выполнить некую работу в результате чего она себя обнаружит.


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

Автор:  Вячеслав Бойко [ Пятница, 02 Июнь, 2006 14:36 ]
Заголовок сообщения: 

GUEST писал(а):
Кстати может кто-нибудь посоветует где найти описания событий Excel: SheetSelectionChange SheetBeforeDoubleClick SheetBeforeRightClick SheetActivate SheetDeactivate SheetCalculate SheetFollowHyperlink?


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

Автор:  Вячеслав Бойко [ Пятница, 02 Июнь, 2006 14:40 ]
Заголовок сообщения: 

Попробую поставить вопрос иначе. Как мне указать в программе, что существует такое событие как SheetChange и на него надо реагировать определенным образом?

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

Автор:  Сергей Оборотов [ Пятница, 02 Июнь, 2006 18:33 ]
Заголовок сообщения: 

Описание событий я полагаю - это при каких условиях они происходят. А какие параметры у сообщения OleClient.UpdateMsg?

Автор:  Илья Ермаков [ Пятница, 02 Июнь, 2006 19:06 ]
Заголовок сообщения: 

Вячеслав, понял наконец-то, что Вам нужно.

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

Автор:  Илья Ермаков [ Пятница, 02 Июнь, 2006 19:44 ]
Заголовок сообщения: 

Вот ссылки, нарытые в Гугле по теме. Вкратце - нужно использовать некий интерфейс IConnectionPoint. Глубже не разбирался, но что это геморрой изрядный - уже ясно. Т.е. это не геморрой только из VB и VBA, как обычно у MS и бывает.

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

Автор:  Сергей Оборотов [ Пятница, 02 Июнь, 2006 19:46 ]
Заголовок сообщения: 

Вячеслав Бойко писал(а):
Цитата:
Заставить её выполнить некую работу в результате чего она себя обнаружит.


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

Автор:  Илья Ермаков [ Пятница, 02 Июнь, 2006 20:04 ]
Заголовок сообщения: 

Цитата:
Она постоянно работу выполняет (я вижу как в ячейках данные меняются)

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

Автор:  Илья Ермаков [ Пятница, 02 Июнь, 2006 20:05 ]
Заголовок сообщения: 

Цитата:
он будет к существующей копии сервера подключаться или нет?

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

Автор:  Илья Ермаков [ Пятница, 02 Июнь, 2006 20:07 ]
Заголовок сообщения: 

Да, нашел объявление для IConnectionPoint - в модуле WinOle.

Автор:  Илья Ермаков [ Пятница, 02 Июнь, 2006 20:24 ]
Заголовок сообщения: 

Вот еще материал - я отсканировал 5 страничек про ConnectionPoint из старой книжки по COM:
files/224/ConnectionPoint.rar

Автор:  Сергей Оборотов [ Пятница, 02 Июнь, 2006 21:35 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Цитата:
он будет к существующей копии сервера подключаться или нет?

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

Автор:  Сергей Оборотов [ Пятница, 02 Июнь, 2006 21:46 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Цитата:
Она постоянно работу выполняет (я вижу как в ячейках данные меняются)

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

Автор:  Илья Ермаков [ Пятница, 02 Июнь, 2006 22:10 ]
Заголовок сообщения: 

Ну хорошо, скажем так:
... потому что обсуждаемое "ОНО" (SheetChange)- это всего лишь абстрактный метод COM-интерфейса WorkbookEvents, который нужно описать в своей реализации этого интерфейса.

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

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

Автор:  Сергей Оборотов [ Пятница, 02 Июнь, 2006 22:33 ]
Заголовок сообщения: 

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

Страница 1 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/