Текущий раздел:

Описания RDS

Приложения

Приложение А. Функции, константы и структуры RDS

А.5. Сервисные функции и макросы RDS

А.5.18. Системное меню и контекстное меню блока

А.5.18.5. rdsExecMenuItem – имитировать выбор пункта меню

# Приложения

## Приложение А. Функции, константы и структуры 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().

См. также

RDS_BFM_MENUFUNCTION, RDS_MENUFUNCDATA.