Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Создание и использование ini-файлов






 

 

Удобным средством запоминания текущих настроек приложения являются ini-файлы.

Ini-файлы - это текстовые файлы, предназначенные для хранения информации о формах или о настройках различных приложений. Информация в файле логически группируется в разделы, каждый из которых начинается оператором заголовка, заключенным в квадратные скобки. Например, [Desktop]. В строках, следующих за заголовком, содержится информация, относящаяся к данному разделу, в форме:

 

< ключ> =< значение>

 

Любое приложение можно зарегистрировать в системном реестре и зафиксировать там же текущие настройки приложения (в 32-разрядных Windows и выше). Для 32-разрядных приложений Microsoft не рекомендует работать с ini-файлами. Несмотря на это, и 32-разрядные приложения, наряду с реестром, часто используют эти файлы. Да и разработки Microsoft не обходятся без этих файлов.

В качестве примера ниже приводится фрагмент файлаODBC.ini:

[ODBC 32 bit Data Sources]

dBASE Files = Microsoft dBase Driver (*.dbf) (32 bit)

Excel Files = Microsoft Excel Driver (*.xls) (32 bit)

FoxPro Files = Microsoft FoxPro Driver (*.dbf) (32 bit)

Text Files = Microsoft Text Driver (*.txt; *.csv) (32 bit)

 

[dBASE Files]

Driver32 = C: \WINDOWS\SYSTEM\odbcjt32.dll

 

Ini-файлы, как правило, хранятся в каталоге Windows, который можно найти с помощью функцииGetWindowsDirectory.

В Delphi работу с ini-файламипроще всего осуществлять с помощью создания в приложении объекта типаTIniFile. Этот тип описан в модулеIniFiles, который надо подключать к приложению операторомuses (автоматически это не делается).

Создается объект типаTIniFile методомСгеаtе(< имя файла>); в который передается имя ini-файла, с которым он связывается. Файл должен существовать до обращения к методуCreate.

Для записи значений ключей существует много методов: WriteString, WriteInteger, WriteFloat, WriteBool и др. Каждый из них записывает значение соответствующего типа. Объявления всех этих методов очень похожи. Например:

 

procedure WriteString (const Section, Ident, Value: string);

procedure WriteInteger(const Section, Ident: string;

Value: Longint);

 

Здесь Section — раздел ini-файла, Ident — имя ключа, Value — значение ключа. Если соответствующий раздел или ключ отсутствует в файле, он автоматически создается.

Имеются аналогичные методы чтения значений ключей: ReadString, ReadInteger, ReadFloat, ReadBool и др. Например:

 

function ReadString(const Section, Ident, Default: string)

: strings;

function ReadInteger(const Section, Ident: string;

Default: Longint): Longint;

 

В этих примерах методы чтения возвращают значение ключаIdent разделаSection. ПараметрDefaultопределяет значение, возвращаемое в случае, если в файле не указано значение соответствующего ключа.

Проверить наличие значения ключа можно методомValueExists, в который передаются имена раздела и ключа. МетодDeleteKey удаляет из файла значение указанного ключа в указанном разделе.

Проверить наличие в файле необходимого раздела можно методомSectionExists. МетодEraseSection удаляет из файла указанный раздел вместе со всеми его ключами. Имеется еще ряд методов, которые можно посмотреть во встроенной справке Delphi.

Рассмотрим на примере, как запоминать и удалять настройки программы. Создадим простое тестовое приложение. Поместим на форму три компонента Button и компонент FontDialog.

Первой кнопку дадим имя (Name) BInst и зададим Install в ее свойстве Caption. Эта кнопка будет имитировать установку программы. Точнее, не саму установку, поскольку копировать файлы с установочной дискеты мы не будем, а только создание ini-файлав каталоге Windows.

Вторую кнопку назовем BUnInst и зададим UnInstall в ее свойстве Caption. Эта кнопка будет имитировать удаление программы. Здесь мы не будем удалять программу с диска, а только удалим из каталога Windows наш ini-файл.

