====== Программирование в 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()'' записывает базу данных ресурсов в файл.