Работа с ini файлами.

Работа с ini файлами.

Если вы не являетесь любителем забивать свои и чужие реестры мегабайтами мусора, или просто не надеетесь на сохранность информации в нем (когда нибудь 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 Удаляет ключ (переменную)


Опубликовал admin
5 Май, Понедельник 2003г.



Программирование для чайников.