Третью кнопку назовем BFont и зададим Font в ее свойстве Caption. С помощью этой кнопки будем менять имя шрифта, используемого в форме. Имя этого шрифта надо будет запоминать в ini-файле, чтобы в дальнейшем при запуске приложения можно было читать эту настройку и задавать ее форме.

Ниже приведен текст приложения, решающего поставленную задачу.

 

unit DEMO1_IniFiles;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, IniFiles;

 

type

TForm1 = class(TForm)

BInst: TButton;

BUnInst: TButton;

BFont: TButton;

FontDialog1: TFontDialog;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure BInstClick(Sender: TObject);

procedure BUnInstClick(Sender: TObject);

procedure BFontClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

Ini: TIniFile;

sFile: string;

 

implementation

{$R *.dfm}

 

procedure TForm1.FormCreate(Sender: TObject);

var

APchar: array[0..254] of Char;

begin

//Формирование имени каталога Windows

GetWindowsDirectory(APchar, 255);

//Формирование имени ini-файла в каталоге Windows

sFile: = string(APchar) + '\My.ini';

if FileExists(sFile) then

begin

Ini: = TIniFile.Create(sFile);

// Чтение в имя шрифта формы значения ключа Шрифт

Font.Name: = Ini.ReadString('Параметры', 'Шрифт',

'MS Sans Serif');

end;

end;

 

procedure TForm1.BInstClick(Sender: TObject);

var

f: File;

begin

//Проверка существования ini-файла

if (not FileExists(sFile)) then

begin

// Создание ini-файла

AssignFile(f, sFile);

Rewrite(f);

CloseFile(f);

Ini: = TIniFile.Create(sFile);

end;

//Создание раздела Files, ключа main и запись в него имени

//выполняемого файла вместе с путем

Ini.WriteString('Files', 'main', ParamStr(0));

//Создание раздела Параметры, ключа Шрифт и

//запись в него имени шрифта формы

Ini.WriteString('Параметры', 'Шрифт', Font.Name);

end;

 

procedure TForm1.BUnInstClick(Sender: TObject);

var

F: File;

begin

//Удаление с диска ini-файла, если он существует

if FileExists(sFile) then

begin

AssignFile(F, sFile);

Erase(F);

end;

end;

 

procedure TForm1.BFontClick(Sender: TObject);

begin

//Выбор шрифта

if (FontDialog1.Execute) then

begin

// Присваивание выбранного шрифта форме

Font.Assign(FontDialog1.Font);

if (Ini< > nil) and Ini.ValueExists('Параметры', 'Шрифт')

then

// Запись шрифта в ключ " Шрифт" раздела " Параметры"

Ini.WriteString('Параметры', 'Шрифт', Font.Name);

end;

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

if (Ini = nil) then Exit;

//Очистка буфера и запись файла на диск

Ini.UpdateFile;

//Освобождение памяти

Ini.Free;

end;

 

end.

 

В начале текста следует подключение к приложению модуляIniFiles и объявление переменнойIni типаTIniFile, а также переменнойsFile, в которой будет формироваться имя файла и путь к нему.

Ini: TIniFile;

sFile: string;

При создании формы приложения в процедуре TForm1.FormCreate формируется имя файла ( My.Ini ) вместе с путем к нему - каталогом Windows. Путь Windows определяется функциейGetWindowsDirectory.

Далее функциейFileExists проверяется, существует ли этот файл, т.е. проведена ли уже установка программы. Если существует, то создается объектIni, связанный с этим файлом, и значение MS Sans Serif ключа Шрифт раздела Параметры читается в имя шрифта формы. Тем самым читается настройка, произведенная при предыдущем выполнении приложения.

Теперь рассмотрим процедуруTForm1.BInstClick, имитирующую установку программы. В этой процедуре сначала функциейFileExists проверяется, существует ли в каталоге Windows файлMy.Ini. Если не существует, то последовательным применением функцийAssignFile, RewriteиCloseFile этот файл (пока пустой) создается. Затем создается связанный с этим файлом объектIni. Последующие операторы записывают в этот файл два раздела Files и Параметры с соответствующими ключами.

