Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи КПЗ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.24 Mб
Скачать

Лабораторна робота № 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 бібліотеку.