Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Исключения, возникающие при работе с базами данных

Delphi, обладая прекрасными средствами доступа к данным, основывающимися на интерфейсе IDAPI, реализованной в виде библиотеки Borland Database Engine (BDE), включает ряд обработчиков исключительных ситуаций для регистрации ошибок в компонентах VCL работающим с БД. Дадим краткую характеристику основным из них:

 

· EDatabaseError - наследник Exception; происходит при ошибках доступа к данным в компонентах-наследниках TDataSet. Объявлено в модуле DB. Ниже приведен пример из Delphi On-line Help, посвященный этому исключению:

 

repeat {пока не откроем таблицу или не нажмем кнопку Cancel}

try

Table1.Active:= True; {Пытаемся открыть таблицу}

Break; { Если нет ошибки - прерваем цикл}

except

on EDatabaseError do

{Если нажата OK - повторяем попытку открытия Table1}

if MessageDlg('Не могу открыть Table1', mtError,

[mbOK, mbCancel], 0) <> mrOK

then

raise;

end;

until False;

 

· EDBEngineError - наследник EDatabaseError; вызывается, когда происходят ошибки BDE или на сервере БД. Объявлено в модуле DB:

 

EDBEngineError = class(EDatabaseError)

private

FErrors: TList;

function GetError(Index: Integer): TDBError;

function GetErrorCount: Integer;

public

constructor Create(ErrorCode: DBIResult);

destructor Destroy;

property ErrorCount: Integer;

property Errors[Index: Integer]: TDBError;

end;

 

Особенно важны два свойства класса EDBEngineError:

Errors - список всех ошибок, находящихся в стеке ошибок BDE. Индекс первой ошибки 0;

ErrorCount - количество ошибок в стеке.

Объекты, содержащиеся в Errors, имеют тип TDBError. Доступные свойства класса TDBError:

ErrorCode - код ошибки, возвращаемый Borland Database Engine;

Category - категория ошибки, описанной в ErrorCode;

SubCode - ‘субкод’ ошибки из ErrorCode;

NativeError - ошибка, возвращаемая сервером БД. Если NativeError 0, то ошибка в ErrorCode не от сервера;

Message - сообщение, переданное сервером, если NativeError не равно 0; сообщение BDE - в противном случае.

 

· EDBEditError - наследник Exception; вызывается, когда данные не совместимы с маской ввода, наложенной на поле. Объявлено в модуле Mask.

 

Заключение

Данный урок должен был дать вам достаточно информации для того, чтобы начать исследование того, как Вы можете использовать систему обработки исключительных ситуаций в вашей программе. Вы, конечно, можете обрабатывать ошибки и без привлечения этой системы; но с ней Вы получите лучшие результаты с меньшими усилиями.


 

 

Удобным средством запоминания текущих настроек приложения являются 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 не существует, выдается значение, равное единице.

 





Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 794; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.108 сек.