Хранение формы в динамической библиотеке delphi. Создание DLL-библиотеки на Delphi

12.04.2019 Мониторы

Здравствуйте уважаемые коллеги!

В данной статье я постараюсь ответить на вопросы: Что такое DLL ? Для чего она нужна? И как создавать и использовать DLL при помощи Delphi .

Что такое DLL ?

Dynamic Link Library или сокращенно DLL — это библиотека, которая содержит в себе набор данных или функций для использования в других программах.

Области применения:

  • Хранение ресурсов: иконки, звуки, курсоры и т.д. Экономим на размере исполняемых файлов объединяя ресурсы в единую библиотеку.
  • Размещение отдельных модулей программы и форм интерфейса. Получаем возможность частичного обновления приложения, а при динамическом подключении, возможно обновлять модули без перезапуска основной программы.
  • Использование в качестве плагинов (PlugIn). Предоставляем возможность расширять функционал приложения без переписывания основного кода программы.
  • Библиотека может использоваться на разных языках программирования в не зависимости от языка на котором она была написана.

Создание собственной библиотеки DLL.

Для создания библиотеки заходим в меню File -> Other и выбираем Delphi Projects -> Dynamic-link Library .
Откроется текст кода с заготовкой для создания библиотеки:

Library Project1; uses System.SysUtils, System.Classes; {$R *.res} begin end.

Размещение ресурсов

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

Добавим форму «О программе».
Нажимаем File -> New -> VCL Form . Добавим текст и кнопку «ОК»:

Добавим функцию, которая будет выводить стандартный MessageBox с вопросом, кнопками «Да», «Нет» и с результатом в виде True или False .

Function YesNoDlg(const Question: PChar): boolean; stdcall; begin Result:= (MessageBox(0, Question, "Подтверждение", MB_YESNO + MB_ICONQUESTION) = ID_YES); end;

Обратите внимание на ключевое слово stdcall . Оно определяет как именно будут передаваться параметры и результаты при вызове функций. Более подробно можно почитать на странице wiki Соглашение о вызове.

Так же добавим процедуру, которая будет использоваться как плагин для основной программы. Которая будет добавлять кнопку «О программе» в основное меню программы для вызова созданного нами окна.
Код процедуры:

Procedure PlugIn(Form: TForm); stdcall; var i: integer; mi: TMenuItem; begin for i:= 0 to Form.ComponentCount - 1 do begin if (Form.Components[i].ClassName = "TMenuItem") and (Form.Components[i].Name = "miHelp") then begin mi:= TMenuItem.Create(Form.Components[i]); mi.Caption:= "О программе"; mi.OnClick:= fmAbout.onAboutButtonClick; TMenuItem(Form.Components[i]).Add(mi); Exit; end; end; end;

В процедуру в качестве параметра передается форма программы. Мы проверяем присутствует ли на ней пункт меню с именем «miHelp » и если меню нашлось, то добавляем в него свою кнопку.

Теперь укажем какие функции и процедуры можно использовать из нашей библиотеки.
Добавим строку:

Exports PlugIn, YesNoDlg;

Скомпилируем функцию Project -> Build или с помощью горячей клавиши Shift+F9 .
Если ошибок в коде нет, то в папке проекта должен появиться файл с расширением DLL .

Теперь перейдем к созданию приложения, которое будет использовать нашу библиотеку.

В приложении создадим форму Main в которой добавим компонент со следующими кнопками: Программа -> Выход и Помощь. Для последнего зададим имя — miHelp :

Перейдем к коду формы.

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

Рассмотрим статический способ подключения:

Type TfmMain = class(TForm) MainMenu: TMainMenu; miProgram: TMenuItem; miExit: TMenuItem; miHelp: TMenuItem; procedure FormCreate(Sender: TObject); procedure miExitClick(Sender: TObject); private public end; procedure PlugIn(Form: TForm); stdcall; external "SampleDLL.dll"; var ...

Ключевое слово external указывает на то, что данная функция подключается из внешней библиотеки.

На событие onCreate формы добавим вызов процедуры PlugIn :

Procedure TfmMain.FormCreate(Sender: TObject); begin PlugIn(Self); end;

В качестве параметра Form передаем в процедуру текущую форму (ключевое слово Self ).

При запуске программы у нас должен появится пункт «О программе» в разделе «Помощь» главного меню.

Переходим к динамическому способу подключения.

Нам понадобятся три функции WinApi :

LoadLibrary
Загружает библиотеку в память компьютера. В качестве результата возвращает указатель на библиотеку в памяти. В случае ошибки вернет 0.

LoadLibrary(lpLibFileName: LPCWSTR): HMODULE;

lpLibFileName — Имя файла библиотеки.

GetProcAddress
Найти функцию в библиотеки по имени. Результатом будет указатель на функцию. Если функция не найдена, то вернет nil .

GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC;

hModule
lpProcName — Имя функции.

FreeLibrary
Выгружает библиотеку из памяти компьютера. Результатом будет True в случае успешного выполнения и False в случае ошибки.

FreeLibrary(hLibModule: HMODULE): BOOL;

hLibModule — Указатель на загруженную библиотеку.

Теперь с помощью динамического способа получим ресурсы, нашу иконку и на кнопку «Выход» добавим вызов функции YesNoDlg для подтверждения закрытия программы.
На то же событие onCreate добавляем код:

Procedure TfmMain.FormCreate(Sender: TObject); var DLLHandle: THandle; begin PlugIn(Self); DLLHandle:= LoadLibrary("SampleDLL.dll"); if DLLHandle = 0 then raise Exception.Create("Не удалось подключить библиотеку "SampleDLL"!"); try Self.Icon.LoadFromResourceName(DLLHandle, "my_icon"); finally FreeLibrary(DLLHandle); end; end;

И на событие onClick пункта меню «Выход»:

Procedure TfmMain.miExitClick(Sender: TObject); var DLLHandle: THandle; Dlg: function(const Question: PChar): boolean; stdcall; begin DLLHandle:= LoadLibrary("SampleDLL.dll"); if DLLHandle = 0 then raise Exception.Create("Не удалось подключить библиотеку "SampleDLL"!"); try @Dlg:= GetProcAddress(DLLHandle, "YesNoDlg"); if not Assigned(@Dlg) then raise Exception.Create("Функция с именем "YesNoDlg" не найдена в библиотеке "SampleDLL"!"); if Dlg("Выйти из программы?") then Close; finally FreeLibrary(DLLHandle); end; end;

Если вы все написали верно, то после запуска программы должна поменяться иконка формы, добавиться кнопка «О программе», при нажатии на которую будет показывать форма About и на нажатие кнопки выход программа будет запрашивать подтверждение: «Выйти из программы?».

Надеюсь вам будет полезен этот небольшой пример использования возможностей DLL библиотек.
Исходники проекта можно скачать .

