Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка Фролов

.pdf
Скачиваний:
18
Добавлен:
14.03.2016
Размер:
840.19 Кб
Скачать

if REG.OpenKey('Software\ProjectVRB\Names',true) then

begin

if REG.ValueExists(str_i) {Выясняется, существует ли значение параметра у подключа}

then begin

name:=REG.ReadString(str_i); ComboBox1.Items.Add(name); end

else Exit; {Выход из цикла чтения осуществляется, как только не найден параметр очередного подключа ключа Names реестра}

end

else ShowMessage('Ошибка реестра! Переустановите программу!'); REG.CloseKey;

REG.Destroy;

end;

end;

2.8.5. Работа с функциями, хранящимися в dll

Dll (англ. dynamic-link libraries – динамически подключаемые библиотеки) – это выполняемые модули, по своей структуре схожие с exe файлами, содержащие программный код или ресурсы, используемые другими прикладными программами или Dll.

Для создания пользовательской dll в Delphi 7 необходимо воспользоваться командой File – New – Other – DLL Wizard. Общая структура dll выглядит следующим образом:

library name; uses

<используемые модули>;

91

<объявления и описания функций> exports

<экспортируемые функции> begin

<инициализационная часть> end.

Приведем пример dll, используемой в программе «Расчет усилия зажима заготовки при токарной обработке» [18] для расчета усилия зажима зажимного устройства.

library zazhim_1; uses

SysUtils, Classes; {$R *.res}

{Функция для расчета зажимного усилия}

function calc_q (a, b, c: real): real; stdcall; {Существует два способа передачи аргументов функции: stdcall – используется при вызовах WinAPI функций; cdecl – при использовании dll, написанных на C++}

begin calc_q:=…; end; exports

calc_q; {Функция calc_q экспортируется} begin

end.

Существует два способа загрузки библиотек: статический и динамический. Статический используется, как правило, тогда, когда в библиотеке небольшое количество функций и процедур, которые наверняка будут использоваться в программе. Если же библиотека содержит большое количе-

92

ство процедур или функций, или они используются программой не часто, то целесообразнее использовать динамическую загрузку. Статическая загрузка имеет существенный минус. Если при попытке загрузить dll она не будет найдена, то будет получена ошибка, препятствующая запуску программы. Данного минуса лишена динамическая загрузка библиотеки. Если при попытке загрузить dll она не будет найдена, программа запустится и в момент попытки использования функции из отсутствующей dll, возникнет исключение, которое можно программно обработать и продолжить выполнение программы.

В программе «Расчет усилия зажима заготовки при токарной обработке» [18] используется динамическая загрузка dll-библиотеки. Приведем программный код загрузки dll-библиотеки и использования ее функций.

procedure TForm1.RunButtonClick(Sender: TObject); var

LibHandle: Hmodule; {Объявление дескриптора загружаемой библиотеки}

raschet_q: function (a, b, c: real): real; stdcall; {Объявление переменной процедурного ти-

па}

lib_name_char: array[0..12] of WideChar; {Объявление массива типа WideChar в кото-

рый будет передаваться имя dl-библиотеки вида zazhim_1.dll}

begin

{Имя dll-библиотеки, соответствующее которой название зажимного устройства выбирается пользователем в объекте ComboBox1, извлекается из реестра} item:=FloatToStr(ComboBox1.ItemIndex);

REG:= TRegistry.Create; REG.RootKey:=HKEY_LOCAL_MACHINE; REG.OpenKey('Software\ProjectVRB\Files',true); lib_name:=REG.ReadString(item);

93

StringToWideChar(lib_name, lib_name_char, 13); {Dll-библиотека лежит в корневом каталоге программы; описание функции StringToWideChar дано ниже}

REG.CloseKey;

REG.Destroy;

{закончено извлечение имени dll-библиотеки из реестра}

LibHandle:= LoadLibrary(lib_name_char); {Осуществляется загрузка dll-библиотеки} if LibHandle <> 0 then {Проверка существования dll-библиотеки}

begin

@raschet_q:=GetProcAddress(LibHandle, 'calc_q'); {Запоминается адрес необходи-

мой функции}

if @raschet_q <> nil then {Проверка существования в dll-библиотеке необходимой функции}

begin

q:=raschet_q(px, pz, pzh); {Использование функции из dll-библиотеки}

Edit13.Text:=FloatToStr(q); end

else begin

ShowMessage('Функция в dll-библиотеке не найдена'); FreeLibrary(LibHandle); {Осуществляется выгрузка dll-библиотеки}

Exit; end;

FreeLibrary(LibHandle); end

else begin

