Представьте, что перед вами стоит банальная задача: загрузить какой-то текст из файла и отобразить его на экране.
Нет, не надо ломать голову.
Я знаю как вы поступите, готовая программа будет выглядеть примерно так:
Program Res01;
Var s, temp: string;
res: resource;
i: integer;
function win2utf(s: string): string; // Перекодировка из Win-1251 --> UTF-8
var len, ch: integer;
t: string;
begin
t:=''; len:=Length(s)-1;
for i:=0 to len do
begin
ch:=ord(GetChar(s, i));
if ch>122 then t:=t+chr(ch+1104);
else t:=t+chr(ch);
end;
win2utf:=t;
end;
Begin
s:='';
res:=OpenResource('/test.txt');
repeat
temp:=ReadLine(res);
if temp='###' then break;
s:=s + win2utf(temp) + chr(10);
until false;
CloseResource(res);
ShowForm;
i:=FormAddString(s);
Delay(10000); // Небольшая задержка
End.
А как вы думаете, много памяти тратится при чтении файла?
Я сделал простой тест. Загрузил файл размером 1024 байта (1 Кб) с 32 строками русского текста.
После запуска эмулятор WTK 2.5.2 мне выдал такой график:
Поясню график. Я запускал программу 2 раза. В первом случае до запуска программы памяти занято было 67500 байт, после запуска - 595124 байт, разница - 527624 байт. Во втором случае до запуска было 73256 байт, а после запуска - 540752 байт, разница - 467496 байт. То есть выходит, что на чтение файла размером 1Кб уходит до 515Кб памяти (!!!), а не каждый телефон может себе такое позволить. При тестировании на реальных телефонах (слабенькие Nokia, типа n7390 и проч.) вылетала ошибка Out of memory. Что и понятно.
Естественно, такое положение дел меня возмутило и я создал небольшую библиотеку для загрузки текста из файла.
Исходный код теперь заметно упростился:
Program Res02;
Uses resloader;
Var s, temp: string;
i: integer;
Begin
s:=LoadText('test.txt');
ShowForm;
i:=FormAddString(s);
Delay(10000); // Небольшая задержка
End.
Но что же покажет тест?
После теста имеем такие показатели:
В цифрах это выглядит так:
Первый запуск: 88420 - 67520 = 20900 байт.
Второй запуск: 90056 - 75448 = 14608 байт.
Разница очевидна. В первом примере тратилось до 515Кб памяти, а во втором менее 20Кб.
Библиотека имеет команды сходные со стандартными:
OpenRes(f: string) - Открыть текстовый ресурс (символ "/" к имени добавлять не надо)
f - имя файла
CloseRes - Закрыть ресурс
string ReadLine - прочитать строку из ресурса
string ReadByte - прочитать байт из ресурса
string win2utf(s: string) - Перекодировка текста из кодировки cp1251(Windows) в UTF-8
string LoadText(f: string) - Загрузка текста
f - имя файла (символ "/" к имени добавлять не надо)
При чтении проходит автоматическая перекодировка строк из cp1251 в UTF-8
Строка ### понимается как маркер конца файла
Строка # понимается как знак перевода строки
Как видите, ничего сложного. Всё просто и удобно. Проблема решена.