Приложения
Приложение А. Функции, константы и структуры RDS
А.5. Сервисные функции и макросы RDS
А.5.18. Системное меню и контекстное меню блока
А.5.18.5. rdsExecMenuItem – имитировать выбор пункта меню
Функция rdsExecMenuItem имитирует выбор пункта меню блока пользователем. Модель блока при этом вызывается для реакции на событие RDS_BFM_MENUFUNCTION.
void RDSCALL rdsExecMenuItem( RDS_BHANDLE Block, // Идентификатор блока int MenuFunc, // Номер функции пункта меню int MenuData // Данные пункта меню );
Тип указателя на эту функцию
RDS_VBhII
Параметры
- Block (RDS_BHANDLE)
- Уникальный идентификатор блока, для которого имитируется выбор пункта меню.
- MenuFunc (int)
- Номер функции пункта меню – это число RDS копирует в поле Function структуры RDS_MENUFUNCDATA без какой-либо обработки.
- MenuData (int)
- Данные пункта меню –это число RDS копирует в поле MenuData структуры RDS_MENUFUNCDATA без какой-либо обработки.
Примечания
Эта функция вызывает модель блока Block для реакции на событие RDS_BFM_MENUFUNCTION, как будто пользователь выбрал постоянный или временный пункт меню, с которым связана пара целых чисел (MenuFunc,MenuData). Модель вызванного блока не может отличить вызов из-за того, что пользователь действительно выбрал пункт меню, от вызова из-за функции rdsExecMenuItem.
Вызов модели блока всегда будет производиться в главном потоке RDS, даже если rdsExecMenuItem была вызвана в потоке расчета (в этом случае вызов будет отложен до завершения текущего такта).
Для успешной работы этой функции не обязательно, чтобы пункт меню, с которым связана пара чисел (MenuFunc,MenuData), существовал в действительности. Это позволяет модели блока, например, использовать rdsExecMenuItem для вызова самой себя в главном потоке из потока расчета. Допустим, существует некая функция DoSomething(), которую можно вызывать только в главном потоке RDS. Если ее нужно вызвать из реакции на такт расчета RDS_BFM_MODEL, этот вызов можно организовать так (приведен только внутренний оператор switch функции модели блока):
switch(CallMode) { case RDS_BFM_MODEL: if(какое-то условие) rdsExecMenuItem(BlockData->Block,10000,0); break; case RDS_BFM_MENUFUNCTION: if(((RDS_PMENUFUNCDATA)ExtParam)->Function==10000) DoSomething(); break; }
В данном случае в такте расчета имитируется выбор пункта меню с номером функции 10000, а в реакции на этот пункт меню (которая всегда выполняется в главном потоке RDS) вызывается функция DoSomething().
См. также