ShowMessage('Dll-библиотека не найдена''); Exit;

end;

Функция StringToWideChar (StringToWideChar (const SourceString : string; TargetBuffer : PWideChar; TargetSize : Integer ) : PWideChar) конвертирует строку SourceString в WideString. Затем она копирует TargetSize-1

94

символов из полученной строки в TargetBuffer, добавляя завершающий 0 в конец.

2.8.6. Работа с базами данных Microsoft Access

Не вдаваясь в подробности организации доступа к базам данных в Delphi, скажем, что для этого удобнее всего использовать созданный компанией Microsoft интерфейс высокого уровня, называемый ActiveX Data Object (ADO), ориентированный на применение в прикладных программах.

Примером работы с базами данных Microsoft Access может служить программа «Оптимизация трех стадий токарной обработки» [17]. В ней база данных используется для ввода технических характеристик металлорежущих станков. Схема данных базы данных приведена на рис. 2.9.

Рис. 2.9. Схема данных

Для работы с базами данных Microsoft Access посредством ADO в предложении uses раздела текста программы interface включаются модули DB и ADODB.

95

Работа с базой данных Microsoft Access начинается с подключения таблицы, данные из которой будут использоваться. Для этого на форму наносится объект ADOTable, класса TADOTable (рис. 2.10).

Рис. 2.10. Фрагмент формы с расположенными на нем объектами для работы с базой данных Microsoft Access (1 – ADOTable1; 2 – ADOQuery1; 3 – ADOQuery2)

Затем необходимо при помощи Инспектора объектов заполнить некоторые свойства объекта ADOTable.

Во-первых – свойство ConnectionString. Щелкнув левой кнопкой мыши по кнопке с троеточием справа от интересующего свойства можно вызвать мастер его заполнения. В появившемся окне необходимо выбрать опцию

Use Connection String и нажать клавишу Build.

На первой вкладке мастера выбирается «поставщик данных» (рис. 2.11, а), т.е. тип подключаемой базы данных. Для подключения к базе дан-

ных Microsoft Access используется Microsoft Jet 4.0 OLE DB Provider. На вкладке «Подключение» требуется указать файл базы данных и учетные данные для подключения (см. рис. 2.11, б). По умолчанию для баз данных Microsoft Access используется имя пользователя Admin и пустой пароль.

Также существует возможность осуществить выбор пути к файлу базы данных непосредственно во время выполнения программы.

Для этого на форму необходимо добавить объект ADOConnection, заполнив его свойство ConnectionString как показано выше для объекта

ADOTable.

96

а

б

Рис. 2.11. Заполнение свойства ConnectionString объекта ADOTable

Следует учесть, что после добавления объекта ADOConnection отпадает необходимость заполнения свойства ConnectionString у объектов ADOTable, ADOQuery и т.п. Вместо него свойству Connection указанных объектов присваивается имя объекта ADOConnection. Затем, для выбора пути к файлу базы данных можно использовать, например, следующий программный код:

procedure TForm1.Button3Click(Sender: TObject); begin

if opendialog2.Execute then begin

adoconnection1.Connected:=false; {Перед изменением свойства ConnectionString необ-

ходимо разрывать соединение с базой данных} adoconnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data

Source='+opendialog2.FileName+';Mode=ReadWrite|Share Deny None;Persist Security

97

Info=False'; {Добавление в ConnectionString пути к файлу базы данных, полученному в результате работы диалога открытия файла (подчеркнуто)}

adoconnection1.Connected:=true; {Создание соединения с базой данных} end;

end;

Во вторую очередь заполняется свойство TableName. Здесь необходимо из выпадающего списка справа от имени свойства выбрать необходимую таблицу из подключенной ранее базы данных.

В конце, после выполнения двойного щелчка,левой кнопкой мыши на иконке объекта ADOTable, требуется указать посредством пункта контекстного меню (вызывается щелчком правой кнопки мыши) Add Fields поля выбранной таблицы, обращение к которым будет осуществляться в ходе работы программы (рис. 2.12).

Рис. 2.12. Выбор полей таблицы

Работа с данными, содержащимися в базе, осуществляется посредством объекта ADOQuery при помощи языка SQL. После размещения объекта ADOQuery на форме, необходимо заполнить некоторые его свойства. В первую очередь заполняется свойство ConnectionString аналогично

98

одноименному свойству объекта ADOTable. Затем заполняется свойство SQL, которое представляет собой запрос к базе данных, составленный на языке SQL. Не останавливаясь подробно на самом языке, приведем пример запроса на выборку модели станка из таблицы mtools (используется в объ-

екте ADOQuery1): select model from mtools where cod = :cod. Как видно из примера, выборка осуществляется не по конкретному значению поля cod, а по параметру cod, значение которому присваивается в ходе выполнения программы. Параметры, используемые в запросе, перечисляются в свойстве Parameters объекта ADOQuery, где им присваивается тип данных.

Для окончательной настройки объекта ADOQuery по двойному щелчку мыши на нем вызывается диалог добавления полей таблицы, значения которых будут возвращаться соответствующим запросом. Поля добавляются при помощи пункта контекстного меню Add Fields.

Приведенный выше запрос ADOQuery1 используется при заполнении объекта ComboBox моделями станков в момент запуска программы «Оптимизация трех стадий токарной обработки» [17]. Приведем соответствующий программный код.

procedure TForm1.FormCreate(Sender: TObject); var i, cod: integer;

begin

adotable1.Open; {Открывается база данных, указанная в объекте ADOTable1} i:=0;

cod:=1;

while i<>adotable1.RecordCount do {Цикл добавления моделей станков в объект ComboBox1 осуществляется до тех пор, пока не кончатся записи в таблице}

begin

adoquery1.Parameters.ParamByName('cod').Value:=cod; {Параметру cod присваива-

ется значение, сгенерированное программой}

adoquery1.Open; {Открывается запрос на выборку модели станка по параметру из таблицы}

99

combobox1.Items.Add(adoquery1model.Value); {Результат выполнения запроса (мо-

дель станка) заносится в объект combobox1} adoquery1.Close;

i:=i+1;

cod:=cod+1;

end;

adotable1.Close;

end;

Заполнение объекта ComboBox моделями станков в момент запуска программы «Оптимизация трех стадий токарной обработки» [17] может осуществляться также по SQL запросу без указания конкретных параметров: select model from mtools. Для это необходимо выполнить следующий программный код:

procedure TForm1.FormCreate(Sender: TObject); var i: integer;

begin

ADOTable1.Open;

ADOQuery3.Open;

i:=1;

while i<=ADOQuery3.RecordCount do {метод ADOQuery3.RecordCount определяет ко-

личество записей, удовлетворяющих запросу} begin

ComboBox1.Items.Add(ADOQuery3model.Value); ADOQuery3.Next; {осуществляется переход к следующей записи} inc(i);

end;

ADOTable1.Close;

ADOQuery3.Close;

end;

100