Навигация:
<< >> Оглавление Указатель

Приложения

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

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

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

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

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

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

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

RDS_BhBhIBCbpV

Параметры

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

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

См. также

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


<< >> Оглавление Указатель