![]() |
![]() ![]() ![]() ![]() |
|
Урок 9 - Работа с INI файламиDelphi , Технологии , KOL и MCK
Ведущий раздела KOL и MCK: Анатолий aka XVeL Полную версию библиотеки KOL и MCK можно скачать здесь. Если вы не являетесь любителем забивать свои и чужие реестры мегабайтами мусора, или просто не надеетесь на сохранность информации в нем (когда нибудь Windows наверняка умрет), то вам надо обратить свои взоры на старые добрые Ini-файлы. В KOL работа с ini организованна с помощью объекта TIniFile.
Для чтения/записи данных из ini используют 4 функции. Их описание приведено в таблице :
Еще раз повторюсь и напомню, что чтение или запись происходит в зависимости от того чему равно свойство Mode. Как известно ini файлы построены по следующему принципу
Key1=Value Key2=Value ... [Section2] Key1=Value Key1=Value ... 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, которые не были затронуты:
В статье описана работа с INI файлами в программе KOL, представлен пример простого редактора ini-файлов. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш
|
||||||||||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||||||||||||||||||||||||||||||||||