Если вы не являетесь любителем забивать свои
и чужие реестры мегабайтами мусора, или просто
не надеетесь на сохранность информации в нем
(когда нибудь Windows наверняка умрет), то вам
надо обратить свои взоры на старые добрые
Ini-файлы.
В KOL работа с ini организованна с помощью
объекта TIniFile.
Для того чтобы открыть ini-файл (и одновременно
создать TIniFile), надо воспользоваться функцией
OpenIniFile.
Свойство Mode отвечает за то, что вы
будете делать с ini файлом : производить запись
или чтение. Для записи вы должны прировнять Mode
к ifmWrite, и соответственно для чтения к
ifmRead. По умолчанию (при открытии) Mode =
ifmRead, т.е. для чтения.
Для чтения/записи данных из ini используют 4
функции. Их описание приведено в таблице :
Функция |
Выполняемое
действие |
ValueInteger
|
Чтение/запись
данных Value
типа integer под
именем Key
|
function
ValueInteger(
const Key:
String; Value:
Integer ):
Integer;
|
ValueString
|
Чтение/запись
данных Value
типа string под
именем Key
|
function
ValueString(
const Key:
String; const
Value: String ):
String;
|
ValueBoolean
|
Чтение/запись
данных Value
типа boolean под
именем Key
|
function
ValueBoolean(
const Key:
String; Value:
Boolean ):
Boolean;
|
ValueData
|
Чтение/запись
данных на
которые
указывает Value
длинной Count
под именем Key
|
function
ValueData(
const Key:
String; Value:
Pointer; Count:
Integer ):
Boolean;
|
Еще раз повторюсь и напомню, что чтение или
запись происходит в зависимости от того чему
равно свойство Mode.
Как известно ini файлы построены по
следующему принципу
[Section1]
Key1=Value
Key2=Value
...
[Section2]
Key1=Value
Key1=Value
...
Section - секция (раздел) ini файла.
Key - имя переменной
Value - Переменная которая записывается под
именем Key
(Кто этого не знал, может открыть любой ini файл
и убедится в этом).
За то из какой секции происходит чтение (или
запись) отвечает свойство Section. Для
того чтобы получить список секций надо обратится
к GetSectionNames. А для получения данных
из секции, надо воспользоваться SectionData.
И у первой и второй процедуры данные
записываются в объект типа pStrList (список
строк).
Я про него пока ничего не рассказывал, но он
мало чем отличается от от VCL аналога
TStringList. Но отличия все-таки есть, и к
сожалению не в пользу pStrList. У pStrList нет
таких свойств как Name и Value, а они бы не
помешали, так как SectionData возвращает список
из переменных и их значений в том же виде, в
каком они записаны в ini файле (т.е разделенные
знаком равно).
Ну это не такая и большая проблема :) В
подтверждение этого, маленький примерчик
простенького ini-редактора.
Программа внешне состоит из двух списков (List1
и List2). В List1 заносятся имена секторов, а в
List2 список переменных и их значения. Сверху
два поля (edName и edDan), в которые заносятся
имя переменной и ее значение, когда происходит
двойной клик по List2. Поле edDan (в него
заносятся значение) можно редактировать.
program Primer_2;
uses
windows,
messages,
kol;
var
Form,
panTop,
buWrite,
edDan,edName,
List1,List2:pControl;
dialog:pOpenSaveDialog;
strList:pStrList;
ini:pIniFile;
i:integer;
/////////////////////////////////////////////////////////////////////
// обработка клика по кнопке"записать "
Procedure ClickOnBuWrite( Dummy : Pointer; Sender : PControl );
begin
if edName.Text = '' then exit;
ini.Mode := ifmWrite;
ini.ValueString(edName.Text,edDan.text);
ini.Mode := ifmRead;
end;
/////////////////////////////////////////////////////////////////////
Procedure ClickOnList2( Dummy : Pointer; Sender : PControl );
var
s:string;
i:integer;
begin
s:= List2.Items[List2.CurIndex];
i:= IndexOfChar(s,'=');
edName.Text := Copy(s,0,i-1);
edDan.Text := CopyEnd(s,i+1);
end;
/////////////////////////////////////////////////////////////////////
Procedure ClickOnList1( Dummy : Pointer; Sender : PControl );
var
j:integer;
begin
edName.Clear ;
edDan.Clear ;
j:=List1.CurIndex;
// заносим в List2 данные, которые находятся в j-ой секции
strList.Clear ;
List2.Clear ;
ini.Section := List1.Items[j];
ini.SectionData(strList);
for i:=0 to strList.Count-1 do
List2.Items[i]:=strList.Items[i];
end;
/////////////////////////////////////////////////////////////////////
begin
Applet := NewApplet('Пример #2');
dialog := NewOpenSaveDialog('Выбор ini','',[]);
dialog.Filter := '*.ini|*.ini|все|*.*';
dialog.OpenDialog := true;
if dialog.Execute then
ini:=OpenIniFile(dialog.Filename)
else
exit;
//----------- делаем интерфейс ------------------------
Form := NewForm(Applet,'Работа с Ini файлами').setSize(400,300);
Form.Font.FontName := 'MS Sans Serif';
Form.Font.FontHeight := 9;
Form.Style := WS_BORDER or WS_SYSMENU or WS_VISIBLE;
panTop := NewPanel(Form,esRaised ).SetAlign(caTop) ;
panTop.Height := 60 ;
buWrite := NewButton(panTop,'Записать');
buWrite.OnClick := TOnEvent( MakeMethod( nil, @ClickOnBuWrite ) );
edName := NewEditBox(panTop,[eoReadOnly]). PlaceDown;
edDan := NewEditBox(panTop,[]). PlaceRight;
edDan.Width := Form.Width -edName.Width- 30;
strList:= NewStrList;
List1 := NewListBox(Form,[]).setAlign(caLeft);
List2 := NewListBox(Form,[]).setAlign(caClient);
//---------------------------------------------------
// заносим в List1 список секций
ini.GetSectionNames(strList);
for i:=0 to strList.Count-1 do
List1.Items[i]:=strList.Items[i];
List1.OnChange := TOnEvent( MakeMethod( nil, @ClickOnList1 ) );
// показываем данные из 0-ой секции
List1.CurIndex := 0;
ClickOnList1(nil,nil);
List2.OnClick := TOnEvent( MakeMethod( nil, @ClickOnList2 ) );
run(Applet);
end.
Исходный текст : 2,64 Кб ; размер программы:
32,5Кб(без сжатия и замены System).
А теперь таблица подытоживающая все
вышесказанное, а также рассказывающая про
свойства pIniFile, которые не были затронуты:
Источник:
http://bonanzas.rinet.ru ,
http://kol.mastak.ru
Cвойство |
Описание |
FileName |
Имя ini файла |
Mode |
Отвечает в каком
режиме находится
Ini файл: для
чтения или для
записи |
Section |
Секция из
которой (или в
которую) идет
чтение (или
запись) |
GetSectionNames
|
Читает список
секций в этом
ini-файле |
SectionData |
Читает данные из
текущей секции |
ClearAll |
Удаляет все
секции в
ini-файле |
ClearSection |
Удаляет текущую
секцию |
ClearKey |
Удаляет ключ
(переменную) |
|