Предлагаю вашему вниманию очередной выпуск рассылки, в котором я продолжаю обсуждать
вопросы разработки и использования DLL в Borland Delphi. Для новых подписчиков сообщаю,
что первую часть статьи они могут посмотреть в архиве рассылки, выпуск номер 13.
Прошу прощения у тех, кто писал мне, но не получил ответа. В ближайшее время постараюсь это исправить.
Итак, продолжим.

Прежде чем начать использование какой-либо процедуры или функции, находящейся в динамической библиотеке,
вам необходимо загрузить DLL в оперативную память. Загрузка библиотеки может быть осуществлена
одним из двух способов: статическая загрузка и динамическая загрузка.
Оба метода имеют как преимущества, так и недостатки.
Статическая загрузка означает, что динамическая библиотека загружается автоматически
при запуске на выполнение использующего ее приложения. Для того чтобы использовать такой способ загрузки,
вам необходимо воспользоваться ключевым словом external при описании экспортируемой из
динамической библиотеки функции или процедуры. DLL автоматически загружается при старте программы,
и Вы сможете использовать любые экспортируемые из нее подпрограммы точно так же,
как если бы они были описаны внутри модулей приложения.
Это наиболее легкий способ использования кода, помещенного в DLL .
Недостаток метода заключается в том, что если файл библиотеки, на который
имеется ссылка в приложении, отсутствует, программа откажется загружаться.
Смысл динамического метода заключается в том, что вы загружаете библиотеку не при старте приложения,
а в тот момент, когда вам это действительно необходимо. Сами посудите, ведь если функция, описанная
в динамической библиотеке, используется только при 10% запусков программы, то совершенно нет
смысла использовать статический метод загрузки. Выгрузка библиотеки из памяти в данном случае
также осуществляется под вашим контролем. Еще одно преимущества такого способа
загрузки DLL - это уменьшение (по понятным причинам) времени старта вашего приложения.
А какие же у этого способа имеются недостатки? Основной, как мне кажется, - это то, что использование
данного метода является более хлопотным, чем рассмотренная выше статическая загрузка.
Сначала вам необходимо воспользоваться функцией Windows API LoadLibrary .
Для получения указателя на экспортируемой процедуры или функции должна
использоваться функция GetProcAddress. После завершения использования библиотеки DLL
должна быть выгружена с применением FreeLibrary.
Вызов процедур и функций, загруженных из DLL.
Способ вызова процедур и функций зависит от того, каким образом вы загрузили динамическую библиотеку,
в которой эти подпрограммы находятся.
Вызов функций и процедур из статически загруженных DLL достаточно прост. Первоначально в приложении
должно содержаться описание экспортируемой функции (процедуры). После этого вы можете их использовать
точно так же, как если бы они были описаны в одном из модулей вашего приложения.
Для импорта функции или процедуры, содержащейся в DLL , необходимо использовать
модификатор external в их объявлении. К примеру, для рассмотренной нами выше процедуры HelloWorld
в вызывающем приложении должна быть помещена следующая строка:
procedure SayHello(AForm: TForm); external myfirstdll.dll";
Ключевое слово external сообщает компилятору, что данная процедура может быть найдена в
динамической библиотеке (в нашем случае - myfirstdll.dll).
Далее вызов этой процедуры выглядит следующим образом:
...
HelloWorld(self);
...
При импорте функции и процедур будьте особенно внимательны при написании их имен и интерфейсов!
Дело в том, что в процессе компиляции приложения не производится проверки на правильность имен объектов,
экспортируемых из DLL, осуществляться не будет, и если вы неправильно описали какую-нибудь функцию,
то исключение будет сгенерировано только на этапе выполнения приложения.
Импорт из DLL может проводиться по имени процедуры (функции), порядковому номеру или
с присвоением другого имени.
В первом случае вы просто объявляете имя процедуры и библиотеку, из которой ее импортируете
(мы это рассмотрели чуть выше). Импорт по порядковому номеру требует от вас указание этого самого номера:
procedure HelloWorld(AForm: TForm); external myfirstdll.dll index 15;
В этом случае имя, которое вы даете процедуре при импорте не обязательно должно совпадать с тем,
которое было указано для нее в самой DLL. Т.е. приведенная выше запись означает,
что вы импортируете из динамической библиотеки myfirstdll.dll процедуру, которая в ней экспортировалась
пятнадцатой, и при этом в рамках вашего приложения этой процедуре дается имя SayHello.
Если вы по каким-то причинам не применяете описанный выше способ импорта,
но тем не менее хотите изменить имя импортируемой функции (процедуры), то можно воспользоваться третьим методом:
procedure CoolProcedure; external myfirstdll.dll name "DoSomethingReallyCool";
Здесь импортируемой процедуре CoolProcedure дается имя DoSomethingReallyCool.
Вызов процедур и функций, импортируемых из динамически загружаемых библиотек
несколько более сложен, чем рассмотренный нами выше способ. В данном случае требуется объявить
указатель на функцию или процедуру, которую вы собираетесь использовать.
Помните процедуру HelloWorld? Давайте посмотрим, что необходимо сделать для того,
чтобы вызвать ее на выполнение в случае динамической загрузки DLL. Во-первых, вам
необходимо объявить тип, который описывал бы эту процедуру:
type
THelloWorld = procedure(AForm: TForm);
Теперь вы должны загрузить динамическую библиотеку, с помощью GetProcAddress получить
указатель на процедуру, вызвать эту процедуру на выполнение, и, наконец, выгрузить DLL из памяти.
Ниже приведен код, демонстрирующий, как это можно сделать:

DLLInstance: THandle ;

HelloWorld: THelloWorld;

begin

{ загружаем DLL }

{ получаем указатель }

{ вызываем процедуру на выполнение }

HelloWorld(Self ) ;

{ выгружаем DLL из оперативной памяти }

FreeLibrary(DLLInstance) ;

end ;

Как уже говорилось выше, одним из недостатков статической загрузки DLL является невозможность
продолжения работы приложения при отсутствии одной или нескольких библиотек. В случае с динамической
загрузкой у вас появляется возможность программно обрабатывать такие ситуации и не допускать, чтобы программа
вываливалась» самостоятельно. По возвращаемому функциями LoadLibrary и GetProcAddress значениям можно
определить, успешно ли прошла загрузка библиотеки и найдена ли в ней необходимая приложению процедура.
Приведенный ниже код демонстрирует это.

procedure TForm1.DynamicLoadBtnClick (Sender: TObject ) ;

type

THelloWorld = procedure (AForm: TForm) ;

DLLInstance: THandle ;

HelloWorld: THelloWorld;

begin

DLLInstance:= LoadLibrary("myfirstdll.dll" ) ;

if DLLInstance = 0 then begin

MessageDlg("Невозможно загрузить DLL" , mtError, [ mbOK] , 0 ) ;

Exit ;

end ;

@HelloWorld:= GetProcAddress(DLLInstance, "HelloWorld" ) ;

