скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Урок 9 - Работа с INI файлами



Ведущий раздела KOL и MCK: Анатолий aka XVeL
Автор: Борис Моренко
WEB-сайт: http://kolmck.net/

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

Cвойство Описание
FileName Имя ini файла
Mode Отвечает в каком режиме находится Ini файл: для чтения или для записи
Section Секция из которой (или в которую) идет чтение (или запись)
GetSectionNames Читает список секций в этом ini-файле
SectionData Читает данные из текущей секции
ClearAll Удаляет все секции в ini-файле
ClearSection Удаляет текущую секцию
ClearKey Удаляет ключ (переменную)





Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook