Для того чтобы микропроцессор мог работать, необходимы
некоторые вспомогательные компоненты, подобно тому как одного
двигателя недостаточно, чтобы заставить автомобиль двигаться. - П. Нортон
ПРЕДИСЛОВИЕ В этом выпуске рассылки я публикую программу, демонстрирующую загрузку INI-файла.
Она умеет считывать переменные типа Boolean, Integer, Extended(Real).
РАБОЧИЙ INI-ФАЙЛ Вот как выглядит файл TEST.INI, с которым мы будем работать:
; -----------------------------------
;
; TEST.INI for INI-Loader
;
; Copyright (c) 2003 Nabatnikov Ivan
;
; -----------------------------------
; parameter name comments...
; ---------------|-------------------
; Boolean variables
b_param1 = 1 ; boolean parameter type #1
b_param2 = yes ; boolean parameter type #2
b_param3 = false ; boolean parameter type #3
; Integer variables
i_param1 = -256 ; integer parameter type #1
i_param2 = 100000 ; integer parameter type #2
; Extended variables
e_param1 = -1,000 ; Extended parameter type #1
e_param2 = 9.9999 ; Extended parameter type #2
СИНТАКСИС - Всё, что находится за символом "точка с запятой" считается комментариями.
- Все табуляторы и пробелы игнорируются.
- Параметр находится до знака "равно"("="), а значение - после.
Как видите, тип boolean - самый разнообразный. Он может задаваться тремя типами значений: 0/1, no/yes, false/true.
Тип integer задаётся как обычно, здесь ничего нового не придумаешь.
А реальный тип extended может иметь в качестве разделителя дробной части и точку, и запятую.
ЗАМЕТКИ 1) Неизвестные переменные игнорируются.
2) Если нужный нам параметр в INI-файле не встретился, то он не меняет своего значения.
Для этого полезно использовать значения по-умолчанию, задаваемые перед чтением INI-файла.
3) Если один и тот же параметр встречается в INI-файле несколько раз, то он несколько раз меняется и в конце примет последнее значение.
4) В примере я не использую секции, так как считаю их в данном случае бесполезными.
Использовать их имеет смысл, когда имеется несколько параметров с одним именем, относящихся к разным частям иерархии данных в программе.
Var
b_param1,b_param2,b_param3: boolean;
i_param1,i_param2: integer;
e_param1,e_param2: extended;
function GetBoolVal(p: string): boolean;
//Эта функция возвращет TRUE, если P равно 1, yes или true
begin
Result:=false; //По-умолчанию значение FALSE
If (p='0') or (p='no') or (p='false') then Result:=false;
If (p='1') or (p='yes') or (p='true') then Result:=true;
end;
function GetIntVal(p: string): int64;
//Для ясности выделяем отдельную функцию
begin
Result:=StrToInt(p); //Можно было просто использовать StrToInt()
end;
function GetExtVal(p: string): extended;
//Эта функция преобразует строку P в реальный тип Extended
var
i: integer;
begin
//Все точки меняем на запятые
for i:=1 to Length(p) do
If p[i]='.' then p[i]:=',';
//Так как функция StrToFloat() не признаёт точки
Result:=StrToFloat(p); //^--на заметку Borland :)
end;
procedure CalcLine(s: string);
//Основная процедура обработки строки
var
i: integer;
r,v,p: string;
begin
//Удаляем комментарии, если есть...
If Pos(';',s)>0 then s:=Copy(s,1,Pos(';',s)-1);
//Удаляем табуляторы и пробелы, если есть...
If (Pos(#32,s)>0) or (Pos(#9,s)>0) then
begin
r:='';
for i:=1 to Length(s) do
If (s[i]<>#32) and (s[i]<>#9) then r:=r+s[i];
s:=r;
end;
//Наличие "=" в строке - принак, что она содержит параметр и значение
If Pos('=',s)>0 then
begin
v:=LowerCase(Copy(s,1,Pos('=',s)-1)); //Параметр - до "="
p:=LowerCase(Copy(s,Pos('=',s)+1,Length(s)-Pos('=',s))); //Значение - после "="
//Далее проверяем на наличие имён наших переменных
// и присваиваем им в зависимости от типа значение...
If v='b_param1' then b_param1:=GetBoolVal(p);
If v='b_param2' then b_param2:=GetBoolVal(p);
If v='b_param3' then b_param3:=GetBoolVal(p);
If v='i_param1' then i_param1:=GetIntVal(p);
If v='i_param2' then i_param2:=GetIntVal(p);
If v='e_param1' then e_param1:=GetExtVal(p);
If v='e_param2' then e_param2:=GetExtVal(p);
end;
end;
var
f: TextFile; //Файловая переменная
s: string; //Текущая строка
begin
//Открываем файл...
AssignFile(f,'test.ini');
Reset(f);
//И читаем из него строки и обрабатываем их...
while not EOF(f) do
begin
Readln(f,s);
CalcLine(s);
end;
//После - закрываем файл
CloseFile(f);
//Сам себя не похвалишь... :)
Writeln(#13#10' INI_Loader (Open Source)');
Writeln(#13#10' Copyright (c) 2003 Nabatnikov Ivan');
Уважаемые подписчики! Возможно кому-то из ваших знакомых приводимые здесь материалы очень интересны и вы можете отправить этому человеку приглашение на подписку: Отправить приглашение подписаться.
Все вопросы и пожелания ко мне, т.е. ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Перепубликация допускается только с моего разрешения.
В случае, если вы будете использовать приведённые в этой рассылке коды, не забудьте сделать ссылку на мой сайт.