if @HelloWorld nil then

HelloWorld (Self )

else

MessageDlg("Не найдена искомая процедура!." , mtError, [ mbOK] , 0 ) ;

FreeLibrary(DLLInstance) ;

end ;

В DLL можно хранить не только код, но и формы.
Причем создание и помещение форм в динамическую библиотеку не слишком сильно отличается от работы
с формами в обычном проекте. Сначала мы рассмотрим, каким образом можно написать библиотеку,
содержащую формы, а затем мы поговорим об использовании технологии MDI в DLL.
Разработку DLL, содержащую форму, я продемонстрирую на примере.
Итак, во-первых, создадим новый проект динамической библиотеки.
Для этого выберем пункт меню File|New, а затем дважды щелкнем на иконку DLL .
После этого вы увидите примерно следующий код:

Сохраните полученный проект. Назовем его DllForms.dpr.
Теперь следует создать новую форму. Это можно сделать по-разному.
Например, выбрав пункт меню File|New Form. Добавьте на форму какие-нибудь компоненты.
Назовем форму DllForm и сохраним получившийся модуль под именем DllFormUnit.pas .
Вернемся к главному модулю проекта и поместим в него функцию ShowForm, в задачу которой будет входить
создание формы и ее вывод на экран. Используйте для этого приведенный ниже код.

Form: TDLLForm;

begin

Result:= Form.ShowModal ;

Form.Free ;

end ;

Обращаю внимание, что для того, чтобы проект был скомпилирован без ошибок, необходимо добавить в секцию uses модуль Forms .
Экспортируем нашу функцию с использованием ключевого слова exports:
exports
ShowForm;
Компилируем проект и получаем файл dllforms.dll. Эти простые шаги - все,
что необходимо сделать для сОбратите внимание, что функция ShowForm объявлена с использованием ключевого слова stdcall .
Оно сигнализирует компилятору использовать при экспорте функции соглашение
по стандартному вызову (standard call calling convention). Экспорт функции таким образом создает
возможность использования разработанной DLL не только в приложениях, созданных в Delphi.
Соглашение по вызову (Calling conventions) определяет, каким образом передаются аргументы при вызове функции.
Существует пять основных соглашений: stdcall, cdecl, pascal, register и safecall.
Подробнее об этом можно узнать, посмотрев раздел " Calling Conventions " в файле помощи Delphi.
Также обратите внимание, что значение, возвращаемое функцией ShowForm ,
соответствует значению ShowModal. Таким образом вы можете передавать некоторую информацию
о состоянии формы вызывающему приложению.
Ниже представлено два листинга, первый из которых содержит полный код файла
проекта DLL (модуль с формой здесь не приводится), а второй - модуль вызывающего приложения,
в котором используется только что разработанная нами библиотека.

library DllForms;

uses

DllFormUnit in "DllFormUnit.pas" {DllForm} ;

{$R *.RES}

function ShowForm: Integer ; stdcall ;

Form: TDLLForm;

begin

Form:= TDLLForm.Create (Application) ;

Result:= Form.ShowModal ;

Form.Free ;

end ;

begin

end .


unit TestAppUnit;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type

TForm1 = class (TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject ) ;

private

{ Private declarations }

public

{ Public declarations }

end ;

Form1: TForm1;

function ShowForm: Integer ; stdcall ;

External "dllforms.dll" ;

implementation

{$R *.DFM}

procedure TForm1.Button1Click (Sender: TObject ) ;

begin

end ;

end .

Прошу заметить, что при экспорте функции также было использовано ключевое слово stdcall.
Следует обратить особое внимание на работу с дочерними формами в DLL. Если, к примеру,
в вызывающем приложении главная форма имеет значение свойства FormStyle, равным MDIForm,
то при попытке вызова из DLL MDIChild-формы, на экране появится сообщение об ошибке,
в котором будет говориться, что нет ни одной активной MDI-формы.
В тот момент, когда вы пытаетесь показать ваше дочернее окно, VCL проверяет корректность
свойства FormStyle главной формы приложения. Однако в нашем случае все вроде бы верно.
Так в чем же дело? Проблема в том, что при проведении такой проверки, рассматривается объект Application,
принадлежащий не вызывающему приложению, а собственно динамической библиотеке.
Ну, и естественно, поскольку в DLL нет главной формы, проверка выдает ошибку.
Для того чтобы избежать такой ситуации, надо назначить объекту Application динамической библиотеки
объект Application вызывающего приложения. Естественно, это заработает только в том случае,
когда вызывающая программа - VCL-приложение. Кроме того, перед выгрузкой библиотеки из памяти
необходимо вернуть значение объекта Application библиотеки в первоначальное состояние.
Это позволит менеджеру памяти очистить оперативную память, занимаемую библиотекой.
Следовательно, вам нужно сохранить указатель на «родной» для библиотеки объект Application
в глобальной переменной, которая может быть использована при восстановлении его значения.
Итак, вернемся немного назад и перечислим шаги, необходимые нам для работы с помещенным
в DLL MDIChild-формами.
В динамической библиотеке создаем глобальную переменную типа TApplication.
Сохраняем указатель на объект Application DLL в глобальной переменной.
Объекту Application динамической библиотеки ставим в соответствие указатель на Application
вызывающего приложения.
Создаем MDIChild-форму и работаем с ней.
Возвращаем в первоначальное состояние значение объекта Application динамической библиотеки
и выгружаем DLL из памяти.
Первый шаг прост. Просто помещаем следующий код в верхней части модуля DLL:
var
DllApp: TApplication;
Затем создаем процедуру, которая будет изменять значение объекта Application и создавать дочернюю форму.
Процедура может выглядеть примерно так:

procedure ShowMDIChild(MainApp: TApplication) ;

Child: TMDIChild;

begin

if not Assigned (DllApp) then begin

DllApp:= Application;

Application:= MainApp;

end ;

Child:= TMDIChild.Create (Application.MainForm ) ;

Child.Show ;

end ;

Все, что нам теперь необходимо сделать, - это предусмотреть возвращение значения объекта Application
в исходное состояние. Делаем это с помощью процедуры MyDllProc:

procedure MyDLLProc(Reason: Integer ) ;

begin

if Reason = DLL_PROCESS_DETACH then

{ DLL is выгружается. Восстанавливаем значение указателя Application}

if Assigned (DllApp) then

Application:= DllApp;

end ;

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

Использование динамически подключаемых библиотек не так сложно, как это может показаться на первый взгляд.
DLL предоставляют широчайшие возможности для оптимизации работы приложений,
а также работы самих программистов. Используйте DLL и, возможно, ваша жизнь станет легче!
http://subscribe.ru/
E-mail: [email protected] Поиск
на АПОРТ на Subscribe.Ru

Динамическая библиотека, или DLL , является совокупностью подпрограмм (маленьких программ), которые могут вызываться приложениями или другими DLL . Подобно модулям, DLL содержит общий код или ресурсы, которые могут использовать несколько приложений одновременно из одного экземпляра DLL . В сущности Windows - это просто совокупность DLL .

