logo
Литература_1 / photon_old

Обработка множества экземпляров окна

Если у Вас имеется более чем один экземпляр модуля окна, отображаемых одновременно, то у Вас будут проблемы, связанные с получением доступа к виджетам в окне. Проблема произрастает из того факта, что ABW_instance_name для любого виджета в модуле окна указывает на последний созданный экземпляр этого виджета. Если у Вас имеется более одного экземпляра окна, то у Вас имеется и более одного созданного экземпляра виджетов внутри окна.

Пусть, скажем, Вы имеете следующий модуль окна:

              1. Рис. 9-1. Простое окно поиска

Примем, что имена экземпляров следующие:

Если у Вас на экране одновременно имеется два экземпляра окна и пользователь щёлкнул на кнопке "Search", как Вы получите значение в текстовом виджете "Name"? Поскольку имеются два экземпляра окна, существует и два экземпляра текстового виджета. ABW_name_txt указывает на последний созданный экземпляр текстового виджета.

Решение основано на том факте, что для ссылки на оба экземпляра виджета name_txt может использоваться ABN_name_txt, обеспечивающий Вас указателем на виджет в том окне, которое содержит нужный текстовый виджет. Это осуществляется использованием функции ApGetWidgetPtr():

PtWidget_t *window_wgt, *text_wgt;

text_wgt = ApGetWidgetPtr(window_wgt, ABN_name_txt);

Где Вы получите window_wgt? В вышеприведенном случае Вы имеете ответную реакцию кодового типа на кнопке "Search". Первым параметром, передаваемым кодовой ответной реакции, является указатель на виджет кнопки "Search". Для получения указателя на окно, содержащее кнопку "Search", Вы можете использовать функцию ApGetInstance(). Таким образом ответная реакция станет такой:

int search_callback(PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo) {

char *name;

PtWidget_t *window_wgt, *txt_wgt;

/* Получение окна, в котором находится кнопка"Search" */

window_wgt = ApGetInstance(widget);

/* В данном окне ищем текстовый виджет */

text_wgt = ApGetWidgetPtr(window_wgt, ABN_name_txt);

/* Теперь получим текст */

PtGetResource(text_wgt, Pt_ARG_TEXT_STRING, &name, 0);

/* Переменная 'name' теперь указывает на корректный текст. */

/* Обработка текста соответствующим образом */

...

return(Pt_CONTINUE);

}

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4