Implementing OnAction property for custom CommandBarControl
От:
Аноним
Дата:
21.11.02 09:04
Оценка:
Good morning community,
Visual Basic reference widely shows how to create custom commandbar controls and how to handle events from them. One of the popular ways to do this for MS Office application is to assign the "OnAction" property for a created control. (e.g. cbCtrl.OnAction = "MyActionHandler") But how is this all implemented?
I am going to provide the same functionality for my CommandBarControl object. Firstly, I thought that Visual Basic queries for OnAction property and calls the function on its own, but I was wrong — my implementation of get_OnAction was never called.
Could you please tell me about how this OnAction functionality is implemented. Thanks.
Re: Implementing OnAction property for custom CommandBarCont
А>Visual Basic reference widely shows how to create custom commandbar controls and how to handle events from them. One of the popular ways to do this for MS Office application is to assign the "OnAction" property for a created control. (e.g. cbCtrl.OnAction = "MyActionHandler") But how is this all implemented?
А>I am going to provide the same functionality for my CommandBarControl object. Firstly, I thought that Visual Basic queries for OnAction property and calls the function on its own, but I was wrong — my implementation of get_OnAction was never called.
Потому что вызывается не get_OnAction, а put_OnAction метод.
А>>Visual Basic reference widely shows how to create custom commandbar controls and how to handle events from them. One of the popular ways to do this for MS Office application is to assign the "OnAction" property for a created control. (e.g. cbCtrl.OnAction = "MyActionHandler") But how is this all implemented?
А>>I am going to provide the same functionality for my CommandBarControl object. Firstly, I thought that Visual Basic queries for OnAction property and calls the function on its own, but I was wrong — my implementation of get_OnAction was never called.
Vi2>Потому что вызывается не get_OnAction, а put_OnAction метод.
Мне тоже понятно, что при присвоении вызывается put_OnAction, но потом, когда собственно происходит событие, кто-то (либо клиентский код, либо библиотека Visual Basic) должен попросить это OnAction, чтобы его выполнить. А этого запроса (т.е. get_OnAction) не происходит.
Поэтому проблема в том, как это реализовано (или, скорее, как это надо реализовать), а этого, к сожалению, в Вашем ответе нет.
Re[3]: Implementing OnAction property for custom CommandBarC
MV>Мне тоже понятно, что при присвоении вызывается put_OnAction, но потом, когда собственно происходит событие, кто-то (либо клиентский код, либо библиотека Visual Basic) должен попросить это OnAction, чтобы его выполнить. А этого запроса (т.е. get_OnAction) не происходит.
MV>Поэтому проблема в том, как это реализовано (или, скорее, как это надо реализовать), а этого, к сожалению, в Вашем ответе нет.
Объект, который генерит событие, получает информацию? Получает. Как он распорядится ею, это его право.
Я не знаю, как обстоит дело именно с CommandBarControl. Вполне возможно, что он просто выполняет процедуру, имя которой ему было передано. В этом и состоит действие события OnAction. Как? Ну, например, с помощью скрипта в VB или другим способом
ScriptControl1.Run sNameOfOnAction, параметры...
или
ScriptControl1.Eval sNameOfOnAction
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, mr.Vitaly, Вы писали:
Vi2>Я не знаю, как обстоит дело именно с CommandBarControl. Вполне возможно, что он просто выполняет процедуру, имя которой ему было передано. В этом и состоит действие события OnAction. Как? Ну, например, с помощью скрипта в VB или другим способом Vi2>
Вот именно в этом то и все дело — как же сервер распоряжается этим OnAction, если клиент его никаким образом не запрашивает. Клиент непосредственно своим кодом не ставит обработчик, а просто, например, присваивет OnAction = "MySub(1, Now())". Заметим, что MySub — это локальная функция в адресном пространстве клиента и outproc сервер ее никак не может вызвать. К тому же сервер может быть написан на С++ и вообще не понимать синтаксис Basic'a. Так что, мне кажется, клиент как-то хитро должен эдвайзиться к серверу и потом забирать это выставленное OnAction. А я пишу сервер и хотелось бы знать, как реализовать аналогичную функциональность. И, вообще, это клиентом не обязательно будет Basic, а может быть и JavaScript, а сервер, в принципе, этого не отличает.
Как мне кажется, там сама библиотека Basic RunTime, эдвайзится к чему-то и получает этот OnAction, но вот что надо реализовать, чтобы клиент мог правильно приэдвайзиться, я не знаю.
Если есть еще идеи, то буду очень за них благодарен.
Re[5]: Implementing OnAction property for custom CommandBarC
MV>Вот именно в этом то и все дело — как же сервер распоряжается этим OnAction, если клиент его никаким образом не запрашивает. Клиент непосредственно своим кодом не ставит обработчик, а просто, например, присваивет OnAction = "MySub(1, Now())". Заметим, что MySub — это локальная функция в адресном пространстве клиента и outproc сервер ее никак не может вызвать. К тому же сервер может быть написан на С++ и вообще не понимать синтаксис Basic'a. Так что, мне кажется, клиент как-то хитро должен эдвайзиться к серверу и потом забирать это выставленное OnAction. А я пишу сервер и хотелось бы знать, как реализовать аналогичную функциональность. И, вообще, это клиентом не обязательно будет Basic, а может быть и JavaScript, а сервер, в принципе, этого не отличает.
Такой синтаксис — работа с присваиванием в OnXXXX — очень полезная идея объявления обработчика, и имеет продолжение в .NET в виде событий и делегатов. Но способ вызова этого обработчика, как правило, не оговаривается и определяется только объектом и языком этого объекта. Как ты заметил, для сервера на С++ будет бесполезной информация, написанная на языке VB. Поэтому у тебя руки развязаны. Как умеешь, так и реализуй. Умеешь вызывать функцию, требуй имя функции. Умеешь вызывать оператор, требуй оператор. Не умеешь, тогда используй обычные connection point.
MV>Как мне кажется, там сама библиотека Basic RunTime, эдвайзится к чему-то и получает этот OnAction, но вот что надо реализовать, чтобы клиент мог правильно приэдвайзиться, я не знаю.
Тут механизма "эдвайза" нет ни в каком виде. Это обычный С++-callback, измененный под конкретный вид объекта сервера. Вот умеет он работать с именем функции, ему и дают имя функции.