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 ] |
Заголовок сообщения: | |
Вячеслав Бойко писал(а): Цитата: Заставить её выполнить некую работу в результате чего она себя обнаружит. Она постоянно работу выполняет (я вижу как в ячейках данные меняются) |
Автор: | Илья Ермаков [ Пятница, 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-интерфейс. А реализовываете его именно Вы, как нужно Вам. |
Автор: | Илья Ермаков [ Пятница, 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/ |