====== Программирование в X-Window средствами Free Pascal ======
[[index|Перейти к содержанию]]
===== 1.4.2. Доступ к ресурсам программ =====
Пусть ресурсный файл подготовлен. Как получить доступ к
его данным во время работы программы? Для этого 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()'' записывает базу данных
ресурсов в файл.