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

Описания RDS

Приложения

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

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

А.5.6. Операции с блоками и связями

А.5.6.11. rdsEnumBlocks – перебрать все блоки подсистемы

# Приложения

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

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

#### А.5.6. Операции с блоками и связями

##### А.5.6.11. rdsEnumBlocks – перебрать все блоки подсистемы

Функция rdsEnumBlocks вызывает пользовательскую функцию, указатель на которую передается в параметрах, для каждого блока указанной подсистемы.

      RDS_BHANDLE RDSCALL rdsEnumBlocks(
        RDS_BHANDLE Parent,    // Подсистема
        int Type,              // Маска типов блоков
        BOOL Recurse,          // Вызывать во вложенных подсистемах
        RDS_BBhpV CallBack,    // Функция пользователя
        LPVOID Data            // Параметр функции пользователя
      );

Тип указателя на эту функцию

RDS_BhBhIBCbpV

Параметры

Parent(RDS_BHANDLE)
  Идентификатор подсистемы, для блоков которой нужно вызвать функцию пользователя CallBack.
Type(int)
  Маска типов блоков, для которых нужно вызывать функцию – стандартные константы типов блоков RDS_BT*, объединенные битовым ИЛИ. Если нужно вызвать функцию для каждого блока подсистемы независимо от его типа, в этом параметре можно передать 0.
Recurse(BOOL)
  TRUE, если нужно вызывать функцию CallBack не только для блоков, непосредственно находящихся в подсистеме Parent, но для блоков во всех ее вложенных подсистемах. FALSE, если нужно вызывать функцию только для блоков, непосредственно находящихся в Parent.
CallBack(RDS_BBhpV)
  Указатель на пользовательскую функцию, которую нужно вызвать для каждого блока, удовлетворяющего параметрам Type и Recurse. Пользовательская функция должна иметь следующий вид:

        BOOL RDSCALL имя_функции(RDS_BHANDLE block,LPVOID param);

  В параметре block пользовательской функции передается идентификатор блока, для которого вызвана функция, в параметре param – параметр Data (см. ниже) без какой-либо обработки. Функция пользователя должна вернуть TRUE, если перебор блоков необходимо продолжить, и FALSE, если его нужно немедленно остановить.
Data(LPVOID)
  Параметр типа void*, передаваемый в параметре param пользовательской функции при каждом ее вызове.

Возвращаемое значение

Идентификатор блока (RDS_BHANDLE), для которого функция пользователя вернула FALSE. Если функция пользователя всегда возвращала TRUE (перебраны все блоки), вместо идентификатора блока возвращается NULL.

Примечания

Функция rdsEnumBlocks обычно используется для выполнения каких- либо однотипных действий над блоками подсистемы. Ее также можно использовать для поиска блока по какому-либо критерию: если написать пользовательскую функцию, которая будет вызываться для каждого блока таким образом, чтобы она возвращала FALSE, если блок, переданный в ее параметре block, удовлетворяет заданному критерию, то результатом возврата rdsEnumBlocks будет искомый блок.

Функция перебирает блоки в порядке, определяемом внутренней логикой RDS, программист никак не может изменить этот порядок.

Параметр Data, имеющий тип LPVOID (произвольный указатель), передается в вызываемую функцию пользователя без изменений. Это единственный способ передать ей какие-либо данные: например, можно передать указатель на какую-либо структуру, а внутри пользовательской функции привести его к нужному типу и обращаться к полям этой структуры.

Для перебора всех блоков заданного типа в какой-либо подсистеме вместо rdsEnumBlocks можно использовать функции rdsGetFirstBlock и rdsGetNextBlock.

Пример

В этом примере rdsEnumBlocks используется для поиска первого попавшегося блока схемы, комментарий которого содержит заданный текст.

      // Функция пользователя
      BOOL RDSCALL MyEnumCallback(RDS_BHANDLE block,LPVOID param)
      { char *text=(char*)param; // Приводим тип к char*
        // Получаем описание блока block с комментарием
        RDS_BLOCKDESCRIPTION Descr;
        Descr.servSize=sizeof(Descr);
        rdsGetBlockDescription(block,&Descr);
        // Возвращаем FALSE, если в комментарии есть текст param
        if(strstr(Descr.BlockComment,text))
          return FALSE;
        return TRUE;
      }
          ...
      // Поиск во всей схеме простого блока, в комментарии которого
      // содержится текст "тест"
      RDS_BHANDLE found=rdsEnumBlocks(
        rdsGetRootSystem(NULL),  // Корневая подсистема
        RDS_BTSIMPLEBLOCK,       // Только простые блоки
        TRUE,                    // С вложенными подсистемами
        MyEnumCallback,          // Вызываемая функция
        "тест");                 // Текст для поиска
      // В found находится идентификатор найденного блока или NULL

См. также

rdsEnumConnectedBlocks, rdsEnumConnectedBlocksByVar, rdsBroadcastFunctionCallsEx, rdsBCLCreateList, rdsGetFirstBlock, rdsGetNextBlock.