Естественно, используя Delphi, мы можем тоже написать и использовать наши собственные DLL и можем вызывать функции в DLL , разработанном другими разработчиками и на других системах (типа Visual Basic или C/C++ ).

Создание динамической библиотеки

Следующие несколько строк демонстрируют, как создать простой DLL , используя Delphi.

Начинающим Дельфистам нужно из меню выбрать File | New... DLL . Это создаст шаблон нового DLL в окне редактора. Выделите заданный по умолчанию текст и замените его следующим кодом:

Library TestLibrary; uses SysUtils, Classes, Dialogs; procedure DllMessage; export; begin ShowMessage("Hello world from a Delphi DLL") ; end; exports DllMessage; begin end.

Если Вы посмотрите на файл проекта любого приложения Delphi, Вы увидите, что он начинается с зарезервированного слова Program . DLL в отличие от этого, начинается с зарезервированного слова Library . Затем это сопровождается пунктом uses для любых необходимых модулей. В этом простом примере за этим следует процедура по имени DllMessage , которая не делает ничего, кроме показа простого сообщения.

В конце этого текста, стоит инструкция exports . Здесь включен список подпрограмм, которые будут экспортированы из DLL и могут вызываться другими приложениями. Это означает, что, например, в DLL находится 5 процедур и только 2 из них (перечисленных в разделе exports ) могут вызываться из внешних программ (3 из них подпрограммы в DLL ).

Чтобы использовать этот простой DLL , мы должны скомпилировать его, нажав Ctrl+F9 . Это создасть DLL по имени SimpleMessageDll.dll в папке проекта.


А теперь давайте посмотрим, как вызвать процедуру DllMessage из (статически загруженной) DLL .

Чтобы импортировать процедуру, содержащуюся в DLL , мы используем ключевое слово external в объявлении процедуры. Например, объявление процедуры DllMessage , показанной ранее, выглядела бы так:

Procedure DllMessage; external "SimpleMessageDLL.dll"

А вызов процедуры выглядит так:

DllMessage;

Полный код для формы Form1 с TButton по имени Button1 (для вызова функции DllMessage ) выглядит так:

Unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject) ; private { Private declarations } public { Public declarations } end; var Form1: TForm1; procedure DllMessage; external "SimpleMessageDLL.dll" implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject) ; begin DllMessage; end; end.

Это все! Все просто, как и все в Delphi!

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

база библиотека программа delphi

Введение

1.3 Доступ к данным

2.1 Интерфейс программы

Заключение

Приложение А "Листинг программы"

Введение

Основные идеи современной информационной технологии базируются на концепции, согласно которой данные должны быть организованы в базы данных с целью адекватного отображения изменяющегося реального мира и удовлетворения информационных потребностей пользователей. Эти базы данных создаются и функционируют под управлением специальных программных комплексов, называемых системами управления базами данных (СУБД).

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

База данных - это поименованная совокупность структурированных данных предметной области.

Учитывая интегрирование компьютерных технологий в повседневную жизнь, такие учреждения как, например, библиотеки могут использовать компьютерные программы для хранения различных данных (информация о книгах, об абонементах, о читателях и т.д.).

Целью курсовой работы является создание программы "Библиотека", которая упрощает работу сотрудников библиотеки, что приводит к экономии большого количества времени.

Задачами курсовой работы является систематизация, закрепление и расширение теоретических и практических знаний по использованию готовых и созданию собственных баз данных, применяя систему объектно-ориентированного программирования Delphi, а также развитие навыков ведения самостоятельной работы.

1. Среда разработки программного продукта

Для разработки был выбран язык программирования Delphi. Язык программирования Delphi - это комбинация нескольких важнейших технологий:

Высокопроизводительный компилятор в машинный код;

Объектно-ориентированная модель компонент;

Визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов;

Масштабируемые средства для построения баз данных.

Компилятор, встроенный в Delphi, обеспечивает высокую производительность, необходимую для построения приложений в архитектуре "клиент-сервер". Он предлагает легкость разработки и быстрое время проверки готового программного блока, характерного для языков четвертого поколения (4GL) и в то же время обеспечивает качество кода, характерного для компилятора 3GL. Кроме того, Delphi обеспечивает быструю разработку без необходимости писать вставки на С или ручного написания кода (хотя это возможно).

Delphi использует структурный объектно-ориентированный язык (Object Pascal), который сочетает с выразительную мощь и простоту программирования, характерную для языков 4GL, и эффективность языка 3GL. Программисты немедленно могут начать производить работающие приложения, и им не придется для этого изучать особенности программирования событий в Windows. Delphi полностью поддерживает передовые программные концепции включая инкапсуляцию, наследование, полиморфизм и управление событиями.

1.1 Работа с базами данных в Delphi

Технология ADO обеспечивает для приложений единый способ доступа к источникам данных различных типов. Согласно терминологии ADO, любой источник данных (база данных, электронная таблица, файл) называется хранилищем данных, с которым при помощи провайдера данных взаимодействует приложение. Минимальный набор компонентов приложения может включать объект соединения, объект набора данных, объект процессора запросов. Технология ADO в целом включает в себя не только сами объекты, но и механизмы, обеспечивающие взаимодействие объектов с данными и приложениями. Механизм доступа к данным через ADO и многочисленные объекты, и интерфейсы реализованы в Delphi в виде набора компонентов, расположенных на странице ADO. Такая архитектура позволяет сделать набор объектов и интерфейсов открытым и расширяемым.

На закладке ADO расположены компоненты:

1. Компоненты соединения:

2. Стандартные компоненты:

ADODataSet - универсальный набор данных

ADOTable - таблица БД

ADOQuery - запрос SQL

ADOStoredProc - хранимая процедура

На странице ADO Палитры компонентов Delphi, кроме компонентов соединения есть стандартные компоненты, обозначающие набор данных и адаптированные для работы с хранилищем данных ADO.

На вкладке Connection (см. рисунок 1) необходимо указать путь к базе данных или сервер.

Рисунок 1 - Окно подключения

Компонент TADOTable - используется для доступа к хранилищам данных ADO и представления информации из них в табличном виде. Компонент предоставляет прямой доступ к каждой записи и ее полям, наследуя свойства и методы. Компонент связывается с базой данных через свойства Connection или ConnectionString.

Имя таблицы указывается в свойстве TableName. Используя свойство Readonly, можно установить ограничение "только для чтения" на данную таблицу, запретив, таким образом, возможность изменять данные. В свойстве MasterSource указывается компонент TDataSource, используемый для создания отношения ссылочной целостности.

Компонент TDataSource-этот компонент связывается с набором данных. Эта связь осуществляется через свойство DataSet, которое содержит информацию о текущем состоянии набора данных. У этого компонента существует набор свойств и методов, которые облегчают работу с ним.

