Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
          1. Ресурсы scalar и flags (безуказательный метод)

Чтобы получить скалярный или флаговый ресурс (любого допустимого в С типа) безуказательным методом, выполните следующее:

unsigned long getscalar( PtWidget_t *widget, long type ) {

/* Получение любого вида скаляра */

PtArg_t arg;

PtSetArg( &arg, type, 0, 0 );

PtGetResources( widget, 1, &arg );

return arg.value;

}

          1. Ресурс string (безуказательный метод)

Вот как используется безуказательный метод для получения строчного ресурса:

const char *getstr2( PtWidget_t *widget, long type ) {

PtArg_t arg;

PtSetArg( &arg, type, 0, 0 );

PtGetResources( widget, 1, &arg );

return (char*) arg.value;

}

          1. Ресурс boolean (безуказательный метод)

При безуказательном методе получения булевского значения это значение (0 или 1) возвращается в аргументе value функции PtSetArg():

int getbool( PtWidget_t *widget, long type ) {

PtArg_t arg;

PtSetArg( &arg, type, 0, 0 );

PtGetResources( widget, 1, &arg );

return arg.value;

}

          1. Использование указателей

Когда для получения скалярного ресурса, массива или ресурса флага используется указательный метод, виджет всегда помещает указатель во внутренней структуре данных виджета. В элементе списка аргументов, который Вы устанавливаете использованием функции PtSetArg(), Вы должны предоставить адрес переменной, задаваемый указателем внутренних данных.

Четвёртый аргумент в большинстве типов ресурсов не используется. Для массивов это является адресом указателя, который возвращается из PtGetResources(), указывая на число входов.

Например, чтобы получить содержимое ресурса Pt_ARG_FLAGS (которое есть long) для виджета, Вы должны передать адрес указателя как long:

const long *flags;

PtArg_t arg[1];

PtSetArg(&arg[0], Pt_ARG_FLAGS, &flags, 0);

PtGetResources(ABW_label, 1, arg);

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

Использование указателей const поможет избегнуть этих проблем.

Изменение состояния виджета может сделать эти указатели недействительными; используйте их сразу же.

Если Вы хотите получить значение данного ресурса и затем модифицировать это значение:

  1. Получите ресурс

  2. Скопируйте ресурс во временную переменную

  3. Модифицируйте временную переменную

  4. Используя модифицированную копию, установите ресурс

Вы можете использовать полученное значение, чтобы установить значение другого ресурса этого или любого другого виджета, пока Вы не изменили оригинального значения. Например, Вы можете использовать следующий код, чтобы получить Pt_ARG_TEXT_STRING, текстовую строку, отображаемую на виджете типа label с именем label:

char *str;

PtArg_t args[1];

PtSetArg(&args[0], Pt_ARG_TEXT_STRING, &str, 0);

PtGetResources(ABW_label, 1, args);

Вы можете затем установить эту текстовую строку для другого виджета типа label по имени label2:

PtSetArg(&args[0], Pt_ARG_TEXT_STRING, str, 0);

PtSetResources(ABW_label2, 1, args);

Соседние файлы в папке Литература_1