|
Строковые ресурсы
Списки строк используются в программах
Turbo Vision очень часто, поэтому специально для этого
вида ресурсов разработаны два особых объекта - TStrListMaker
и TStringList. С помощью TSrtListMaker создается строковый
ресурс, а с помощью TStringList ранее созданный строковый
ресурс становится доступен программе. Предполагается,
что создание строкового ресурса и его использование
осуществляется в разных программах, поэтому обоим объектам
в Turbo Vision присвоен один и тот же регистрационный
номер. По той же причине TStrListMaker имеет метод Put,
но не имеет метода Get, a TStringList, наоборот, имеет
Get и не имеет Put.
В отличие от остальных ресурсов доступ
к строковым ресурсам осуществляется по индексам. Таким
образом, Ваша программа становится независимой от языка,
используемого для вывода сообщений. Чтобы поместить
на экран ту или иную информацию, достаточно указать
индекс нужного сообщения и в зависимости от используемого
файла строкового ресурса сообщение будет выведено на
нужном языке.
В двух следующих программах иллюстрируется
создание и использование строкового ресурса. В программе
CreateStringRes создается строковый ресурс, содержащий
все строки текста программы. Константы NStr и SizeStrRes
определяют количество строк и
общую длину строкового ресурса в байтах. В нашем примере
эти величины заранее не известны и выбираются приблизительно,
но так, чтобы в ресурсе гарантированно разместился бы
весь текст программы. В реальной программе они должны
выбираться, исходя из конкретной задачи.
Program CreateStingRes;
{Эта программа создает строковый ресурс}
Uses Objects;
const
SizeStrRes = 2000; {Общая длина всех
строк в ресурсе}
NStr = 40; {Общее количество строк}
var
f: text; {Файл с текстом программы}
ProgText: TResourceFile;
Strings : TStrListMaker; {Строковый
ресурс}
k: Integer;
s: String;
begin
s := copy(ParamStr(0),1,pos('.',ParamStr(0)));
Assign(f,s+'PAS');
Reset(f); {Открываем файл с текстом
программы}
RegisterType(RStrListMaker); {Регистрируем
объект}
ProgText.Init(New(PBufStream,
InitC prog, res' , stCreate, 1024) ))
;
Strings.Init(SizeStrRes,Nstr);
k := 0;
while not EOF(f) do
begin
ReadLn(f,s); {Читаем строку программы}
inc(k) ; {k - порядковый номер строки}
Strings.Put(k,s) {Помещаем строку в
ресурс}
end;
Close (f); {Закрываем файл с текстом
программы}
{Помещаем ресурс в поток}
ProgText.Put(@Strings,'Программа');
Strings.Done; {Закрываем ресурс}
ProgText. Done {Закрываем поток}
end.
В программе UseStringRes текст, полученный
из созданного строкового ресурса, читается и выводится
на экран «задом наперед», начиная с последней строки
текста.
Program UseStingRes;
{Эта программа использует ранее созданный
строковый ресурс}
Uses Objects;
var
ProgText: TResourceFile; {Файл ресурсов}
PStrings : PStringList; {Строковый ресурс}
k,N: Integer;
begin
RegisterType(RStringList); {Регистрируем
объект}
ProgText.Init(New(PBufStream, {Создаем
поток}
Init('prog.res',stOpenRead,1024)));
PStrings := {Получаем из потока ресурс}
PStringList(ProgText.Get('Программа'));
N := 1;
while (PStrings.Get(N))<>'' do
inc(N); {N-1 = общее количество строк}
for k := N-l downto 1 do
WriteLn(PStrings.Get(k)); {Получаем
и выводим строки}
PStringsA.Done; {Закрываем ресурс}
ProgText.Done {Закрываем поток}
end.
Заметим, что индексы, по которым осуществляется
доступ к строковому ресурсу, могут быть произвольными
целыми числами в диапазоне от 0 до 65535. Чтобы определить
общее количество строк в строковом ресурсе, используется
то обстоятельство, что при обращении к TStringList.Get
с недействительным индексом метод выдает пустую строку.
На практике этот способ нельзя считать надежным (в строковом
ресурсе могут храниться и пустые строки), однако других
способов определения этого параметра в TStringList не
существует.
Перед обращением к TSrtListMaker.Put
и TSrtmgList.Get соответствующие объекты должны быть
зарегистрированы с помощью RegisterType.
|