Свойство AutoEdit-автоматически переводит набор данных в состояние редактирования, если имеет значение True, когда связанный элемент ввода получает фокус.

Метод Edit-переводит связанный набор данных в состояние редактирования.

Метод-обработчик OnDataChange-вызывается при редактировании данных в связанном визуальном компоненте.

Метод-обработчик события OnUpdateData-вызывается перед тем, как измененные данные будут сохранены в наборе данных. Обработчик вызывается перед выполнением метода Post.

1.2 Компоненты доступа к данным

Компоненты доступа к данным являются не визуальными компонентами. Таблицы БД располагаются на диске и являются физическими объектами. Для операций с данными, содержащимися в таблицах, используются наборы данных. В терминах системы Delphi набор данных представляет собой совокупность записей, взятых из одной или нескольких таблиц БД. Записи, входящие в набор данных, отбираются по определенным правилам, при этом в частных случаях набор данных может включать в себя все записи из связанной с ним таблицы или не содержать ни одной записи. Набор данных является логической таблицей, с которой можно работать при выполнении приложения. Взаимодействие таблицы и набора данных напоминает взаимодействие физического файла и файловой переменной.

В Delphi для работы с наборами данных служат компоненты DBTable и ADOTable, ADOQuery, DataAccess, DataControl.

Базовые возможности доступа к БД обеспечивает класс DataSet, представляющий наборы данных в виде совокупности строк и столбцов (записей и полей). Этот класс предоставляет основные средства навигации и редактирования наборов данных.

Компонент Table -представляет собой набор данных, который в некоторый момент времени может быть связан только с одной таблицей БД. Этот набор данных формируется на базе навигационного способа доступа к данным, поэтому компонент Table рекомендуется использовать для локальных БД. При работе с удаленными БД следует использовать компонент Query. Связь между таблицей и компонентом Table устанавливается через его свойства TableName, которое задает имя таблицы.

Компоненты для работы с данными расположенные на странице DataControls (см. рисунок 2) палитры компонентов и предназначены для построения интерфейсной части приложения.

Рисунок 2 - Палитра компонентов

Они используются для навигации по набору данных, а также для отображения и редактирования записей.

Другие компоненты служат для отображения и редактирования сразу нескольких записей. Примерами таких компонентов являются сетки DBGrid и DBCtrlGrid, выводящие записи набора данных в табличном виде. Визуальные компоненты для работы с данными похожи на соответствующие компоненты страниц Standard и Additional и отличаются, в основном, тем, что ориентированны на работу с БД и имеют дополнительные свойства DataSource и Datafield. Первое из них указывает на источник данных, а второе - на поле набора данных, с которым связан визуальный компонент. Например, Edit отображает строковое значение, позволяя пользователю изменять его.

При программном изменении содержимого эти визуальных компонентов набор данных автоматически в режим редактирования не переводится. Для этой цели в коде должен предварительно вызываться метод Edit набора. Чтобы сохранить изменения в поле (полях) текущей записи, мы должны также предусмотреть соответствующие действия, например, вызов метода Post или переход к другой записи набора данных. В библиотеке визуальных компонентов для всех компонентов, в том числе и предназначенных для работы с данными, базовым является классу Control. Он обеспечивает основные функциональные атрибуты такие, как положение и размеры элемента, его заголовок, цвет и другие параметры. Класс Control включает в себя общие для визуальных компонентов свойства, события и методы.

Оконный элемент управления представляет собой специализированное окно, предназначенное для решения конкретной задачи. К таким элементам относятся, например, поля редактирования, командные кнопки, полосы прокрутки.

Такие компоненты, как Edit, DBEdit, Memo или DBMemo при получении фокуса ввода отображают в своей области курсор редактирования. Компоненты, не связанные с редактированием информации, получение фокуса ввода обычно отображают с помощью с помощью пунктирного черного прямоугольника.

Свойство Name указывает на имя компонента, которое используется для управления компонентов во время выполнения приложения.

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

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

Выбор управляющего элемента;

Перемещение указателя мыши;

Нажатие клавиш клавиатуры;

Получение и потеря управляющим элементом фокуса ввода;

Перемещение объектов методом drag-and-drop.

1.3 Доступ к данным

При навигационном способе доступа операции выполняются с отдельными записями. Каждый набор данных имеет указатель текущей записи, то есть записи, с полями которой могут быть выполнены такие операции, как редактирование или удаление. Компоненты Table и Query позволяют управлять положением этого указателя.

Навигационный способ доступа даёт возможность осуществлять следующие операции:

Сортировка записей;

Навигация по набору данных;

Редактирование записей;

Вставка и удаление записей;

Фильтрация записей;

Поиск записей.

Редактирование записей заключается в изменении значений их полей. Редактирована, может быть только текущая запись, поэтому перед действиями, связанными с редактированием, обычно выполняются операции по поиску и перемещению на требуемую запись. После того. Как указатель текущей записи установлен на нужную запись, и набор данных находится в режиме просмотра, для редактирования записи следует:

Перевести набор данных в редактирование;

Изменить значение полей записи;

Метод Insert переводит набор данных в режим вставки и добавляет к нему новую пустую запись.

Для добавления записи нужно:

Перевести набор данных в режим записи;

Задать значение полей новой записи;

Подтвердить изменения или отказаться от них.

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

Порядок расположения записей может быть неопределённым. По умолчанию записи не отсортированы или сортируются. С отсортированными наборами записей работать более удобно. Сортировка заключается в упорядочивании записей по определённому полю в порядке возрастания или убывания содержащихся в нём значений. Сортировку можно выполнять и по нескольким полям.

При сортировки по двум полям записи сначала упорядочиваются по значениям первого поля, а затем группы записей с одинаковым значением первого поля сортируются по второму полю. Сортировка наборов данных Table и Query выполняется различными способами. Сортировка наборов данных Table выполняется автоматически по текущему индексу. При смене индекса происходит автоматическое переупорядочивание записей. Таким образом, сортировка возможна по полям, для которых создан индекс.

Перемещение по набору данных заключается в управлении указателем текущей записи. Этот указатель определяет запись, с которой будут выполняться такие операции, как редактирование или удаление.

Перед перемещение указателя текущей записи набор данных автоматически переводится в режим просмотра. Если текущая запись находилась в режимах редактирования или вставки, то перед перемещением указателя сделанные в записи изменения вступают в силу, для чего набор данных автоматически вызывает метод CheckBrowseMode.

При перемещении по записям набора данных связанные с ним визуальные компоненты отображают изменения данных, причем смена отображения может происходить достаточно быстро.

Фильтрация записей - это задание ограничений для записей, отбираемых в набор данных. Набор данных представляет собой записи, набранные из одной или нескольких таблиц. Состав записей в наборе данных в данный момент времени зависит от установленных ограничений, в том числе и от фильтров.

