A szegmensek tËrgyalËsakor mËr emlÖtÒst tettãnk a unitrÛl, mint a Pascal kãlső szegmensÒről (5.4. pont). A unit a Pascal ÞnËllÛ szegmense, vagy mËs szÛval kãlső modulja, amely lefordÖtott (tËrgykÛdà) formËban egÒszÖt ki valamely programot. A unit lehetővÒ teszi nagymÒretű alkalmazËsok kÒszÖtÒsÒt PASCAL kÞrnyezetben. Alapvetően kÒtfÒle unit van: standard unit, ami a nyelv rÒszekÒnt előre definiËlva van, Òs a programozÛ Ëltal kÒszÖtett unit.
5.10.1 Standard unit
A standard unitok gyűjtemÒnye a feltelepÖtett fejlesztő rendszerben lefordÖtott vËltozatban a bgi kÞnyvtËrban rendelkezÒsre Ëll. A Turbo Pascal ezeket tpu (Turbo Pascal Unit) kiterjesztÒssel azonosÖtja. A standard unitok hasznËlatËhoz ismerni kell a benne lÒvő eljËrËsok Òs fãggvÒnyek neveit, feladatukat, valamint paramÒterezÒsãk mÛdjËt. Az utasÖtËslistËt a Pascal nem kÞzli.
Delphi fejlesztői kÞrnyezetben a standard unitok kiterjesztÒse dcu (Delphi Compiled Unit) Òs a lib kÞnyvtËrban talËljuk meg ezeket forrËskÛdjukkal (pas kiterjesztÒs) egyãtt. Ezek kÞzãl Ëlljon itt nÒhËny.
SysUtils amely a Consol Application alaprutinjait tartalmazza. Ez szãksÒges a Pascal szimulËciÛhoz Delphi kÞrnyezetben. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, stb a Delphi alap unitjai, amelyeket minden alkalmazËs indÖtËsakor felkÖnËl. Ezekkel rÒszletesen a SzË-mÖtËstechnika II. c. jegyzetben foglalkozunk.
5.10.2 Unitok definiËlËsa Òs hasznËlata
SzËmunkra most a sajËt unitunk kÒszÖtÒse fontos. Ehhez elsőkÒnt a unit szerke-zeti felÒpÖtÒsÒt kell megismerni. Amint a tÞbbi szegmens (fãggvÒny, eljËrËs) Òs
unit kulcsszÛ Òs a nÒv (szimbolikus nÒv) Ëll. Az interface kulcsszÛ utËn, de mÒg a fejrÒszben az abszolàt globËlis deklarËciÛk, Òs definÖciÛkat talËljuk. Az itt megadott mennyisÒgek nem csak jelen unitban, hanem mËs programokbÛl is elÒrhetők, amelyek ezt a unitot hasznËljËk. A unit tÞrzsben az implementation kulcsszÛ utËn, de a begin előtt a unit lokËlis mennyisÒgeket adjuk meg. Ezek csak jelen unit belsejÒben ÒrvÒnyesek. A begin Òs az ezt kÞvető utasÖtËsok nem kÞtelezőek. Az itt megÖrt programrÒszek a unit meghÖvËsakor azonnal vÒgrehaj-tËsra kerãlnek, s főkÒnt a unit vËltozÛinak inicializËlËsËra hasznËlatosak. A unit ÞnmagËban nem futtathatÛ, kiprÛbËlËsËra segÒdprogramot kÒszÖtãnk. A unit lÒtrehozËsËnak lÒpÒsei Delphi kÞrnyezetben:
– Delphi: File/New/Unit kivËlasztËs – EditËlËs (a unit megÖrËsa)
– MentÒs lemezre, azonos névvel mint a unit nÒv – FordÖtËs F9 (ellenőrizzãk a kÞnyvtËrat nev.dcu) – File/New/Consol Application kivËlasztËsa
– A főprogram megÖrËsa – Uses unit nev beillesztÒse – Főprogram futtatËsa.
72. ábra: A unit szerkezete
Első pÒldËnkban kÒszÖtãnk small nÒven unitot, amelynek eljËrËsa egy stringet kisbetűsre konvertËl. Unitunk fejrÒsze az alËbbi lesz.
TÞrzsÒbe az alËbbiakat Örjuk.
Most elmentjãk small.pas nÒven, Òs lefordÖtjuk a unitot. Ellenőrizzãk, hogy kÞnyvtËrunkban megjelent a small.dcu file. Jelen fËzisban csak szintaktikai el-lenőrzÒs tÞrtÒnik. Ezek utËn Örjunk programot, amely kÒt kãlÞnbÞző idÒzetre alkalmazza a megÖrt, Òs unitban elhelyezett eljËrËst. A program utasÖtËslistËja a kÞvetkező.
// Unit alkalmazËsa // VÖg Jenő 2009.04.23.
program convert;
uses small in ’small.pas’; // A unit alkalmazËsa
var msg : t_str; // A unit abszolàt globËlis tÖpusËnak hasz//nËlata
begin
str := 'Ali BABA'; // Abszolàt globËlis str vËltozÛ hasznËlata
lower (str); // A unitban megÖrt eljËrËs hÖvËsa
writeln (str); // ali baba
msg := 'LeiLA'; // A program globËlis msg vËltozÛjËnak
//hasznËlata lower(msg);
Programunk futËsi kÒpe az alËbbi.
73. ábra: A unitot használó példaprogram képernyőképe 5.10.3 A vËltozÛk, modulok hatËskÞre
Mielőtt mËsodik mintapÒldËnkra rËtÒrnÒnk ismertetjãk, hogy a unitokat is hasz-nËlÛ elemek mikÒnt hasznËlhatÛk fel. MËsszÛval a lËthatÛsËgukat (visibility) vizsgËljuk. Ezt leginkËbb egy olyan struktàrËn szemlÒltethetjãk, amely kÒt uni-tot is alkalmaz. KÒsőbbi Delphi alkalmazËsainknËl ez gyakori eset lesz.
74. ábra: Az egyes program elemek érvényessége
A legelső, first nevű unitunkban deklarËlt x vËltozÛ mindenãtt lËthatÛ, mÖg y csak a first belsejÒben. A mËsodik, subunit z vËltozÛja a first-ben nem, mËshol lËthatÛ. A prg program w vËltozÛja csak sajËt tÞrzsÒben lËthatÛ. Az elmondot-tak a konstansokra, eljËrËsokra Òs fãggvÒnyekre is ÒrvÒnyesek.
Ezek utËn kÒszÖtsãnk programot, amely szÞgek ËtvËltËsËt (Descartes/PolËr Òs PolËr/Descartes) valÛsÖtja meg. A konvertËlÛ eljËrËsokat unitban helyezzãk el.
CÒlszerű megtervezni programunk szerkezeti felÒpÖtÒsÒt. Ezt az alËbbi Ëbra szemlÒlteti.
75. ábra: A unitok és a program terve Első unitunk utasÖtËs listËja a kÞvetkező.
// Unit_dp_pd
// Vas ÁdËm 2008.11.01.
unit pd_dp;
var x,y,r,fi: single;
procedure print(a,b : single; pddp : boolean); // kiÖratËs interface
procedure print; // Itt nem kell a paramÒter listËt ismÒtelni begin
if pddp then writeln ('x = ', a:8:3,' y = ',b:8:3); // Descartes alak else writeln ('r = ',a:8:3, ' fi = ',b:8:3); // Polar alak end;
end.
Mentsãk (pd_dp.pa), Òs fordÖtsuk le (pd_dp.dcu) unitunkat. MËsodik, konvertË-lÛ unitunk utasÖtËs listËja a kÞvetkező lesz.
// Unit_conv
// Vas ÁdËm 2008.11.01.
unit conv;
interface
uses pd_dp; // Fő Unit
procedure pol_desc(var a,b : single); // PolËr-Descartes procedure desc_pol(var a,b : single); // Descartes-PolËr
implementation
IsmÒt mentÒs (conv.pas)Òs fordÖtËs (conv.dcu)kÞvetkezik, ezutËn a program.
// Unit_prÛba
// Vas ÁdËm 2008.11.01.
program pd_test;
uses pd_dp, conv; // A unitok alkalmazËsa var ch : char; // Program globËlis vËltozÛk a,b : single;
begin repeat
write('Polar-Descartes(P) vagy Descartes-Polar(D) konvertËlËs? ');
readln(ch);
ch:=upcase(ch); // VËlasz nagybetűsre vËltËsa
until ch in [‘P’,’D’]; // Csak P vagy D lehet
write ('r = '); readln(r); // abszolut ÒrtÒk bekÒrÒse write ('fi = '); readln(fi); // szÞg bekÒrÒse fokban
fi := fi*pi / 180; // fokbÛl radiËn
pol_desc (r,fi); // eljËrËs hÖvËsa r Òs fi paramÒterekkel print (r,fi, true); // eredmÒny kiÖrËsa Descartes alakban end
else begin
write (‘x = '); readln (a); // x koordinËta bekÒrÒse a globËlis //vËltozÛba write (‘y = '); readln (b); // y koordinËta bekÒrÒse b globËlis //vËltozÛba desc_pol (a,b); // eljËrËs hÖvËsa a Òs b paramÒterekkel print (a,b, false); // eredmÒny kiÖrËsa PolËr alakban end;
readln;
end.
Programunk futËsi kÒpe mindkÒt esetre az alËbbiakban lËthatÛ.
76. ábra: A Descartes<->polár konvertáló program képernyőképe
Gyakorló feladat
F01. KÒszÖtsãnk unitot, amelyben a tax nevű fãggvÒny egy ËrukÒszlet eladË-sa utËn fizetendő ÁFA Þsszeget (25%) szËmÖtja. A program kÒt kãlÞn-bÞző Ëru kÒszletet olvas be 2 rekord tÖpusà file-bÛl, majd a unit fãggvÒ-nyÒt aktivizËlja, Òs kÒpernyőre Örja a fizetendő ÁFA Þsszegeket.
Ellenőrző kérdések
K01. Mik a unit fő rÒszei?
K02. Mit Òrtãnk abszolàt globËlis vËltozÛ alatt ? 5.11 Külső modulok (DLL)
A unit a szegmentËciÛ egyik eszkÞze. Ez a kãlső szegmens Pascal kÞrnyezet-ben, Pascal nyelven kÒszãl. HasznËlata Pascal, vagy Delphi alkalmazËsokban lehetsÒges. SzËmos alkalmazËs megkÖvËnhatja, hogy olyan kãlső modulokat is hasznËljunk, amelyek nem Pascal nyelven ÖrÛdtak. Erre is van lehetősÒg, ha ezek a modulok DLL (Dinamic Link Library) formËban Ëllnak rendelkezÒsre.
EzeknÒl a moduloknËl – mivel bËrmilyen programnyelvű alkalmazËsba beil-leszthetők – mËr nem ismerjãk a forrËsnyelvű alakot, de erre nincs is szãksÒg.
EzÒrt nevezzãk ezeket dinamikusan becsatolhatÛ moduloknak. HasznËlatukhoz ismernãnk kell a benne lÒvő eljËrËsok hÖvËsi alakjËt Òs paramÒtereit. A DLL a Microsoft fejlesztÒse, hasznËlata Windows Òs OS/2 operËciÛs rendszerek alatt lehetsÒges.
5.11.1 DLL lÒtrehozËsa
Az univerzËlisan felhasznËlhatÛ DLL modult Pascal nyelven is kÒszÖthetãnk.
Ennek mÛdjËt mutatjuk be.
A Delphi kÞrnyezetben a File/New/DLL Wizard kivËlasztËsa utËn a fejlesztő az alËbbi ablakot nyitja meg.
77. ábra: A Delphi DLL projekt ablaka
A DLL modul szerkesztÒsi neve library lesz. Ez az elnevezÒs arra utal, hogy a nyilvËnos kÞnyvtËr rÒsze kÒszãl. A fejrÒsz itt is a deklarËciÛkat tartalmazza.
KÒszÖtsãnk DLL kÞnyvtËri modult, amely 2 egÒszszËm legnagyobb kÞzÞs osz-tÛjËt, Òs legkisebb kÞzÞs tÞbbszÞrÞsÒt szËmÖtÛ fãggvÒnyeket tartalmazza. Az utasÖtËslista a kÞvetkező lesz.
// DLL modul // Kő PËl 2010.05.22.
library dll_mat;
uses SysUtils, Math, Classes; // Standard unitok hasznËlata
{$R *.res} // FordÖtÛ direktÖva
// KÒt szËm legnagyobb kÞzÞs osztÛja function lko( a,b: integer): integer; stdcall;
var n: integer;
begin
n := min (a,b); // A kisebb szËmot adja
while (a mod n > 0) or (b mod n > 0) do dec (n);
result := n; // VisszatÒrÒsi ÒrtÒk
end;
// KÒt szËm legkisebb kÞzÞs tÞbbszÞrÞse function lkt( a,b: integer): integer; stdcall;
var n: integer;
begin
n := max (a,b); // A nagyobb szËmot adja
while (n mod a > 0) or (n mod b > 0) do inc (n);
result := n;
end;
exports lko, lkt; // ExportËlandÛ fãggvÒnyek
end.
Mentsãk el programunkat, majd a Compile/ Build funkciÛ kivËlasztËsËval hoz-zuk lÒtre Òs ellenőrizzãk le a dll_mat.dll kÞnyvtËri modult. EzutËn mËr megÖr-hatjuk programunkat, amely felhasznËlja az elkÒszÖtett modult.
// DLL modul // Kő PËl 2010.05.22.
program dll_alk;
function lko (a,b: integer):integer; stdcall; external 'dll_mat.dll';
function lkt (a,b: integer):integer; stdcall; external 'dll_mat.dll';
var x,y: integer;
begin
writeln (’x = ’); readln (x); // Egyik szËm bekÒrÒse writeln (’y = ’); readln (y); // Egyik szËm bekÒrÒse writeln (’Legnagyobb kÞzÞs osztÛ : ’, lko (x,y) );
writeln (’Legkisebb kÞzÞs tÞbbszÞrÞs : ’, lkt (x,y) );
readln;
end.
LËthatjuk, hogy csak nÒhËny kulcsszÛ szãksÒges a kãlső modulban lÒvő, mËr lefordÖtott fãggvÒny hasznËlatËhoz. A fordÖtÛnak ismernie kell a DLL modul elÒrÒsi àtvonalËt is, ha az nem az aktuËlis kÞnyvtËrban van. Programunk futËsi kÒpe az alËbbi.
78. ábra: A DLL-t használó példaprogram képernyőképe Gyakorló feladat
F01. KÒszÖtsãnk DLL kÞnyvtËri modult, amely kÒt komplex szËm ÞsszegÒt, kãlÞnbsÒgÒt Òs szorzatËt szËmÖtja. Írjunk programot, amely aktivizËlja a megÖrt eljËrËsokat.
Ellenőrző kérdések
K01. Mi a DLL hasznËlatËnak előnye?
K02. Milyen kulcsszÛ hasznËlatos a DLL rutinok kÒszÖtÒsekor?
K03. Hogyan hivatkozunk a programban a kãlső (DLL) rutinokra.
Jelen fejezet cÒlja, hogy kidolgozott pÒldËkkal segÖtsãk a tananyag megÒrtÒsÒt.
Az előadËsokon bemutatott anyagrÒszeket a hallgatÛk a laborban szËmÖtÛgÒpen gyakorolhatjËk Sok Òves tapasztalatunk szerint a rendelkezÒsre ËllÛ idő (heti egy alkalommal) nem elegendő az ÞnËllÛ feladatmegoldÛ kÒpessÒg kialakÖtËsË-hoz. KãlÞnÞsen azok szËmËra okoz nehÒzsÒget a tantËrgy kÞvetelmÒnyeinek teljesÖtÒse, akik előtanulmËnyaik sorËn nem talËlkoztak program nyelvekkel.
PÒldatËrunk szerkezeti felÒpÖtÒse igazodik az elmÒletet tËrgyalÛ fejezetek struk-tàrËjËhoz.