Связка с помощью символа '.' имеет больший приоритет, чем связка с помощью '*'. Так, если в файле, задающем ресурсы, есть две строки
myprog*background: Red
myprog.dialogwnd.background: Green
то все объекты программы будут иметь ресурс background равный Red, кроме объекта dialogwnd, для которого этот параметр есть Green.
1.4.2 Доступ к ресурсам программ
Пусть ресурсный файл подготовлен. Как получить доступ к его данным во время работы программы? Для этого X предоставляет набор процедур, которые совокупно называются
Наиболее простой является процедура 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
prOptRec: TXrmOptionDescList
nOptRecNum: integer
psProgName: pchar
argc: pointer
argv: ppchar
); 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;
…
begin
…
XrmInitialize;
XrmParseCommand (rDB, rOptRec,