Система Delphi дает возможность осуществлять фильтрацию записей:

По выражению;

По диапазону.

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

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

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

Имена полей таблицы;

Литералы;

Операции сравнения;

Арифметические операции;

Логические операции;

Круглые и квадратные скобки.

Если имя поля содержит пробелы, то его заключают в квадратные скобки. Имена переменных в выражении фильтра использовать нельзя. Если в выражении фильтра требуется включить значение переменной или свойства какого-либо компонента, то это значение должно быть преобразовано в строковый тип. Операции сравнения представляют собой обычные отношения <,>,=,<=,>=,<>. Арифметическими являются операции +, -,* и /. В качестве логических операций можно использовать AND, OR и NOT. Круглые скобки применяются для изменения порядка выполнения арифметических и логических операций.

Набор данных Table допускается два способа задания условии фильтрации: су помощью выражения фильтра Filter и в обработчике события OnFilterRecord.

При фильтрации по диапазону в набор данных включаются записи, значения полей которых попадают в заданный диапазон, т.е. условием фильтрации является выражение вида "значение>нижняя граница AND значение < верхней границы". Такая фильтрация применяется к наборам данных Table.

Для включения и выключения фильтрации по диапазону применяются методы ApplyRange и CancelRange. Первый из них активизирует фильтрацию, а другой - деактивизирует. Предварительно для индексного поля или полей, по которому выполняется фильтрация, следует задать диапазон допустимых значений. Когда одна из границ диапазона не задана, то диапазон открыт, то есть нижняя граница становится равной минимально возможному, а верхняя граница - максимально возможному значению этого поля.

Поиск записи, удовлетворяющей определённым условиям, означает переход на эту записи. Поиск во многом похож на фильтрацию, так как в процессе поиска также выполняется проверка полей записей на некоторые условия.

Отличие заключается в том, что в результате поиска количество записей в наборе данных не изменяется. При организации поиска записей важное значение имеет наличие индекса для полей, по которым ведётся поиск. Индексирование значительно повышает скорость обработки данных, кроме того, ряд методов может работать только с индексированными полями.

Для поиска записей по полям служат методы Locate и Lookup, причем поля могут быть не индексированными. Функция Locate ищет запись с заданными значениями полей. Если удовлетворяющие условиям поиска записи существует, то указатель текущей записи устанавливается на первую из них. Если запись найдена, функция возвращает значение True, в противном случае значение False. Обычно при разработки приложения пользователю предоставляется возможность влиять на процесс поиска су помощью управляющих элементов, расположенных на форме. Функция Lookup так же осуществляет поиску записи, удовлетворяющей определённым условиям, но, в отличие от метода Locate, не перемещает указатель текущей записи, а считывает информацию из полей записи. Еще одно отличие между двумя методами заключается в том, что метод Lookup осуществляет поиск на точное соответствие значений для поиска и значений в полях записей с учетом регистра букв.

2. Разработка базы данных "Библиотека"

Для разработки программы "База данных "Библиотека" "выбрана объектно-ориентированная интерактивная среда Delphi 7.

База состоит из одной таблицы которая имеет современный тип "Access" с расширенными типами полей. Доступ к данным будет происходить через ADO-подсистему Delphi.

В таблице "Библиотека" будут содержаться все необходимые данные для работы, описание полей БД находится в таблице 1.

Таблица 1 - Таблица "frukt"

Описание

Текстовый

Содержит шифр книги или издания

Текстовый

Наименование раздела

Текстовый

Текстовый

Название книги

Текстовый

Указывается год издания

Текстовый

Наименование издательства выпустившего книгу

Текстовый

Фамилия и инициалы читателя

Текстовый

Номер читательского билета

Дата время

Дата выдачи книги на руки

Текстовый

Содержится отметка о возврате или нахождению экземпляра кникги на руках

2.1 Интерфейс программы

Для запуска программы необходимо запустить фаил biblioteka.exe двойным щелчкоммыши. После запуска появляется главная форма для работы (см. рисунок 3).

Рисунок 3 - Главная форма приложения

Форма содержит несколько разделов:

1. кнопки меню;

2. панель поиска и фильтации информации;

3. раздел просмота содержимого базы;

4. кнопки навигации иредактиования данных.

Изначально кнопки редактиования данных не активны, для их активации необходимо ажать кнопку "Редактировать". Далее таблица переходит в ежим редактирования. Необходимо отметить, что при добавлении данных в таблицу некоторые поля содержат вложенные списки, так например при добавлении данных в поле "Раздел " таблица выглядит так как показано на рисунке 4

Рисунок 4 - Добавление данных в таблицу

На рисунке 5 показан результат применения фильтра

Рисунок 5 - Результат фильтрации данных

Для отображения всех записей нужно щелкнуть по кнопке "Все записи".

Для вывода данных на печать необходимо выбрать кнопку "Печать". Отчет выводится в MS Excel. Вид отчета показан на рисунке 6

Рисунок 6 - Вывод данных

При выходе из системы появляется окно показанное на рисунке 7.

Заключение

В ходе выполнения курсовой работы была разработана программа "Библиотека", обладающая следующим функционалом:

1) просмотр и редактирование данных;

2) поиск информации

3) фильтрация данных;

5) вывод данных на печать;

В заключении можно сказать, что созданная программа - проста, удобна в применении, так как данные отображаются в таблице, экономит большое количество времени. Эта программа доступна для любого человека, работающего в библиотеке и обладающего простыми навыками пользования компьютером.

Потенциал программы большой. В будущем, функциональность программы можно было бы расширить за счет добавления различных функций. Например, добавить в программу несколько новых видов поиска, сортировки, добавить функцию просмотра данных в виде диаграмм (для большей наглядности данных). Также можно добавить функцию добавления таблиц для большей функциональности.

Список использованной литературы

1. Дарахвелидзе П.Г., Марков Е.П. Delphi 2005 для Win32. - СПб.: БХВ-Петербург, 2005. - 1136 с.

2. Боровский А.Н. Программирование в Delphi 2005. -- СПб.: БХВ-Петербург, 2005. - 448 с.

3. Гофман В.Э., Хомоненко А.Д. Работа с базами данных в Delphi. -- СПб.: БХВ-Петербург, 2011. -- 656 с.

4. Романчик В.С., А.Е. Люлькин, "Программирование в Delphi 7: пособие для студентов". Минск: БГУ, 2007. - 128 с.;

5. Гофман В.Э., Хомоненко А.Д. Delphi. Быстрый старт. -- СПб.: БХВ-Петербург, 2003. -- 288 с.

Приложение А

Листинг программы

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, Buttons, ExtCtrls, DBCtrls,OleServer,ComObj,

TForm1 = class(TForm)

ControlBar1: TControlBar;

BitBtn1: TBitBtn;

BitBtn2: TBitBtn;

BitBtn3: TBitBtn;

BitBtn4: TBitBtn;

GroupBox1: TGroupBox;