В ключmain записывается имя приложения с путем к нему. Для этого используется функцияParamStr(0).

В результате в созданный файл записывается, например, такой текст:

 

[Files]

main = D: \DEMO Delphi\DEMO1_INI.EXE

 

[Параметры]

Шрифт = МS Sans Serif

 

ПроцедураTForml.BUnInstClick имитирует удаление приложения и его файла настройки. В данном случае просто удаляется ini-файл, но в настоящем приложении надо было бы прочитать имя файла (или файлов) приложения из раздела Files и удалить их с диска.

ПроцедураTForm1.FormDestroy, срабатывающая при закрывании формы приложения, сначала методомUpDateFile переписывает содержимое объектаIniв файл на диске, а затем методомFree удаляет из памяти этот временный объект.

ПроцедураTForml.BFontClick вызывает стандартный диалог выбора шрифта и если пользователь выбрал шрифт, то он присваивается форме и его имя заносится в ini-файл.

Сохраните свое приложение и запустите его на выполнение. Нажмите кнопку Install. После этого убедитесь в наличии файлаMy.Ini в каталоге Windows. Можете воспользоваться для этого программой Windows «Проводник» или любой другой. В частности, можно открыть этот файл просто из среды Delphi. При нажатии кнопки UnInstall файл должен удаляться с диска. Проверьте запись в файл настройки шрифта и чтение ее при последующих запусках. Для этого опять нажмите кнопку Install, а затем нажмите кнопку Font и выберите шрифт с каким-нибудь другим именем. Затем закройте свое приложение и запустите его повторно. Вы увидите, что на форме применен тот шрифт, который вы зарегистрировали в файле настройки. Таким образом, приложение проимитировало установку программы, удаление программы и запоминание ее текущих настроек.

 

После запуса программы и нажатия затем кнопки Install, используя проводник, в директории c: \windows можно увидеть файл MyIni.ini. Содержание файла:

 

[Files]

main = D: \DEMO DELPHI EXAMPLES\

DEMO1 INIFILES\PROJECTDEMO1INIFILES.EXE

 

[Параметры]

Шрифт = Times New Roman

 

После запуса программы и нажатия кнопки UnInstall в упомянутой директории файл MyIni.ini отсутствует.

 

Рассмотрим второй пример, в котором будем корректировать значение некоторой переменной и записывать ее значение в ini–файл, расположенный в текущей директории. Листинг unit DEMO2_INI приводится ниже.

 

unit DEMO2_INI;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, IniFiles, StdCtrls;

 

type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Edit1: TEdit;

Label1: TLabel;

procedure Button1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action:

TCloseAction);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

{$R *.dfm}

 

var

ConfigFile: TIniFile;

Variable: byte; //Переменная

InitDir: string; //Текущий директорий

 

procedure TForm1.Button1Click(Sender: TObject);

begin

//Установить значение текущего директория

InitDir: = GetCurrentDir;

//Создать ini-файл Model в текущей директории

ConfigFile: = TIniFile.Create(InitDir + '\Model.ini');

//Прочитать значение переменной Variable

Variable: = StrToInt(ConfigFile.ReadString('Model',

'Variable', '1'));

//Показать значение переменной Variable в окне Edit1

Edit1.Text: = IntToStr(Variable);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

//Прочитать значение переменной Variable

Variable: = StrToInt(Edit1.Text);

//Записать значение переменной Variable в INI-файл Model

ConfigFile.WriteString('Model', 'Variable',

IntToStr(Variable));

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action:

TCloseAction);

begin

Variable: = StrToInt(Edit1.Text);

ConfigFile.WriteString('Model', 'Variable',

IntToStr(Variable));

//Закрыть объеты TIniFile

ConfigFile.Free;

end;

 

end.

 

Работа программы проиллюстрирована комментариями в тексте программы. Как видно, используются две кнопки, окно редактирования и метка.

Если при чтении оператором

Variable: = StrToInt(ConfigFile.ReadString('Model',

'Variable', '1'));

в секции Model значение переменной Variable не существует, выдается значение, равное единице.

 







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.