
- •Лабораторна робота № 1 Тема: "Створення шаблонів форм і їх використання в нових проектах"
- •Лабораторна робота № 2 Тема: "Прийоми обробки однотипних компонентів "
- •Лабораторна робота № 3 Тема: Створення незалежних модулів для зберігання незалежних процедур
- •Лабораторна робота № 4 Тема: "Створення шаблонів компонентів"
- •Лабораторна робота № 5 Тема: "Створення динамічної бібліотеки процедур"
- •Лабораторна робота № 6 Тема: "Створення програм із зовнішніми компонентами"
- •Лабораторна робота № 7 Тема: "Створення інформаційної системи за технологією файлового сервера"
- •Лабораторна робота № 8 Тема: "Створення інформаційної системи за технологією клієнт/сервер"
- •Лабораторна робота № 9 Тема: "Робота з базами даних серверної субд"
- •Лабораторна робота № 10 Тема: "Обробка таблиці клієнт/серверної субд за допомогою запитів"
- •Лабораторна робота № 11 Тема: «Робота з com сервером Microsoft Word»
- •Лабораторна робота № 12 Тема: «Робота з com сервером Microsoft Excel»
- •Лабораторна робота № 13 Тема роботи: Створення довідкової системи та її інтеграція в програму
Лабораторна робота № 5 Тема: "Створення динамічної бібліотеки процедур"
Ціль роботи: отримати практичні навички по створенню динамічних DLL бібліотек і організації динамічного зв'язування в головній програмі
Хід роботи
1. Створити динамічну бібліотеку, що містить функції видачі діалогів виходу із програми й очищення масиву полів.
Вказівки: Виконайте команду File - New - Other. У вікні на закладці New виберіть піктограму DLL Wizard. Відкриється вікно з кодом бібліотеки. Вилучіть текст коментаря й ключове слів Begin.
Створіть нову форму й з коду форми скопіюйте розділ підключення стандартних модулів у код бібліотеки.
Уведіть тексти двох функцій:
//функція видачі діалогу виходу із програми
function exit:boolean; stdcall;
begin
//видаємо запит на вихід
if application.Messagebox('Вийти із програми?','Підтвердьте',mb_yesno+mb_iconquestion)=idyes then
//якщо користувач відповів "так", то функція рівна true
exit:=true
else
//інакше функція рівна false
exit:=false;
end;
//функція видачі діалогу на очищення полів
function clear_msg:boolean; stdcall;
begin
//видаємо запит на вихід
if application.Messagebox('Очистити поля?','Підтвердьте',mb_yesno+mb_iconquestion)=idyes then
//якщо користувач відповів "так", то функція рівна true
clear_msg:=true
else
//інакше функція рівна false
clear_msg:=false;
end;
Нижче від тексту функцій додайте блок з переліком імен експортованих підпрограм:
exports
exit,
clear_msg;
Збережіть бібліотеку в окрему папку під ім'ям mylib. За допомогою команди Project - Build mylib виконайте компіляцію файлу бібліотеки.
2. Створіть новий проект. Для форми, використовуючи функцію видачі діалогу виходу із програми, напишіть відповідний код
Вказівки: Виконайте команду File - New - Application. Збережіть новий проект у довільну папку. З папки з відкомпільованою бібліотекою DLL скопіюйте файл mylib.dll у папку з новим проектом.
Для динамічного зв'язування програми з DLL бібліотекою в коді форми опишіть глобальні змінні:
//змінна для посилання на файл DLL
h:thandle=0;
//змінна для посилання на підпрограму exit
exit:function:boolean; stdcall;
Для форми в події Onclosequery напишіть код:
procedure Tform1.Formclosequery(Sender: Tobject; var Canclose: Boolean);
begin
//підключаємо бібліотеку DLL
h:=loadlibrary('mylib.dll');
//знаходимо в бібліотеці потрібну підпрограму
exit:=getprocaddress(h,'exit');
//викликаємо діалог виходу за допомогою функції
canclose:=exit;
end;
Запустіть програму й переконайтеся, що діалог виходу із програми працює вірно
3. У файл бібліотеки DLL створити процедуру для очищення масиву текстових полів
Вказівки: З папки з бібліотекою DLL відкрийте файл проекту mylib.
Для звертання до компонентів підключіть модуль Stdctrls.
У коді бібліотеки створимо нову процедуру:
//процедура очищення масиву полів
//параметр f - ім'я форми, на якій перебуває масив полів
procedure clear_edit(f:tform); stdcall;
var i:integer;
begin
//у циклі проходимо по всіх елементах
for i:=0 to f.Controlcount-1 do
//якщо i-й елемент - це текстове поле
if f.Controls[i].classname='TEdit' then
//то цей елемент очищається як текстове поле Edit
tedit(f.Controls[i]).Text:='';
end;
У нижній частині коду бібліотеки додайте назву процедури в розділ Exports:
exports
exit,
clear_msg,
clear_edit;
Збережіть бібліотеку й за допомогою команди Project - Build mylib виконайте перекомпіляцію файлу DLL.
4. У створеному раніше проекті на формі розмістіть компоненти як показано на малюнку:
Кнопка Очистити видає запит на очищення полів. При цьому використовується функція видачі діалогу clear_msg, створена в першому пункті завдання. Якщо користувач відповідає ствердно, то викликається процедура clear.
Вказівки: З папки з відкомпільованою бібліотекою DLL скопіюйте в папку із проектом оновлений файл mylib.dll. Відкрийте ваш проект для редагування.
Для форми задайте властивості: Borderstryle=bsdialog, caption=Програма, Position=podesktopcenter.
На формі розмістіть компонент Edit і задайте властивості: Text очистити, Tag=1. Скопіюйте компонент 19 разів і розмістіть всі поля як показано на малюнку.
На формі розмістіть компонент Button (Standard) і задайте властивість Caption=Очистити.
Для виклику підпрограм з DLL бібліотеки опишемо глобальні змінні виду:
//змінна для посилання на підпрограму clear_msg
clear_msg:function:boolean; stdcall;
//змінна для посилання на підпрограму clear_edit
clear_edit:procedure(f:tform); stdcall;
Для кнопки напишемо код:
procedure Tform1.Button1Click(Sender: Tobject);
begin
//підключаємо бібліотеку DLL
h:=loadlibrary('mylib.dll');
//знаходимо в бібліотеці потрібну підпрограму
clear_msg:=getprocaddress(h,'clear_msg');
//викликаємо діалог очищення за допомогою функції clear_msg
if clear_msg=true then
//якщо користувач відповів "так"
begin
//знаходимо в бібліотеці потрібну підпрограму
clear_edit:=getprocaddress(h,'clear_edit');
//викликаємо процедуру очищення полів (поля на формі form1)
clear_edit(form1);
end;
end;
Запустіть програму й перевірте правильність роботи функції очищення
5. Додамо в DLL бібліотеку форму реєстрації:
Вказівки: Відкрийте з папки з DLL бібліотекою файл mylib. За допомогою кнопки Newform створіть нову форму. Для форми задайте властивості: Borderstyle=bsdialog, Bordericons=bisystem=true (забираємо кнопку закриття вікна), Caption=Реєстрація, Name=frmlogin, Position=podesktopcenter.
На форму нанесіть два компоненти Label (Standard) і в їхніх властивостях Caption уведіть тексти написів як зазначено на малюнку.
На форму нанесіть два компоненти Edit (Standard). Очистіть у компонентів властивість Text. Для другого поля задайте властивості: Maxlength=8 (максимальна довжина тексту), Passwordchar=* (уведення пароля).
Збережіть форму в папку з бібліотекою DLL під ім'ям ulogin.
Для кнопки напишіть код:
procedure Tfrmlogin.Button1Click(Sender: Tobject);
begin
//якщо перше поле порожнє
if edit1.text='' then
begin
//ставимо курсор у перше поле
edit1.setfocus;
//процедура завершує роботу
exit;
end;
//якщо друге поле порожнє
if edit2.text='' then
begin
//ставимо курсор у друге поле
edit2.setfocus;
//процедура завершує роботу
exit;
end;
Close;
end;
У коді бібліотеки додамо функцію виклику форми реєстрації:
function parol:string; stdcall;
//описуємо змінну для роботи з формою
var f:tfrmlogin;
begin
//створюємо форму в пам'яті
f:=tfrmlogin.create(nil);
//відображаємо форму як модальну
f.Showmodal;
//самій функції привласнюємо значення поля з паролем
parol:=f.Edit2.text;
//видаляємо форму з пам'яті
f.free;
end;
У нижній частині коду додайте ім'я створеної функції в розділ експорту:
exports
exit,
clear_msg,
clear_edit,
parol;
Збережіть бібліотеку й за допомогою команди Project - Build mylib виконайте перекомпіляцію файлу DLL.
6. Викличемо створену форму реєстрації в головній програмі
Вказівки: З папки з відкомпільованою бібліотекою DLL скопіюйте в папку із проектом оновлений файл mylib.dll. Відкрийте ваш проект для редагування.
Форма реєстрації повинна з'явиться до запуску основної програми. За допомогою команди Project - View Source відкрийте код проекту.
Для використання функції завантаження DLL бібліотеки підключіть модуль Windows.
Над ключовим словом Begin опишемо змінні для роботи з файлом DLL
var h:thandle=0;
parol:function:string; stdcall;
Нижче ключового слова begin уведіть код:
//підключаємо бібліотеку DLL
h:=loadlibrary('mylib.dll');
//знаходимо в бібліотеці потрібну підпрограму
parol:=getprocaddress(h,'parol');
//якщо пароль на рівний "1111"
if parol<>'1111' then
begin
//видаємо повідомлення
application.Messagebox('Пароль не вірний','Помилка реєстрації',mb_ok+mb_iconerror);
//завершуємо роботу програми
exitprocess(0);
exit;
end;
Запустіть програму, і переконайтеся, що форма реєстрації працює вірно (пароль 1111)
7. Додамо в DLL бібліотеку функцію знаходження кількість цілих елементів у масиві.
Вказівки: Відкрийте з папки з DLL бібліотекою файл mylib.
У коді бібліотеки додамо функцію знаходження кількості цілих елементів у масиві:
//функція знаходження кількості цілих чисел
//параметр f - ім'я форми, на якій знаходиться масив полів
function kol_int(f:tform):integer; stdcall;
var i,kol:integer;
begin
//спочатку кількість обнулюємо
kol:=0;
//у циклі проходимо по всіх елементах
for i:=0 to f.Controlcount-1 do
//якщо i-й елемент - це текстове поле
if f.Controls[i].classname='TEdit' then
//якщо i-й елемент не порожній
if tedit(f.Controls[i]).text<>'' then
//якщо дробова частина числа рівна 0 (число ціле)
if frac(strtofloat(tedit(f.Controls[i]).text))=0 then
//нарощуємо кількість цілих чисел
kol:=kol+1;
//функції привласнюємо знайдену кількість
kol_int:=kol;
end;
У нижній частині коду додайте ім'я створеної функції в розділ експорту:
exports
exit,
clear_msg,
clear_edit,
parol,
kol_int;
8. Для виводу знайденої кількості цілих чисел в DLL бібліотеці створимо окрему форму. На формі буде знаходитися компонент Label, у якому будемо відображати відповідь.
Вказівки: У проекті mylib за допомогою кнопки Newform створіть нову форму. Для форми задайте властивості: Borderstyle=bsdialog, Caption=Результат, Name=frmotvet, Position=podesktopcenter.
На форму нанесіть компонентів Label (Standard).
Збережіть форму в папку з бібліотекою DLL під ім'ям uotvet.
У коді DLL бібліотеки створіть процедуру відображення створеної форми з деяким результатом rez.
//процедура відображення форми для відповіді
//виведене на формі значення передається
//як вхідний параметр rez типу integer
procedure otvet(rez:integer); stdcall;
//змінна для створення форми
var f:tfrmotvet;
begin
//створюємо форму в пам'яті
f:=tfrmotvet.create(nil);
//на формі відображаємо результат rez
f.label1.caption:=inttostr(rez);
//відображаємо форму як модальну
f.showmodal;
//після закриття форма віддаляється з пам'яті
f.free;
end;
У нижній частині коду додайте ім'я створеної процедури в розділ експорту:
exports
exit,
clear_msg,
clear_edit,
parol,
kol_int,
otvet;
Збережіть бібліотеку й за допомогою команди Project - Build mylib виконайте перекомпіляцію файлу DLL.
9. На формі основної програми створіть ще одну кнопку, яка відображає з DLL бібліотеки форму для відповіді. На цій формі відображаєтся результат роботи функції підрахунку кількості цілих чисел.
Вказівки: З папки з відкомпільованою бібліотекою DLL скопіюйте в папку із проектом оновлений файл mylib.dll. Відкрийте ваш проект для редагування.
На форму нанесіть компонент Button (Standard). Задайте властивість Caption = Кіл. цілих.
Для виклику підпрограм з DLL бібліотеки опишемо глобальні змінні виду:
//змінна для посилання на підпрограму kol_int
kol_int:function(f:tform):integer; stdcall;
//змінна для посилання на підпрограму otvet
otvet:procedure(rez:integer); stdcall;
Для кнопки напишемо код:
procedure Tform1.Button1Click(Sender: Tobject);
begin
//підключаємо бібліотеку DLL
h:=loadlibrary('mylib.dll');
//знаходимо в бібліотеці потрібну підпрограму
kol_int:=getprocaddress(h,'kol_int');
otvet:=getprocaddress(h,'otvet');
//викликаємо процедуру відображення форми відповіді
//у якості вхідного параметра передається
//значення функції підрахунку кількості цілих чисел
otvet(kol_int(form1));
end;
10. Перевіримо, що внесення змін в DLL файл не вимагає перекомпілювання файлу програми. Наприклад, змінимо текст у діалозі виходу із програми.
Вказівки: З папки з бібліотекою DLL відкрийте файл mylib. У код функції Exit внесіть зміни (позначене напівжирним накресленням):
function exit:boolean; stdcall;
begin
//видаємо запит на вихід
if application.Messagebox('Завершити роботу із програмою?','Запит на вихід',mb_yesno+mb_iconquestion)=idyes then
//якщо користувач відповів "так", то функція рівна true
exit:=true
else
//інакше функція рівна false
exit:=false;
end;
Збережіть бібліотеку й за допомогою команди Project - Build mylib виконайте перекомпіляцію файлу DLL.
Скопіюйте в папку із проектом оновлений файл mylib.dll.
Запустіть exe файл вашої програми й переконайтеся, що при виході видається діалог з новими текстами повідомлень.
11. Однією з переваг використання DLL є можливість використання однієї бібліотеки декількома програмами одночасно.
Створимо ще одну програму, яка також при виході буде викликати діалог exit.
Вказівки: За допомогою команди File - New - Application створіть новий проект і збережіть його в довільну папку.
У коді форми проекту опишемо змінні для роботи в DLL бібліотекою.
//змінна для посилання на файл DLL
h:thandle=0;
//змінна для посилання на підпрограму exit
exit:function:boolean; stdcall;
Для форми в події Onclosequery напишіть код:
procedure Tform1.Formclosequery(Sender: Tobject; var Canclose: Boolean);
begin
//підключаємо бібліотеку DLL
h:=loadlibrary('mylib.dll');
//знаходимо в бібліотеці потрібну підпрограму
exit:=getprocaddress(h,'exit');
//викликаємо діалог виходу за допомогою функції
canclose:=exit;
end;
Запустіть програму й переконайтеся, що діалог виходу із програми не працює. Це пов'язано з тим, що нова програма не має доступу до файлу mylib.dll.Можна скопіювати файл mylib.dll у папку з вашим новим проектом.
Однак у нас стоїть завдання забезпечити загальний доступ усіх програм до одного файлу бібліотеки. Отже його потрібно розмістити в такому місці, звідки його зможе "побачити" будь-яка програма. Таким місцем може бути папка Windows або папка Windows\System32.
Перемістіть файл mylib.exe з папки першого проекту в папку Windows.
По черзі запустіть exe файли створених програм і переконайтеся, що вони працюють, спільно використовуючи всього одну DLL бібліотеку.