BitBtn5: TBitBtn;

DBGrid1: TDBGrid;

ADOTable1: TADOTable;

DataSource1: TDataSource;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

DBNavigator1: TDBNavigator;

ExcelApplication1: TExcelApplication;

BitBtn6: TBitBtn;

BitBtn7: TBitBtn;

BitBtn8: TBitBtn;

procedure BitBtn3Click(Sender: TObject);

procedure BitBtn4Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure BitBtn2Click(Sender: TObject);

procedure BitBtn5Click(Sender: TObject);

procedure RadioButton1Click(Sender: TObject);

procedure RadioButton2Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure BitBtn6Click(Sender: TObject);

procedure BitBtn8Click(Sender: TObject);

procedure BitBtn7Click(Sender: TObject);

{ Private declarations }

{ Public declarations }

Exl: OleVariant;

// MyDir:String;

procedure TForm1.BitBtn3Click(Sender: TObject);

ADOTable1.Filtered:=false;

procedure TForm1.BitBtn4Click(Sender: TObject);

Application.Terminate;

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

if MessageDlg("Вы действительно хотите закрыть приложение?",mtConfirmation,,0)=mrCancel then Abort ;

Application.Terminate;

procedure TForm1.BitBtn2Click(Sender: TObject);

//bm: TBookmark;

col, row,i: Integer;

ExcelApp,Workbook,Colum,Sheet: OLEVariant;

TemplateFile,cn,un:String;

PRes:= StrAlloc(Size);

BRes:= GetComputerName(PRes, Size);

if BRes then cn:= StrPas(PRes);

Size:= MAX_COMPUTERNAME_LENGTH + 1;

PRes:= StrAlloc(Size);

BRes:= GetUserName(PRes, Size);

if BRes then un:= StrPas(PRes);

Screen.Cursor:= crArrow;

DBGrid1.DataSource.DataSet.DisableControls;

DBGrid1.DataSource.DataSet.First;

// создаём объект Excel

ExcelApp:=CreateOleObject("excel.application");

Excelapp.Application.EnableEvents:=false;

ExcelApp.WorkBooks.Add(xlWBatWorkSheet);

ExcelApp.WorkBooks.WorkSheets.name:= "Отчёт";

ExcelApp.Visible:= false;

Colum:=ExcelApp.Workbooks.WorkSheets["Отчёт"].Columns;

if DBGrid1.Columns.Visible then begin

Colum.Columns[i].ColumnWidth:=25;Inc(i);

Colum:=ExcelApp.Workbooks.WorkSheets["Отчёт"].Rows;

Colum.Rows.Font.Bold:=true;

Colum.Rows.Font.Size:=8;

Colum.Rows.Font.Bold:=true;

Colum.Rows.Font.Color:=0;

Colum.Rows.Font.Size:=10;

ExcelApp.Visible:= false;

mem:= TMemo.Create(Self);

mem.Visible:= false;

mem.Parent:= Form1;

