Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  115

•  TDictionary Custom Sort  3 304

•  Fast Watermark Sources  3 054

•  3D Designer  4 807

•  Sik Screen Capture  3 304

•  Patch Maker  3 522

•  Айболит (remote control)  3 623

•  ListBox Drag & Drop  2 982

•  Доска для игры Реверси  81 495

•  Графические эффекты  3 908

•  Рисование по маске  3 218

•  Перетаскивание изображений  2 602

•  Canvas Drawing  2 724

•  Рисование Луны  2 548

•  Поворот изображения  2 157

•  Рисование стержней  2 156

•  Paint on Shape  1 561

•  Генератор кроссвордов  2 220

•  Головоломка Paletto  1 760

•  Теорема Монжа об окружностях  2 205

•  Пазл Numbrix  1 678

•  Заборы и коммивояжеры  2 049

•  Игра HIP  1 274

•  Игра Go (Го)  1 220

•  Симулятор лифта  1 465

•  Программа укладки плитки  1 211

•  Генератор лабиринта  1 537

•  Проверка числового ввода  1 346

•  HEX View  1 484

•  Физический маятник  1 351

 
скрыть


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

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



Delphi Sources

Урок 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 Удаляет ключ (переменную)




Похожие по теме исходники

Nstruct (работа с DBF)

Работа с принтером

fwZIP - Работа с ZIP архивами

Mini Audio Player

 

Snake & MiniSaper WinApi

Mini WebBrowser (браузер)

FTP MiniChat

IniEx2

 

Mini HTML Editor

INI XML Files

Work with INI

Mini Archiver (архиватор)

 



Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте