Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОУК / 09 семестр / Книги и методические указания / Руководство программиста в Photon.doc
Источник:
Скачиваний:
364
Добавлен:
04.03.2014
Размер:
7.99 Mб
Скачать

Получение ресурсов

С получением более чем одного значения ресурсов связано два шага:

  • Установка списка аргументов с использованием макроса PtSetArg()

  • Получение значения с использованием функции PtGetResources().

Если Вы получаете один ресурс, проще использовать функцию PtGetResource() – Вам не надо устанавливать список аргументов. См. раздел "Получение одного ресурса" ниже. Имеется два метода получения ресурсов: один, связанный с указателями, и второй, с ними не связанный. "Безуказательный" метод обычно проще и безопаснее:

  • Так как Вы получаете копию значения, шансы нечаянно переписать настоящее значение уменьшаются.

  • Вам не надо заботиться о типе значения (short или long)

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

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

Не используя указатели

Если Вы установили в ноль значения аргументов value и len при вызове PtSetArg(), функция PtGetResources() возвращает значение ресурса (преобразованное в long) следующим образом:

Тип ресурса

value

len

Flags (любого типа С)

Значение ресурса

не применяется

Scalar (любого типа С)

Значение ресурса

не применяется

Pointer (любого типа С)

Значение ресурса

не применяется

String

Адрес строки

не применяется

Struct

Адрес данных

не применяется

Array

Адрес первого элемента массива

число членов массива

Alloc

Адрес, где хранится ресурс

не применяется

Boolean

0 (ложь) или 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;

}

Ресурс 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;

}

Ресурс 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;

}

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

Когда для получения скалярного ресурса, массива или ресурса флага используется указательный метод, виджет всегда помещает указатель во внутренней структуре данных виджета. В элементе списка аргументов, который Вы устанавливаете использованием функции 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);