sline:=("Данные по библиотеке"+#9+DateToStr(date)+#9+TimeToStr(Time));

mem.Lines.Add(sline);

for col:= 0 to DBGrid1.FieldCount-1 do

if DBGrid1.Columns.Visible then

sline:= sline + form1.DBGrid1.Columns.Title.Caption + #9;

mem.Lines.Add(sline);

mem.Lines.Add("");

for row:= 0 to form1.DBGrid1.DataSource.DataSet.RecordCount-1 do

for col:= 0 to form1.DBGrid1.FieldCount-1 do

if form1.DBGrid1.Columns.Visible then

sline:= sline + form1.DBGrid1.Fields.AsString + #9;

mem.Lines.Add(sline);

form1.DBGrid1.DataSource.DataSet.Next;

if form1.DBGrid1.DataSource.DataSet.Eof then Break;

mem.CopyToClipboard;

ExcelApp.Visible:= true;

ExcelApp.Workbooks.WorkSheets["Отчёт"].Paste;

ExcelApplication1.Free;

form1.DBGrid1.DataSource.DataSet.EnableControls;

Screen.Cursor:= crArrow;

procedure TForm1.BitBtn5Click(Sender: TObject);

if ADOTable1.Locate("avtor",Edit1.Text,) then DBGrid1.SetFocus else

MessageDlg("ПОИСК НЕ ДАЛ РЕЗУЛЬТАТОВ",mtConfirmation,,0);

procedure TForm1.RadioButton1Click(Sender: TObject);

ADOTable1.Filter:="izdatelstvo="+""""+Edit1.Text+"""";

ADOTable1.Filtered:=true;

procedure TForm1.RadioButton2Click(Sender: TObject);

ADOTable1.Filter:="razdel="+""""+Edit1.Text+"""";

ADOTable1.Filtered:=true;

procedure TForm1.BitBtn1Click(Sender: TObject);

BitBtn6.Enabled:=true;

BitBtn7.Enabled:=true;

BitBtn8.Enabled:=true;

procedure TForm1.BitBtn6Click(Sender: TObject);

ADOTable1.Insert;

procedure TForm1.BitBtn8Click(Sender: TObject);

procedure TForm1.BitBtn7Click(Sender: TObject);

if MessageDlg("Вы действительно хотите удалить запись?",mtConfirmation,,0)=mrCancel then Abort ;

ADOTable1.Delete;

Размещено на Allbest.ru

Подобные документы

    Рассмотрение теории и технологии работы со средой программирования Delphi. Описание Описание интерфейса программы, структуры данных, генерации точек. Разработка задания по выявлению всех квадратов, которые могут быть образованы точками на плоскости.

    реферат , добавлен 13.01.2015

    Разработка программы для работы с базой данных "Библиотека" в среде Borland C++Builder 6 на языке программирования C++ с использованием визуальных средств. Структура информации, подключение к ней и ее отображение. Описание пользовательского интерфейса.

    курсовая работа , добавлен 19.05.2014

    Ознакомление с историей создания и особенностями объектно-ориентированного языка программирования Delphi. Разработка приложения, фиксирующего количество повторений какого-либо слова в тексте, введённом в поле MEMO. Описание интерфейса программы.

    курсовая работа , добавлен 21.04.2015

    Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.

    курсовая работа , добавлен 04.08.2014

    Основные этапы разработки и внедрения программного обеспечения. Понятие, функции и классификация баз данных. Проектирование базы данных "Библиотека" для ведения картотеки и учета выдачи книг. Пользовательский интерфейс программы, методика ее тестирования.

    дипломная работа , добавлен 09.06.2012

    Разработка приложения для работы с базой данных с использованием объектно-ориентированного и визуального программирования. Обзор языка элементов языка программирования Delphi. Проектирование базы данных автозаправки. Клиентская система приложения.

    курсовая работа , добавлен 31.01.2016

    Общая характеристика инфологической модели информационной системы. Знакомство с особенностями проектирования базы данных "Библиотека", анализ основных этапов. Рассмотрение способов составления запросов по выборке информации из таблиц базы данных.

    контрольная работа , добавлен 08.12.2013

    Методика и основные этапы создания базы данных в библиотеке, отражаемая в ней информация и функциональные особенности. Порядок построения информационно-логической модели базы данных. Особенности реализации пользовательского интерфейса средствами форм.

    курсовая работа , добавлен 19.10.2010

    Разработка системы, автоматизирующей ведение базы данных библиотеки. Основные требования к программному обеспечению. Модели локальных представлений. Архитектура информационной системы. Хранимые процедуры. SQL-скрипт создания базы данных. Текст программы.

    дипломная работа , добавлен 28.01.2014

    Рассмотрение основ использования информационных технологий в гостиничном бизнесе. Выбор системы управления базами данных. Описание информационной технологии. Выполнение программной реализации в среде объектно-ориентированного программирования Delphi 7.

Чтобы создать новую библиотеку DLL в Delphi, выберите команду меню File > New > Other . В панели Items Categories окна New Items выберите узел Delphi Projects , после чего дважды щелкните на элементе Dynamic-link Library в правой панели окна.

Мастер DLL Wizard создает главный файл исходного кода библиотеки DLL, который выглядит практически так же, как и исходный код, сгенерированный для обычного приложения. Единственное отличие состоит в том. что этот файл начинается с зарезервированного слова library , а не program .

Library Project1; { Important note about DLL memory management: ShareMem must be the first unit in your library"s USES clause AND your project"s (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } { Важное замечание относительно управления памятью библиотеки DLL: модуль ShareMem должен быть первым модулем в операторе uses вашей библиотеки и в операторе uses вашего проекта (выберите команду меню Project -> View Source (Проект -> Показать исходный код)), если ваша библиотека DLL экспортирует какие-либо процедуры или функции, передающие строки в качестве параметров или результатов выполнения функций. Это относится ко всем строкам, передаваемым или получаемым из вашей библиотеки DLL, и даже к тем строкам, которые вложены в записи и классы. Модуль ShareMem является модулем интерфейса для администратора общей памяти BORLNDMM.DLL, который вы должны развертывать вместе со своей библиотекой DLL. Чтобы не использовать BORLNDMM.DLL, передавайте строковую информацию с помощью параметров PChar или ShortString. } uses SysUtils, Classes; {$R *.res} begin end.

Все, что вам нужно сделать сейчас - это добавить подпрограмму перед блоком begin-end , вот и все. После этого вы получите внутреннюю подпрограмму, которую можно будет использовать в библиотеке DLL, но не во внешних приложениях. Если вы хотите вызывать подпрограмму из других приложении и других библиотек DLL, ее потребуетсл экспортировать. Чтобы экспортировать подпрограмму по имени, добавьте ее в список exports . Список exports имеет такой же синтаксис, что и список uses , за исключением того, что в списке exports любой элемент является подпрограммой, а не модулем.

Список exports обычно ставится непосредственно перед блоком begin-end . Взгляните на листинг 1, в котором представлен исходный код простой библиотеки FirstLib.dll , экспортирующей одну функцию.

Листинг 1. Простая библиотека DLL

Library FirstLib; function Max3(Num1, Num2, Num3: Integer): Integer; stdcall; begin Result:= Num1; if Num2 > Result then Result:= Num2; if Num3 > Result then Result:= Num3; end; { Экспортируем функцию Max3 } exports Max3; begin end.

Когда вы добавите подпрограмму в список exports , вы тем самым экспортируете подпрограмму по ее имени. Вы можете также экспортировать подпрограмму под другим именем с помощью директивы name или посредством порядкового значения, используя директиву index . Однако применять директиву index не рекомендуется.

Ниже показан пример экспортирования директивы посредством порядкового значения или под другим именем:

Exports Max3 name "MyMax3Function", SaySomething index 1;

Статическая загрузка является самым простым из двух возможных способов загрузки библиотеки DLL. Статическую загрузку называют еще динамическим подключением во время загрузки (load-time dynamic linking ), потому что используемые библиотеки DLL автоматически загружаются во время запуска приложения.

Чтобы статически загрузить библиотеку DLL, необходимо скопировать объявление подпрограммы и вызывающее приложение и пометить ее с помощью директивы external , которая сообщает компилятору о том, что подпрограмма находится либо в объектном файле, либо в библиотеке DLL.

Когда вы импортируете подпрограммы из библиотеки DLL, вы должны помечать их директивой external , указывая вслед за ней имя библиотеки DLL, в которой содержится реализация подпрограммы. Далее показан пример импорта функции МахЗ из библиотеки FirstLib.dll :

Function Max3(Num1, Num2, Num3: Integer): Integer; stdcall; external "FirstLib.dll";

При желании можете даже переименовать подпрограмму во время ее импорта. Для этого необходимо объявить подпрограмму под другим именем, а в конце объявления указать первоначальное имя с помощью директивы name :

Function Max(Num1, Num2, Num3: Integer): Integer; stdcall; external "FirstLib.dll" name "Max3";

Вы можете также импортировать функцию из библиотеки DLL. Для этого нужно создать модуль импорта и написать стандартный заголовок подпрограммы в разделе interface , а ее внешнюю реализацию - в разделе implementation этого модуля. В листинге 2 показан полный код модуль импорта библиотеки FirstLib.dll .

Листинг 2. Модуль импорта библиотеки FirstLib.dll.

Unit FirstLibInf; interface function Max3(Num1, Num2, Num3: Integer): Integer; stdcall; implementation const FirstLib = "FirstLib.dll"; {Компилятору сообщается о том, что реализация функции Max3 находится в библиотеке FirstLib.dll} function Max3; external FirstLib; end.

После того как вы создадите библиотеку DLL и ее модуль импорта, протестируйте библиотеку DLL, чтобы убедиться в том. что подпрограмма работает нормально. Поскольку запустить саму библиотеку DLL нельзя, нужно создать тестовое приложение, которое будет обращаться к библиотеке DLL. Быстрее всего сделать это можно, если создать проектную группу, добавив новый проект в текущий проект. Для этого потребуется щелкнуть правой кнопкой мыши на элементе ProjectGroup1 в окне Project Manager (Диспетчер проекта) и выбрать в контекстном меню команду Add New Project , как показано на рис. 1.

Листинг 3. Проверка подпрограммы Max3, импортированной из библиотеки FirstLib.dll.

Unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FirstLibInf, StdCtrls; type TMainForm = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Max3Button: TButton; procedure Max3ButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.Max3ButtonClick(Sender: TObject); var LargestNumber: Integer; begin LargestNumber:= Max3(StrToInt(Edit1.Text), StrToInt(Edit2.Text), StrToInt(Edit3.Text)); MessageDlg(Format("Наибольшее число: %d.", ), mtInformation, , 0); end; end.

Используемая литература: Внутренний мир Borland Delphi 2006. Иван Хладни.