ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Специфичные для приложения Данные


Ads_client_data_tile () функция назначает специфичные для приложения данные к полю ввода. Данные доступны при повторном вызове время как пакет повторного вызова client_data поле. Клиентские данные не представлены в DCL; это имеет силу только, в то время как ваше приложение выполняется. Использование клиентских данных сопоставимо использованию определяемых пользователем атрибутов. Основное различие - то, что определяемые пользователем атрибуты являются только для чтения, в то время как клиентские данные могут изменяться во время выполнения. (Также, конечные пользователи могут осматривать определяемые пользователем атрибуты в файле приложения DCL, но клиентские данные невидимы для них.)

Клиентские данные могут иметь любой тип, который Вы выбираете. Это объявлено как указатель на пусто.

Вы можете выражать клиентские данные как указатель на структуру данных, связанную с диалоговым окном или полем ввода. Структура может быть объявлена как временные данные, местные к любой функции в или выше уровня функции, которая вызывает ads_start_dialog (). Это позволяет Вам избегать объявлять клиентские данные как глобальные статические данные.

Клиентские данные - полезный способ передать информацию к функции повторного вызова, потому что никакие дополнительные параметры не могут быть добавлены к функции.

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

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

struct resbuf *usrhead;

int

handler()

{

struct resbuf *csyshead, *usrhead;

ads_hdlg cldlg;

if (ads_new_dialog("clistdlg", dcl_id, NULLCB, &cldlg))



return BAD;

csyshead = acutBuildList(RTSTR, "Red-Green-Blue",

RTSTR, "Cyan-Magenta-Yellow",

RTSTR, "Hue-Saturation-Value", 0);

if (csyshead == NULL)

return BAD;

ads_client_data_tile(cldlg, "colorsyslist", csyshead);

ads_action_tile(cldlg, "colorsyslist", listcallback);

...

// Start dialog box and do other processing.

//

...

}

Затем, функция повторного вызова listcallback () вызывает mk_list () следующим образом:

static void CALLB

listcallback(ads_callback_packet *cpkt)

{

if ((cpkt->reason == CBR_SELECT) || (cpkt->reason == CBR_DOUBLE_CLICK)) {

// This is not the default tile, so treat both the same.

//

usrhead = mk_list(cpkt->value, cpkt->client_data);

}

}



Содержание раздела