Пусть
ресурсный файл подготовлен. Как получить доступ к его данным во время
работы программы? Для этого X предоставляет набор процедур, которые
совокупно называются менеджер ресурсов (Resource Manager), и специальную программу xrdb ,
которая позволяет считать любой ресурсный файл и включить его в общую
таблицу ресурсов сервера. Последняя называется базой данных ресурсов
сервера, и представляет собой область памяти, ассоциированную со
свойством (property) XA_RESOURCE_MANAGER корневого окна экрана дисплея.
Наиболее простой является процедура XGetDefault() .
Она получает имя программы, имя ресурса и определяет значение
последнего. При этом она последовательно совершает следующие шаги:
- сначала ресурс ищется в базе данных сервера (в свойстве XA_RESOURCE_MANAGER );
- если он не найден, то значение ресурса определяется по файлу ".Xdefaults" , который ищется в домашней (home) директории пользователя;
- если задана переменная среды XENVIRONMENT , то ресурс ищется в файле, на который указывает эта переменная.
Если ресурс одновременно встречается в ".Xdefaults" и файле, определяемом XENVIRONMENT , то берется последнее значение.
В примере, приводимом ниже, используется XGetDefault() , чтобы получить строку, которую надо напечатать в окне программы. Предполагается, что имя программы - "hello" , а строка - ресурс с именем "helloWorld" , т.е. в файле ".Xdefaults" должна быть помещена, например, следующая запись:
. . . . . . .
hello.helloWorld : Hello, World!
. . . . . . .
Фрагмент программы, выполняющий чтение из файла ресурсов, будет выглядеть следующим образом:
. . . . . . .
prDisplay : PDisplay;
prGC : TGC;
nWnd : TWindow;
psString : PChar;
. . . . . . . .
(* Устанавливаем связь с сервером, получаем номер экрана. . .*)
. . . . . . . .
(* Выбираем события, обрабатываемые программой *)
XSelectInput (prDisplay, nWnd, ExposureMask OR KeyPressMask);
(* Получаем рисуемую строку *)
psString := XGetDefault (prDisplay, 'hello', 'helloWorld');
. . . . . . . .
XDrawString ( prDisplay, nWnd, prGC, 10, 50, psString,
strlen (psString) );
. . . . . . . .
Обратите внимание на то, что после изменения файла ".Xdefaults" он должен быть обработан программой xrdb для того, чтобы X сервер включил в свою таблицу обновленные ресурсы.
Функция XGetDefault()
проста в обращении, но недостаточно гибка. Так, например, с ее помощью
нельзя прочитать содержимое произвольного файла ресурсов. Рассмотрим
другие более развитые возможности.
Вызов XrmInitialize() инициализирует менеджер ресурсов. Обращение к этой функции предшествует вызовам остальных процедур.
procedure XrmParseCommand(
prDB : TXrmDatabase { database };
prOptRec : TXrmOptionDescList { table };
nOptRecNum : integer { table_count };
psProgName : pchar { name };
argc : pointer { argc_in_out };
argv : ppchar { argv_in_out }
); cdecl; external;
сканирует строку, с помощью которой вызвана программа, и
"достает" из нее ресурсы и их значения, при этом создается специальная
структура данных - база данных ресурсов. Ресурсы и их значения
помещаются в нее. Указатель на базу данных передается программе через
переменную prDB . Параметр psProgName содержит имя программы, argc - число опций в командной строке, argv - сами опции. Аргумент prOptRec определяет, как разбирать командную строку. nOptRecNum задает число элементов массива prOptRec .
В примере, приводимом ниже, определяется, что в командной строке опция "-bg" задает цвет фона; "-fg" - цвет переднего плана, а опция "-xrm" позволяет задать в командной строке любой ресурс программы.
. . . . . . . .
const
rOptRec : array [0..2] of TXrmOptionDescRec = (
( '-bg', '*background', XrmoptionSepArg, 'Red' ),
( '-fg', '*foreground', XrmoptionSepArg, 'White' ),
( '-xrm', NIL, XrmoptionResArg, NIL ),
);
var
rDB : TXrmDatabase;
. . . . . . . .
//void main (int argc, char **argv)
begin
. . . . . . . .
XrmInitialize( );
XrmParseCommand (rDB, rOptRec,
sizeof (rOptRec) / sizeof (rOptRec[0]),
argv[0], @argc, argv);
. . . . . . . .
end.
Процедура XrmGetFileDataBase() позволяет считать указанный ресурсный файл и создать по нему в памяти базу данных ресурсов. Функция
function XrmGetResource(
prDB : TXrmDatabase { database };
psResName : pchar { str_name };
psResClass : pchar { str_class };
psResType : ppchar { str_type_return };
psResVal : PXrmValue { value_return }
) : Tbool; cdecl; external;
считывает ресурс с именем psResName и классом psResClass из базы данных *prDB . После возврата psResType есть указатель на строку, указывающую тип ресурса. На само значение ресурса указывает psResVal .
Функция XrmPutResource() сохраняет ресурс в базе данных. XrmPutFileDatabase() записывает базу данных ресурсов в файл.
|