Работа с 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.   


Теги:
ini
Добавлено: 26 Июля 2018 22:19:52 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...