Міністерство освіти і науки України
Хмельницький національний університет
Кафедра системного програмування
Лабораторна робота №7
з програмування
на тему:
«Розробка DLL-бібліотек»
Лабораторна робота №7
Тема: Розробка DLL-бібліотек.
Мета: навчитись створювати DLL-бібліотеки та використовувати їх в додатках, засвоїти навички експорту функцій.
Завдання
Розробити DLL-бібліотеку для виконання операцій над динамічним однозв’язним списком.
DLL-бібліотека
Project1.lpr
library project1;
{$mode objfpc}{$H+}
uses
Classes, sysutils
{ you can add units after this };
type vkaz=^spysok;
spysok=record
num:real;
next:vkaz;
end;
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
procedure add(var a,head:vkaz; D:real); export;
begin
if a<>nil then while a^.next<>nil do a:=a^.next;
if a=nil then begin new(a); head:=a; end
else begin new(a^.next); a:=a^.next; end;
a^.num:=D; a^.next:=nil;
end;
exports add name 'add';
procedure Free(var a:vkaz; var head:vkaz); export;
var temp:vkaz;
begin a:=head;
while a<>nil do begin temp:=a; a:=a^.next; dispose(temp); end;
a:=nil; head:=nil;
end;
exports Free name 'Free';
procedure searchPos(var a:vkaz; head:vkaz; D:real; var N:integer); export;
begin n:=1; a:=head;
while (a<>nil) and (a^.num<>D) do begin a:=a^.next; inc(n); end;
if a=nil then n:=0;
end;
exports searchPos name 'searchPos';
function search(var a:vkaz; head:vkaz; D:real):vkaz;
begin a:=head;
if a<>nil then while (a<>nil) and (D<>a^.num) do a:=a^.next; Search:=a;
end;
Procedure DelElem(var a,head:vkaz;tmp:vkaz);
var tempa:vkaz;
begin a:=head;
if (a<>nil) and (tmp<>nil) then
begin if tmp=a then begin a:=tmp^.next; dispose(tmp); head:=a; end
else begin tempa:=a;
while tempa^.next<>tmp do tempa:=tempa^.next;
tempa^.next:=tmp^.next; dispose(tmp);
end;
end;
end;
procedure DelElemZnach(var a,head:vkaz; D:real); export;
var temp:vkaz;
begin
if a<>nil then begin temp:=Search(a,head,D);
if temp<>nil then DelElem(a,head,temp); end;
end;
exports DelElemZnach name 'delnum';
Procedure DelElemPos(var a,head:vkaz;pos:integer); export;
var i:integer; tmp:vkaz;
begin
if (pos>0) and (a<>nil) then
begin i:=1; tmp:=head;
while (tmp<>nil) and (i<>pos) do begin tmp:=tmp^.next; inc(i) end;
if tmp<>nil then DelElem(a,head,tmp); end;
end;
exports DelElemPos name 'delpos';
begin
end.
Програма з використанням бібліотеки
Project1.lpr
program lab7;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1, LResources
{ you can add units after this };
{$IFDEF WINDOWS}{$R lab7.rc}{$ENDIF}
begin
Application.Title:='Однозвязні списки';
{$I lab7.lrs}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Unit1.pas
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;
type
vkaz=^spysok;
spysok=record
num:real;
next:vkaz;
end;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton; Button2: TButton; Button3: TButton;
CB1: TCheckBox;
Edit1: TEdit;
Label1: TLabel; Label2: TLabel;
Memo1: TMemo;
R1: TRadioButton; R2: TRadioButton; R3: TRadioButton; R4: TRadioButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure CB1Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: char);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
private { private declarations }
public { public declarations }
end;
var Form1: TForm1; list,head:vkaz;
implementation
procedure add(var a,head:vkaz; D:real); external 'project1.dll' name 'add';
procedure Freem(var a:vkaz; var head:vkaz); external 'project1.dll' name 'Free';
procedure output(head:vkaz; var n:string); external 'project1.dll' name 'output';
procedure delnum(var a,head:vkaz; D:real); external 'project1.dll' name 'delnum';
procedure delhead(var a,head:vkaz; t:integer); external 'project1.dll' name 'delhead';
procedure searchPos(var a:vkaz; head:vkaz; D:real; var N:integer); external 'project1.dll' name 'searchPos';
{ TForm1 }
procedure output(head:vkaz);
begin Form1.Memo1.Clear;
while head<>nil do
begin Form1.Memo1.Caption:=Form1.Memo1.Caption+(FloatToStr(head^.num)+' ');
head:=head^.next;
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
CanClose:=MessageDlg('Однозвязний список', 'Дійсно закрити?', mtConfirmation, [mbYes,mbNo], 0)=mrYes;
Freem(list,head);
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: char);
begin
case Key of
#8,'0'..'9': ;
'-': if Edit1.Text<>'' then Key:=#0;
',': begin if Length(Edit1.Text)-pos('-',Edit1.Text)=0 then Key:=#0;
if pos(',',Edit1.Text)<>0 then Key:=#0;
end
else Key:=#0;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var i,n:integer; ch:real;
begin
ch:=StrToFloat(Edit1.Text);
if R1.Checked then
begin add(list,head,ch); Button2.Enabled:=True;
ShowMessage('елемент '+FloatToStr(ch)+' додано.');
if CB1.Checked then Button1Click(Sender); end else
if R2.Checked then begin delnum(list,head,ch);
ShowMessage('елемент '+FloatToStr(ch)+' видалено.');
if CB1.Checked then Button1Click(Sender); end else
if R3.Checked then begin i:=StrToInt(Edit1.Text); delhead(list,head,i);
if n>0 then ShowMessage('елемент номер '+FloatToStr(i)+' видалено.');
if CB1.Checked then Button1Click(Sender); end else
begin searchPos(list,head,ch,n); if n=0 then ShowMessage('Елемент відсутній у списку')
else ShowMessage('Елемент у списку номер '+IntToStr(n)); end;
Edit1.Clear;
end;
procedure TForm1.CB1Change(Sender: TObject);
begin if CB1.Checked then Button1Click(Sender) else Memo1.Clear;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin output(head);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Freem(list,head); Button2.Enabled:=False; Memo1.Clear;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin Button3.Enabled:=not(Edit1.Text='');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin list:=nil; head:=nil;
Button2.Enabled:=False; Button3.Enabled:=False;
R1.Checked:=True;
end;
initialization
{$I unit1.lrs}
end.
Висновок. Виконавши лабораторну роботу, я засвоїв принципи створення DLL-бібліотек, зрозумів методи імпорту та експорту процедур і функцій з бібліотек, та на прикладі перевірив їх виконання. Також було закріплено навички щодо опрацювання однозв’язних динамічних списків, а саме додавання, пошук, видалення знайденого елемента, звільнення пам’яті (очищення списку).
/
/
/