ГЛАВА 9. РЕСУРСЫ.
Файл ресурса - это объект Turbo Vision, который будет
сохранять объекты, а затем выдавать их по имени. Ваша программа
может получать затем эти объекты из ресурса вместо того, чтобы
инициализировать их. Таким образом Ваша программа вместо того,
чтобы инициализировать используемые объекты, может использовать их
из ресурса, который создан отдельной программой.
Этот механизм достаточно прост: файл ресурсов работает как
поток с прямым доступом, обращаясь к объектам по ключам -
уникальным строкам, идентифицирующим ресурсы.
В отличие от других частей Turbo Vision Вам, вероятно, не
потребуется изменять механизма ресурсов. Ресурсы, предоставляемые
Turbo Vision, гибки и надежны. Вам необходимо просто изучить их.
Для чего используются ресурсы?
Использование файла ресурса дает ряд преимуществ.
Использование ресурсов позволяет Вам настраивать Вашу
программу не изменяя код. Например, текст диалоговых окон, метки
элементов меню, цвета видимых элементов могут быть получены из
ресурса.
Вы можете уменьшить код, поместив Init всех Ваших объектов в
отдельную программу. Инициализация часто бывает достаточно сложной
и содержит вычисления и другие операции, которые Вы можете вынести
из Вашего кода. Вам остается только использовать Load для каждого
объекта в Вашей программе, но загрузка всегда значительно проще,
чем Init. Вы можете уменьшить Ваш код от 8 до 10 процентов,
используя ресурс.
Использование ресурса так же упрощает поддержку версий Вашей
программы, настраиваемой на различные языки. Ваша программа
загружает объекты по имени, а язык, на котором они отображают,
заключен в них.
Если Вы хотите предоставить версии программы с различными
возможностями, Вы можете, например, разработать 2 набора меню, один
из которых предоставляет доступ ко всем возможностям, а другой
предоставляет доступ только к ограниченному набору функций. Для
этого Вам не требуется переписывать весь код и Вам не нужно бояться
случайно удалить нужную часть кода. Вы можете настраивать программу
на полную функциональность предоставлением только нового ресурса
вместо замены всей программы.
Короче, ресурс изолирует представление объектов Вашей
программы и упрощает ее изменение.
Что в ресурсе?
До того, как рассматривать детали ресурсов, Вы должны хорошо
освоить потоки и коллекции, поскольку механизм ресурса широко
использует их. Вы можете использовать ресурсы не зная как они
работают, но если Вы собираетесь изменить их, Вам требуется это
знать.
TResourсeFile содержит отсортированную коллекцию строк и
поток. Строки в коллекции - это ключи к объектам в потоке.
TResourceFile имеет метод Init, который берет поток и метод Get,
который берет строку и возвращает объект.
Создание ресурса.
Создание файла ресурса выполняется в 4 этапа. Вам необходимо
открыть поток, инициализировать файл ресурса с этим потоком,
сохранить один или более объектов с их ключами и закрыть ресурс.
Следующий код создает простой файл ресурса MY.REZ, содержащий
один ресурс: строку статуса с ключем 'Waldo':
program BuildResourse;
uses Drivers, Objects, Views, App, Menus;
type
PHaltStream = ^THaltStream;
THaltStream = object(TBufStream)
procedure Error(Code, Info: Integer);virtual;
end;
var
MyRez: TResourceFile;
MyStrm: PHaltStream;
procedure THaltStream.Error(Code, Info: Integer);
begin
Writeln('Stream error: ', Code, ' (', Info, ')');
Halt(1);
end;
procedure CreateStatusLine;
var
StatusLine: PStatusLine;
begin
StatusLine := New(PStatusLine, Init( 0,$FFFF,
NewStatusItem('~Alt-X~ Exit', AltX, cmQuit,
NewStatusItem('~F3~ Open', F3Key, cmNewDlg,
NewStatusItem('~F5~ Zoom', F5Key, cmZoom,
NewStatusItem('~Alt-F3~ Close', AltF3, cmClose,
nil))))
));
MyRez.Put(StatusLine, 'Waldo');
Dispose(StatusLine, Done);
end;
begin
MyStrm := New(PHaltStream, Init('MY.REZ', stCreate, 1024));
MyRez.Init(MyStrm);
CreateStatusLine;
MyRez.Done;
end.
Чтение ресурса.
Получить ресурс из файла ресурса так же просто, как получить
объект из потока: Вы просто вызываете функцию Get файла ресурса с
ключем требуемого ресурса. Get возвращает указатель на PObject.
Ресурс строки статуса, созданные в предыдущем примере, может
быть получен:
program MyApp;
uses Objects, Drivers, Views, Menus, Dialogs, App;
var
MyRez: TResourceFile;
type
PMyApp = ^TMyApp;
TMyApp = object(TApplication)
constructor Init;
procedure InitStatusLine; virtual;
end;
constructor TMyApp.Init;
var
S: PStream;
FileName: PathStr;
Event: TEvent;
const
MyRezFileName: PathStr = 'MY.REZ';
begin
MyRez.Init(New(PBufStream, Init(MyRezFileName, stOpen,
1024)));
if MyRez.Stream^.Status <> 0 then Halt(1);
TApplication.Init;
end;
procedure TMyApp.InitStatusLine;
begin
StatusLine := PStatusLine(MyRez.Get('Waldo'));
end;
Когда Вы читаете ресурс объекта, Вы должны знать о возможности
получения nil указателя. Если индекс имени неверен (т.е. если нет
ресурса с таким ключем) Get возвращает nil. Однако после того, как
код ресурса будет отлажен, в дальнейшем не должно быть проблем.
Вы можете считывать объект ресурса повторно. Вряд ли Вам
понадобиться делать это со строкой статуса в нашем примере, но
например диалоговое окно может быть считано пользователем много раз
во время выполнения программы. Ресурс просто постоянно выдает
объект при запросе.
Это потенциально может приводить к проблемам с медленным
дисковым В/В даже если файл ресурса буферизован. Вы можете
увеличить буферизацию или скопировать поток в EMS поток, если EMS
инсталлирована.
Список строк.
В дополнение к стандартному механизму ресурса, Turbo Vision
предоставляет пару специализированных объектов для управления
списками строк. Список строк - это специальный ресурс, который
позволяет Вашей программе обращаться к строковым ресурсам по
номерам (обычно представленными целыми константами) вместо
строковых ключей. Это позволяет программе сохранять строки в файле
ресурса для упрощения настройки.
Например, IDE Turbo Pascal использует объект списка строк для
всех сообщений об ошибках. Это означает, что программа может просто
вызвать сообщение об ошибке по номеру и различные версии в
различных странах будут выбирать различные строки из их ресурсов.
Объект списка строк спроектирован не очень гибко, но очень
быстр и удобен при правильном использовании.
Объект TStringList используется для доступа к строкам. Чтобы
создать список строк, необходимо использовать объект TStrListMaker.
Записи регистрации для этих объектов имеют одинаковый номер типа
объекта.
Объект списка строк не имеет метода Init. Используется
единственный констрактор - метод Load, поскольку списки строк
существуют только в файлах ресурса. Аналогично, поскольку список
строк - это ресурс только для чтения, он имеет функцию Get, но не
имеет процедуры Put.
Создание списков строк.
Тип объекта TStrListMaker используется для создания списка
строк в файле ресурса для последующего использования с TStringList.
В противоположность этому списку строк, который можно только
читать, создаваемый список строк возможно только записывать. Все,
что Вы можете делать при создании списка строк - это
инициализировать список строк, последовательно записывать в него
строки и сохранить результирующий список в потоке.
Назад | Содержание | Вперед