Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
. . . . . . . . секция инициализации;
End.
Правила записи разделов DLL- библиотеки такие же, как и в случае программы на ТР.
После раздела модулей могут располагаться разделы описания типов, констант, переменных. Например, если в списке формальных параметров подпрограммы есть массив, то необходимо в библиотеке предусмотреть раздел Type и объявить в нем идентификатор типа массива.
Раздел экспортирования предназначен для указания подпрограмм, которые можно передавать в другие программы. Из DLL- библиотеки можно экспортировать только подпрограммы, имена которых указаны в разделе Exports. Подпрограммы, имена которых не указаны в разделе Exports, можно использовать только внутри DLL-библиотеки.
Секция инициализации аналогична такой же секции модуля и выполняется один раз при загрузке библиотеки. Эта секция начинается с зарезервированного слова Begin и заканчивается словом End., в ней можно записывать операторы, выполняющие инициализацию параметров, открытие файлов и т.п.
Раздел Exports записывается в виде
Exports объявление 1, объявление 2, . . . . объявление n ;
где объявление Х - задает характеристики конкретной экспортируемой подпрограммы. Есть несколько способов задания объявления.
1 способ. Объявление задается именем подпрограммы, например,
Exports Sum;
2 способ. Объявление задается именем и номером (с помощью директивы Index).
Пример. Exports Sum Index 1, Mult Index 2;
Этот способ является самым быстрым по вызову.
5.15.1. Создание DLL- библиотеки.
В Delphy имеются специальные средства для создания DLL библиотек.
Пример. Создадим DLL библиотеку содержащую две процедуры:
MX - определение максимального числа из V1 иV2;
PFY2 - вычисление значения функции У=А*Х*Х.
1. Выполнить команды File \ New - появится окно NewItem.
Выделим пиктограмму DLL и щелкнем по кнопке ОК.
Откроется окно с заготовкой DLL.
library Project1;
{ Комментарии }
uses SysUtils, Classes;
{$R *.RES}
begin
end.
Library Project1;
uses Sysutils,classes;
{$R *.RES}
Procedure max(v1,v2:Extended;
Var Z:Extended);
begin
If v1 > v2 Then Z:=v1
Else Z:=v2;
end;
Procedure Pfy(a,x:Extended;
Var Fy:Extended);
begin
Fy:=a*Sqr(x);
end;
Exports Max index 1,
Pfy index 2;
begin
End.
Выполнить пункт меню Project \ Build Project. Выполнить компиляцию, исправить ошибки. При успешной компиляции в нашей папке появится файл MyDLL.dll.
5.15.2. Вызов Dll.
Под вызовом библиотеки понимается использование имеющихся в ней подрпограмм (процедур и функций) и ресурсов. При вызове библиотеки программист не имеет возможности указать ее размещение, поэтому библиотека должна быть расположена в папке, в которой Windows может обнаружить ее автоматически. Такими папками являются: корневая папка Windows, ее папки System и System, а также папка из которой запущено приложение.
Различают два способа вызова подпрограмм из библиотеки: - статический и динамический. Заметим, что в данном случае эти термины используются в несколько ином смысле, чем ранее. В обоих способах вызова библиотека загружается в оперативную память во время выполнения приложения, то есть динамически.
При статическом вызове библиотека загружается в оперативную память вместе с использующими ее приложениями и другими библиотеками и выгружается после прекращения работы последнего использующего ее процесса. Достоинством статического вызова является простота реализации в программе. Однако при таком вызове программист не может управлять процессом загрузки библиотеки и, кроме того, библиотека находится в оперативной памяти все время работы приложения, даже если она не будет использована.
При динамическом вызове библиотечных функций программист может управлять процессом загрузки библиотек, а также экономить оперативную память, загружая только нужные в данный момент библиотеки. Например, если библиотека содержит форму для настройки приложения (и используется редко), то имеет смысл загружать ее только на время использования содержащихся в ней кода и ресурсов.
Рассмотрим статическое импортирование.
При статическом импортировании в секции implementation модуля формы задается заголовок импортируемой подпрограммы с директивой External. При вызове подпрограммы DLL библиотеки возможны два варианта:
а) вызов подпрограммы из библиотеки по имени, в этом случае после слова External записывается только имя библиотеки, например
Interface
Procedure Pfy(a,x:Extended; Var Fy:Extended);External MyDLL.dll;
б) вызов подпрограммы по ее номеру. Все подпрограммы в библиотеке пронумерованы. И по номеру можно вызвать соответствующую подпрограмму. Для этого после директивы External и имени библиотеки записывается директива Index и номер подпрограммы, например, так
Procedure Pfy(a,x:Extended; Var Fy:Extended);External MyDLL.dllIndex 3;
Это самый быстрый вызов. При статическом импортировании сама библиотека вызывается операционной системой при первом к ней обращении и выгружается, когда потребность в ней отпадает (когда программа прекратит свою работу, если только библиотека не используется в это время другими программами). Таким образом, в данном случае заботиться о загрузке и выгрузке библиотеки не требуется.
5.16. Диалоговые окна
Все программные сообщения можно разделить на: информационные сообщения (например,"Загрузка данных с дискеты завершена") , предупреждающие сообщения (например,"Файл модифицирован. Сохранить?"), сообщения об ошибке ("Файл данных программы не найден. Требуется переустановка программы"). Эта разбивка на типы сообщений является, естественно, не полной. В Delphi имеются специальные средства для формирования и вывода на экран монитора различных сообщений.
Процедура ShowMessage.
Форма записи:
ShowMessage(Sk);
где Sk константа или переменная строкового типа (String). На этой команде работа программы приостанавливается и на экране появляется окно с текстом сообщения подобное окну, показанному на рис.5.28.1.
Рис.5.28.1.
Пока пользователь не щелкнет на кнопке Ok, работа с приложением становится невозможной, т.е. это окно открывается модально. Как вы заметили, заголовок окна простой. Он содержит в себе текст, который отображен на панели задач. По умолчанию имеет название запускаемого EXE файла.
Пример.
If X<0 Then Begin
ShowMessage ('Аргумент < 0');
Exit;
End;
ФункцияMessageDlg.
ФункцияMessageDlg обладает более широкими возможностями. Кроме сообщения она позволяет указать тип сообщения и отобразить в окне сообщения несколько кнопок.
Форма записи: MessageDlg(<сообщение>, <тип>, <кнопки>, <справка>);
Здесь: <сообщение>- строковая константа, отображается в окне.
<тип>- тип сообщения - может принимать несколько значений. От этих значений зависит содержимое заголовка и иконка в левом верхнем углу окна. Возможные значения типа сообщений приведены в таблице 5.28.1
Таблица 5.28.1.
Тип сообщения |
Описание |
Вид окна |
mtWarning |
Предупреждение. Можно использовать в предупреждающих сообщениях. Например, "Вы действительно желаете удалить все данные с диска С:" |
|
mtError |
Ошибка. Обычное окошко вывода сообщения об ошибки. Например, аргумент Ln меньше нуля. |
|
mtInformation |
Информация. Какая-нибудь информация. Например, "Не найден файл настройки, создается заново" |
|
mtConfirmation |
Запрос\ подтверждение Запрос на сохранение перед выходом, спрашивает перед удалением параметра, и т.п. |
|
mtCustom |
Без значка. Это сообщение полностью аналогично ShowMessage |
Элемент <кнопки> - содержит в себе массив кнопок, которые можно показывать в сообщении.
кнопка |
* mbYes |
* mbNo |
* mbOK |
* mbCancel |
* mbAbort |
текст на кнопке |
Yes |
No |
Ok |
Cancel |
Abort |
Еще есть кнопки: * mbHelp, * mbRetry, * mbIgnore, * mbAll.
Массив кнопок задается в квадратных скобках []. Например, нам надо задать три кнопки Yes, No, Cancel. Это делается так [mbYes, mbNo, mbCancel].
Элемент <справка> содержит номер страницы справочной системы. Если справка отсутствует, то указывается номер 0.
MessageDLG является функцией. Она возвращает результат нажатой кнопки.
Рассмотрим пример. Пусть нам надо спросить у пользователя о дальнейших действиях перед выходом из программы.
1. Сохранить файл.
2. Не сохранять файл.
3. Продолжить редактирование.
Var R:Word; // переменная, в которой хранится результат
...R:=MessageDLG ('Сохранить файл перед выходом?', mtConfirmation, [mbYes, mbNo, mbCancel], 0);
if R=mrYes then // если нажата кнопка Yes
begin
// сохраняем файл и завершаем программу
end;
if R=mrNo then // если нажата кнопка No
begin
// завершаем работу программы без сохранения
end;
if R=mrCancel then // если нажата кнопка Cancel
begin
// продолжаем работу без сохранения
end;
MessageDLG - это очень гибкая функция, у нее есть много достоинств, но есть и один существенный недостаток - англоязычный интерфейс.
Следующая процедура использует системные сообщения пользователю вашей операционной системы. Т.е., если у вас установлена, например немецкая версия windows, то кнопки будут иметь соответствующие названия на немецком языке.
MessageBox(Handle,ТЕКСТ_СООБЩЕНИЯ,ЗАГОЛОВОК_ОКНА,ТИП_СООБЩЕНИЯ);
Первый параметр - указатель на владельца окна сообщения. Этот параметр вам пока ничего не говорит, устанавливайте его в Handle (это ссылка на окно, откуда это сообщение вызывается).
ТЕКСТ_СООБЩЕНИЯ и ЗАГОЛОВОК_ОКНА - имеют тип PChar, поэтому, во избежание недоразумений и появления неизвестного рода ошибок, выдаваемых компилятором, меняйте тип String в PChar "на ходу". Например:
MessageBox(Handle,PChar('ТЕКСТ_СООБЩЕНИЯ'),PChar('ЗАГОЛОВОК_ОКНА'),...
Это был перевод из одного типа строковой величины в другой тип.
Теперь поговорим о немного сложном параметре ТИП_СООБЩЕНИЯ. Он включает в себя иконку и кнопки.
Кнопки:
* MB_ABORTRETRYIGNORE - кнопки "Прервать", "Повторить", "Пропустить".
* MB_OK - кнопка "Ok".
* MB_OKCANCEL - кнопки "Ok", "Отмена".
* MB_RETRYCANCEL - кнопки "Повторить" и "Отмена".
* MB_YESNO - две кнопки "Да" и "Нет".
* MB_YESNOCANCEL - кнопки "Да", "Нет", "Отмена".
Для того, чтобы отобразить иконку, нужно указать:
* MB_ICONEXCLAMATION
* MB_ICONWARNING
* MB_ICONINFORMATION
* MB_ICONASTERISK
* MB_ICONQUESTION
* MB_ICONSTOP
* MB_ICONERROR
* MB_ICONHAND
Если у вас в сообщении несколько кнопок, а по умолчанию нужно выбрать определенную, то такая кнопка задается:
MB_DEFBUTTON1 - где последняя цифра указывает номер кнопки, выбранной по умолчанию. Это свойство может быть полезным, например, чтобы обезопасить данные от случайного уничтожения. "Удалить файл?". Две кнопки - "Да", "Нет". По умолчанию мы программно выбираем вторую кнопку. Если пользователь сразу нажал на Enter, не осознавая своего поступка, можно сказать по привычке, то ничего страшного не произойдет.
Как же указать параметры иконки, кнопок, кнопки по умолчанию в одном параметре ТИП_СООБЩЕНИЯ. Очень просто. Простым знаком +
Например:
MessageBox(Handle,PChar('Выйти из программы?'),PChar('Мое сообщение'),MB_ICONINFORMATION+MB_OKCANCEL+MB_DEFBUTTON2);
Выглядит это в программе так, как показано на рисунке:
Итак, MessageBox можно считать идеальной командой вывода сообщения пользователю, которая будет совместима со всеми языковыми версиями windows.
Контроль нажатия на кнопку в MessageBox мы осуществляем аналогично MessageDLG, только возвращаемая величина может принимать следующие значение (соответственно нажатой кнопке):
* IDABORT
* IDCANCEL
* IDIGNORE
* IDNO
* IDOK
* IDRETRY
* IDYES