Строковые ресурсы
Списки строк используются в программах 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.