Хранение формы в динамических библиотеках
Создание DLL
1.1. Выбрать из меню File пункт New и потом Other. В окне создания нового проекта (рисунок 1) нужно выбрать на закладке New пункт DLL Wizard. Избрать этот пункт и нажать ОК.
Рисунок 1 Окно создания нового проекта
Будет создан пустой проект с одним только модулем. Модуль будет содержать следующий текст:
library Project2;
uses
SysUtils,
Classes;
($ R *. res)
begin
end.
1.2. Выбрать из меню File пункт Save All, сохранить проект под именем FirsDLLProject. Потом открыть файл проекта FirsDLLProject.dpr с помощью блокнота и можно увидеть тот же код.
1.3. Прибавить в библиотеку одну функцию с именем Summ. У этой функции будет два параметра в виде целых чисел, и возвращать она будет сумму этих чисел :
library FirsDLLProject;
uses
SysUtils,
Classes;
function Summ (X, Y: Integer) : Integer; StdCall;
begin
Result: = X + Y;
end;
exports Summ;
($ R *. res)
begin
end.
Функция объявлена не так как всегда. В конце строки объявления, после типа значения, которое возвращается стоит ключевое слово StdCall. Оно говорит о том, что для вызова процедуры нужно использовать стандартный тип звонка.
Если не указать ключевое слово StdCall, то параметры будут передаваться способом, заложенным фирмой Borland. Этот способ работает быстрее, но он не совместим со стандартными правилами.
После описания функции идет новое ключевое слово exports. После этого ключевого слова должен идти описанию процедур, которые должны быть доступные внешним программам. Если нашу функцию Summ не описать в разделе exports, то мы ее не сможем вызывать из внешней программы.
1.4. Откомпилировать проект (нажать Ctrl + F9 или выбрать из меню Project пункт Compile FirsDLLProject), чтобы создать динамическую библиотеку. Проект незапустится, потому что это библиотека, и она не может выполняться самостоятельно.
1.5. Написать программу, которая будет использовать написанную функцию из динамической библиотеки. Создать новый проект простого дополнения (File -> New -> Application). На форму положить одну кнопку и за ее нажатие написать следующий код:
procedure TForm1.Button1Click (Sender: TObject);
var
r: Integer;
begin
r: = Summ (10,34);
Application.MessageBox (PChar (IntToStr (r)), 'Результат функции Summ');
end;
1.6. В разделе type, после описания объекта TForm1 (главной формы) нужно написать такую строку:
function Summ (X, Y: Integer) : Integer; StdCall;
после слова implementation написать следующий код:
function Summ; external 'FirsDLLProject.dll' name 'Summ';
Здесь написано, что есть такая функция Summ. После точки с запятой стоит ключевое слово external, что говорит о том, что функция внешна, не принадлежит программе. После этого слова указывается имя динамической библиотеки, где нужно искать функцию. Дальше идет ключевое слово name, что значит, что функцию надо искать по имени. После этого ключевого слова указывается точное имя функции в библиотеки.
1.7. Найти ключевое слово export и написать там такой код:
exports Summ index 10;
После имени функции стоит ключевое слово index и числовой индекс функции. Индексы и имена должны быть уникальными. Вот несколько примеров:
exports
Func1 index 10 name 'Fun
Func2 Insert,
Func3 index 11,
Func4 index 11, / / Ошибка, такой индекс уже существует
Func5 name 'Don';
В объявлении последней процедуры явно используется ключевое имя name, чтобы указать экспортной функции новое имя. Теперь внутри библиотеки эта функция реализована как Func5, но внешние дополнения должны обращаться к ней на имя Don.
Объявлять можно и так:
exports Func1 index 10 name 'Fun
exports Func2 Insert,
exports Func3 index 11,
1.8. Перекомпіліровать проект, чтобы изменения вошли в силу (нажать Ctrl + F9).
1.9. В разделе implementation изменить описание функции :
function Summ; external 'FirsDLLProject.dll' index 10;
1.10. Запусти проект.
1.10. Открыть библиотеку и выбрать из меню Run пункт Parameters, как на рисунке 2.
Рисунок 2. Окно параметров запуска программы.
В области Host Application нужно указать название программы, которая умеет загружать библиотеку. Теперь попробуйте запустить проект. Запустится отмеченная программа, которая использует библиотеку.
Зачем нужен этот способ? Если вы попробовали запустить программу, и она показала ошибку в коде, где вызывается функция из динамической библиотеки, то можно попробовать запустить библиотеку таким образом. Если опять случится ошибка, то Delphi покажет строку с ошибкой.
Имена библиотек пишите полностью, вместе с расширением. Без расширения DLL -бібліотека (фото) может быть не найдено в Windows NT/2000/XP, хотя в Windows 98 все будет работать нормально.
Хранение формы в динамических библиотеках
Теперь рассмотрим, как можно хранить в динамических библиотеках целые окна. Очень удобно, когда редко используются окна находятся в динамической библиотеке. В этом случае основной файл очень сильно разгружается от лишнего кода.
Еще одно преимущество такого кода - библиотека может использовать для выведения информации на экран свое окно.
2.1. Создать новую DLL -бібліотеку и сохранить ее под именем Project.DLL. Теперь прибавим к библиотеке одну экспортную процедуру Showabout :
library ProjectDLL;
uses
SysUtils, Classes;
($ R *. RES)
exports ShowAbout index 10;
begin
end.
Здесь прибавлено к коду, созданному мастером, только одна строка: exports ShowAbout index 10;
Будет только одна процедура ShowAbout с индексом 10. Эта процедура будет показывать окно О программе.
2.2. Нажать мышью по пункту меню File | New Form, чтобы создать новую форму.
Рисунок 3. Окно «О программе»
2.3. В разделе var после объявления формы описать процедуру Showabout :
var
Forml: TForml;
procedure ShowAbout (Handle: THandle); export; stdcall;
Здесь опять присутствующий ключ export и прибавлено еще stdcaii, что указывает на обязательность использования стандартного вызова процедуры.
2.4. Написать - саму функцию после ключевого слова implementation и ключа ($ R *. DFM).
Функция отображения окна
procedure ShowAbout (Handle: THandle);
begin
/ / Установить указатель в дополнение
/ / устанавливаем этот указатель в свойство Handle объекта Application. Этот объект
/ / хранит настройку всего дополнения, и этим присвоением мы как бы связали
/ / оба дополнения. А точнее, наша библиотека теперь сможет использовать
/ / глобальный указатель основного приложения.
Application.Handle: = Handle;
/ / Создать форму
/ / коду создается окно TForml.create (Application), в результате чего будет возвращен
/ / указание на это окно. Результат мы храним в переменной Forml. Эта
/ / переменчивая объявлена в разделе var проекта.
Forml: = TForml.Create (Application);
/ / Показать модальное окно
Forml.ShowModal;
/ / Очистить
Forml.Free;
end;
2.5. Откомпилировать библиотеку (+) и DLL -файл готов. Можно закрывать этот проект (File | Close All) и создавать новое дополнение, из которого будем вызывать созданную в библиотеке процедуру (File | New Application).
В новом проекте перейти в редактор кода и объявить функцию showAbout
Объявление процедуры ShowAbout
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
procedure ShowAbout (Handle: THandle) stdcall;
type
TForml = class (TForm)
Buttonl: TButton;
procedure ButtonlClick (Sender: TObject);
private
(Private declarations)
public
(Public declarations)
end;
var
Forml: TForml;
procedure ShowAbout; external 'ProjectDLL.DLL' index 10;
implementation
Первое описание процедуры написано не в разделе type, а к нему: procedure ShowAbout (Handle: THandle) stdcall;
Это не является ошибкой, и вы можете выбрать любой из этих способов.
Чаще внешние процедуры объявляются к разделу var, чтобы их потом более легко было найти.
2.6. Установить на форму кнопку и написать для ее события Onclick следующий код:
procedure TForml.ButtonlClick (Sender: TObject);
begin
ShowAbout (Handle);
end;
2.7. Запустить пример.
Как видите, окно не так уж и трудно поместить в библиотеку, и в нем могут быть свои события и свои процедуры и функции. К тому же окно может создавать дочерние окна по отношению к себе и той же динамической библиотеке.
Дата добавления: 2016-02-27; просмотров: 834;