- •Содержание
- •Введение
- •Лабораторная работа № 13 Создание простых форм. Программирование кнопок
- •Теоретические сведения Назначение и состав окон для визуальной разработки по в Delphi 7
- •Объект tForm(форма)
- •Объект tLabel (текстовое поле)
- •Объект tButton (кнопка)
- •Преобразование типов
- •Метод установления фокуса
- •Порядок выполнения работы
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа № 14 Интерактивный ввод и вывод. Обработка исключительных ситуаций
- •Теоретические сведения Компонент tEdit (поле редактирования)
- •Компонент tRadioButton (переключатель)
- •Пример 14.1. При нажатии на кнопки «Ответ» в окне появляется строка, соответствующая выбранному переключателю (рис. 14.1)
- •Обработка события, вызванного нажатием на кнопку, имеет такой вид:
- •Процедуры и функции, реализующие диалоговые окна
- •Обработчики исключений
- •Пример 14.2. Вычислить значение функции . Экранная форма программы показана на рис. 14.5.
- •Порядок выполнения работы
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа № 15 Программирование циклов. Компоненты: флажок, группа компонентов, главное меню, контекстное меню, список действий, область просмотра
- •Теоретические сведения Компонент tMemo (область просмотра)
- •Пример 15.1. В многострочный редактор при нажатии кнопки выводятся номера строк. Экранная форма программы показана на рис. 15.1.
- •Компонент tCheckBox (флажок)
- •Пример 15.2. Флажками отмечаются используемые кредитные карточки и по нажатию кнопки в многострочный редактор выводятся эти названия. Экранная форма программы показана на рис. 15.2.
- •Панель tGroupBox (группы компонентов)
- •Пример 15.3. С помощью флажков выбирают продукты из списка и по нажатию кнопки в многострочный редактор выводятся эти названия. Экранная форма программы показана на рис. 15.3.
- •Список действий (tActionList)
- •Главное меню (tMainMenu)
- •Пример 15.5. Создан простой редактор содержащий меню. Экранная форма программы показана на рис. 15.7.
- •Обработка событий выбора пунктов меню имеет вид
- •Всплывающее меню (tPopupMenu)
- •Обработка событий выбора пунктов меню аналогична примеру 15.5 и имеет вид
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа № 16Обработка динамических массивов данных. КомпонентTStringGrid(Таблица строк)
- •Теоретические сведения Компонент tStringGrid (таблица строк)
- •Implementation
- •Порядок выполнения работы
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа № 17Работа с объектами. Инкапсуляция. Наследование. Полиморфизм. Создание заставки
- •Теоретические сведения Понятие класса и объекта
- •Инкапсуляция и свойства объекта
- •Наследование
- •Полиморфизм и виртуальныеметоды
- •Директивы, используемые при объявлении класса
- •Порядок выполнения работы
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа № 18Компоненты для работы с файлами и каталогами
- •Теоретические сведения Компоненты для работы с файлами и каталогами
- •Выбор дисковода
- •Просмотр и перемещение по дереву каталогов
- •Просмотр списка и выбор имени файла
- •Выбор маски для списка файлов
- •Порядок выполнения работы
- •Контрольные вопросы
- •Лабораторная работа № 19Создание многооконных приложений (mdi). Строка Состояний
- •Теоретические сведения Компонент tStatusBar(строка состояний)
- •Многооконные приложения
- •Порядок выполнения работы
- •Варианты
- •Контрольные вопросы
- •Лабораторная работа № 20КомпонентTChart для Построение диаграмм различных типов. Создание библиотек динамической компоновки (Dll). Статическое подключение Dll
- •Теоретические сведения Компонент tChart (диаграмма)
- •Пример 20. 1. Построить график функции с шагом 0.1 в интервале [-5;5]. Экранная форма программы показана на рис. 20.2. Приведем фрагмент кода программы с обработкой основных событий:
- •Implementation
- •Создание библиотеки динамической компоновки (dll)
- •Пример 20. 2. Создать библиотеку содержащую функции сложения целых и вещественных чисел, а также строк. Код библиотеки имеет вид
- •Статический вызов библиотеки
- •Пример 20.3. Используем статически функции, описанные в библиотеке (см. Пример 20.2). Экранная форма программы показана на рис. 20.5. Фрагмент кода с использованием функций из библиотеки:
- •Implementation
- •Порядок выполнения работы
- •Контрольные вопросы
- •Лабораторная работа № 21Использование форм в библиотеках динамической компоновки (Dll). Динамическое подключение Dll.
- •Теоретические сведения Динамический вызов библиотеки
- •Implementation
- •Использование форм в библиотеках
- •Порядок выполнения работы
- •Варианты
- •Контрольные вопросы
- •Домашнее задание № 6Компоненты: Поля редактирования, группа переключателей. Обработка событий клавиатуры
- •Теоретические сведения Компонент группа переключателей (tRadioGroup)
- •События клавиатуры
- •Порядок выполнения работы
- •Варианты:
- •Контрольные вопросы
- •Домашнее задание № 7Создание Справочного файла
- •Теоретические сведения Создание справочной системы
- •Порядок выполнения работы
- •Контрольные вопросы
- •Библиографический список
Порядок выполнения работы
На основе варианта задания из лабораторной работы 15 создать библиотеку динамической компоновки, в которую поместить табулируемую функцию и функции, связанные с проверками области допустимых значений. Статический вызов библиотеки разместить в основном модуле. Построить график функции. Для этого добавить в пункт меню «Вычисления» и контекстное меню пункт «Построение графика». Диаграмму разместить в отдельном окне.
Обработать все возможные исключительные ситуации.
Приблизительный вид форм показан на рис. 20.6.
Контрольные вопросы
Создание библиотеки динамической компоновки.
Экспортирование функций.
Статическое подключение библиотеки.
Компонент TChart (диаграмма). Особенности его использования для построения графиков.
Основные свойства и методы диаграммы.
Лабораторная работа № 21Использование форм в библиотеках динамической компоновки (Dll). Динамическое подключение Dll.
Цель работы: приобретение навыков создания DLL и их динамического подключения, изучение особенностей использования форм в библиотеках.
Теоретические сведения Динамический вызов библиотеки
При динамическом вызове кроме собственно вызова функции необходимо обеспечить:
загрузку библиотеки;
получение адреса функции;
выгрузку библиотеки.
Загрузку библиотеки выполняет API-функция LoadLibrary(lpLibFileName: pchar): HMODULE, которая загружает в оперативную память библиотеку с именем lpLibFileName. В качестве результата функция возвращает ссылку HMODULE на модуль библиотеки при успешной загрузке и 0 — при ошибке.
Выгружается библиотека API-функцией FreeLibrary(hLibModule: HMODULE): Bool, которая удаляет из оперативной памяти библиотеку, модуль которой указывает параметр HMODULE. В случае успешной выгрузки функция возвращает True и False — в противном случае.
Получение адреса функции выполняется API-функцией GetProcAddress(hModule: HMODULE, lpProcName: LPCSTR): FARPROC, которая ищет в библиотеке, модуль которой задан параметром hModule, функцию, имя которой указано параметром lpProcName, и в качестве результата возвращает указатель на функцию. Если поиск оказался безрезультатным, то возвращается Nil.
Используя полученный указатель, библиотечная функция может вызываться. Перед вызовом указатель приводится к типу функции.
Пример 21.1. Используем динамически функции, описанные в библиотеке примера 20.2. Экранная форма программы такая же, как и в примере 20.3 (рис. 20.5). Фрагмент кода с использованием функций из библиотеки:
// Описание типов внешних (из библиотек) функций
type TAddInt=function(p1,p2:integer):integer;
TAddReals=function(p1,p2:real):real;
. . .
private
{ Описание ссылки на модуль DLL }
DLLHandle:THandle;
//1-й вариант переменной для приведения типа функции
ExtFuncAddInt:TAddInt;
//2-й вариант переменных для приведения типа функции
ExtFuncAddRealPoint:TFarProc;
ExtFuncAddReal:TAddReals;
public
{ Public declarations }
end;
. . .
Implementation
{$R *.dfm}
procedure TUntUseDllMain.BtnAddIntClick(Sender: TObject);
var N1,N2,Res:integer;
begin
//загрузка библиотеки
DllHandle:=LoadLibrary('MyDll');
if (DllHandle=0) then begin
ShowMessage('Ошибка загрузки библиотеки MyDLL!!!');
exit;
end;
try
//Получение указателя на функцию AddInt
// и преобразование его к соответствующему типу
@ExtFuncAddInt:=GetProcAddress(DllHandle,Pchar('AddInt'));
try
//преобразование данных к целочисленному типу
N1:=strtoint(EdtInt1.Text);
N2:=strtoint(EdtInt2.Text);
except
ShowMessage('Ошибка данных!!!');
exit;
end;
//вызов функции AddInt
Res:=ExtFuncAddInt(N1,N2);
EdtResInt.Text:=inttostr(Res);
//выгрузка бибилиотеки
finally
FreeLibrary(DllHandle);
end;
end;
procedure TUntUseDllMain.BtnAddRealClick(Sender: TObject);
var N1,N2,Res:real;
begin
//загрузка библиотеки
DllHandle:=LoadLibrary('MyDll');
if (DllHandle=0) then begin
ShowMessage('Ошибка загрузки библиотеки MyDLL!!!');
exit;
end;
try
//Получение указателя на функцию AddReal
// и преобразование его к соответствующему типу
ExtFuncAddRealPoint:=GetProcAddress(DllHandle,Pchar('AddReals'));
if (ExtFuncAddRealPoint<>nil) then
ExtFuncAddReal:=TAddReals(ExtFuncAddRealPoint);
try
//преобразование данных к вещественному типу
N1:=strtoFloat(EdtReal1.Text);
N2:=strtoFloat(EdtReal2.Text);
except
ShowMessage('Ошибка данных!!!');
exit;
end;
//вызов функции AddReal
Res:=ExtFuncAddReal(N1,N2);
EdtResReal.Text:=Floattostr(Res);
//выгрузка библиотеки
finally
FreeLibrary(DllHandle);
end;
end;
end.