Delphi programozás SRTNB020
Elérhetőség Boszorkány utca 2. B138-as iroda anettn@morpheus.pte.hu Delphi programozás Elérhetőség Boszorkány utca 2. B138-as iroda anettn@morpheus.pte.hu http://morpheus.pte.hu/~anettn
Alkalmazott programok Delphi programozás Alkalmazott programok FreePascal Turbo Delphi 2006 Explorer (full, english) http://cc.codegear.com/free/turbodelphi Borland Delphi 7.0 Megjegyzés: a ppt-ben található színkódok: forráskód általános szintaxisa példaprogram részlet
Delphi programozás Tematika Pascal alapok - tömbkezelés, függvények, eljárások, fájlkezelés Objektum orientált programozás Delphi környezet – formok, unitok, komponensek Alkalmazás fejlesztése – tulajdonságok, események Adatbáziskezelés – SQL, adathozzáférési komponensek, adat-érzékeny vezérlők Internet-, webes-alkalmazások 2D-, 3D-grafika
Ajánlott irodalom [1] Angster Erzsébet : Programozás tankönyv I.- II. Delphi programozás Ajánlott irodalom [1] Angster Erzsébet : Programozás tankönyv I.- II. Akadémia nyomda, Martonvásár, 1999 [2] Baga Edit : Delphi másképp [3] Benkő Tiborné : Programozási feladatok és algoritmusok Delphi rendszerben Computer Books, Budapest, 2002
Ajánlott irodalom [4] Ray Lischner: Delphi kézikönyv Delphi programozás Ajánlott irodalom [4] Ray Lischner: Delphi kézikönyv Kossuth Kiadó, 2001 [6] Paul Kimmel: Delphi 6 fejlesztők kézikönyve Panem Kft. , Budapest, 2002 [5] Dr. Fercsik János : Programozás – Delphi Dunaújvárosi Főiskola - jegyzet, 2001 [6] Marco Cantú : Delphi 7 mesteri szinten I. –II. Kiskapu Kft, 2003
1. ELŐADÁS Bevezetés a programozásba Pascal ismeretek felelevenítése Algoritmikus gondolkodás Programszerkesztés
Számábrázolás A szg. a számokat mindig meghatározott számú számjeggyel ábrázolja Kiegészítve balról a számot nullákkal, a kívánt mennyiségű számjegyből fog állni Bit - az információ legkisebb egysége (kettes számrendszer egy számjegyének felel meg) Byte – 8 bit 1 kB=210 bit = 1024bit Szó - egyszerre feldolgozható bitek száma (pl.: 32 bites processzor) 210 = 0000 00012
Kettes számrendszer - átváltás 10100110112 = =1·29 + 0·28 + 1·27 + 0·26 + 0·25 + 1·24 + + 1·23 + 0·22 + 1·21 + 1·20 = =29 + 27 + 24 + 23 + 21 + 20 = = 512 + 128 + 16 + 8 + 2 + 1 = = 667
A szoftverfejlesztés lépései elemzés – problémaelemzés, helyzetfelmérés, igényfelmérés, célok felállítása, idő és költségbecslés tervezés – adatstruktúrák és algoritmusok kialakítása, ez a legnehezebb, legösszetettebb része a fejlesztésnek kódolás – az elkészült terv implementálása, azaz a forráskód elkészítése adott nyelven tesztelés – próbafuttatások végzése, ilyenkor merülnek fel a felhasználás közbeni problémák, melyeket orvosolni kell; szélsőséges helyzetek vizsgálata dokumentálás – igen fontos része a fejlesztésnek az egyes fázisok pontos leírása, a felhasználói leírás; ez a továbbfejlesztésnél, felhasználásnál játszik fontos szerepet
Keretrendszer - turbo.exe Állományok: Turbo.TPL – turbo pascal library, magasszintű rutinok gyűjteménye Turbo.TPH – help, a súgó állományok találhatók itt (F1) Turbo.TP – a pascal konfigurációs állománya Turbo.DSK – desktop állomány , legutóbb használt képernyő minta *.PAS – pascal forrásprogram *.BAK – biztonsági másolat
A Pascal program szerkezete program nev; {Programfej} uses egysegnev; {Beépített utasítások} var valtozonev:tipus; {Deklarációs rész} {ide kerül a konstans, eljárás, függvény deklaráció is} begin {Végrehajtó rész} programtörzs end.
Változók Egy hely, ami alkalmas egy érték tárolására a számítógép memóriájában Nevet kap - segítségével a későbbiekben a változóban lévő objektumra hivatkozni lehet Érvényességi kör (lokális, globális változók) Tartalom: szám, szöveg, boolean kifejezés, konstans, stb.
Változó típusok – egészek Shortint: -128 - 127, előjeles, 8 bites Integer: -32768 - 32767, előjeles, 16 bites Longint: -2147483648 - 2147483647, előjeles, 32 bites Byte: 0 - 255, előjel nélküli, 8 bites Word: 0 - 65535, előjel nélküli, 16 bites
Változó típusok – valósak Real: -2.9-39- 1.738, 11-12 számjegy, 6 byte-os. Single: -1.5-45- 3.438, 7-8 számjegy, 4 byte-os. Double: -5.0-324- 1.7308, 15-16 számjegy, 8 byte-os. Extended: -3.4-4932- 1.14932, 19-20 számjegy, 10 byte-os. Comp: -9.2-18- 9.218, 19-20 számjegy, 8 byte-os.
Tömb, rekord, típus Tömb: Ugyanolyan típusú változók tárolására szolgáló adathalmaz Rekord: Összetartozó adatokat, de többféle típusú változót tudunk eltárolni benne (például egy személy neve, címe, születési ideje és helye, stb) Pointer: A pointer a memória meghatározott címére mutat Text: Típus nélküli file File of-: Típusos file
Deklaráció - szintaktika Változó var valtozonev1 : tipus; valtozonev2, valtozonev3 : tipus; Tömb nev : array[1..10] of integer; matrix : array[1..10,1..10] of integer; Típusdefniálás type nev = set of elemek felsorolása; Record típus type nev = record a,b,c,d:típus; end; Konstans const konstansvaltozo = ertek;
Iteráció elöl tesztelős ciklus while kifejezes do utasitas; hátul tesztelős ciklus repeat utasitas until feltetel; növekményes ciklus fel for kezdo to veg do utasitas; növekményes ciklus le for kezdo down to veg do utasitas;
Szelekció választás feltételes utasítás case kifejezes of ertek:utasitas; … else utasitas; end; feltételes utasítás if feltetel then utasitas; if feltetel then utasitas else utasitas;
Műveletek maradékos osztás mod egészosztás div és and léptetés balra shl igaz, hamis true, false
Függvények, eljárások Használatuk: Függvények - többször szeretnénk meghívni - máshol is használni szeretnénk - paraméterek adhatók át (lokálisak) - a függvény visszatér egy értékkel Függvények function nev(argumentumok):tipus; Pl.: Abs(numerikus kifejezés); függvény valós vagy egész szám abszolút értékét adja vissza Eljárások procedure nev (argumentumok); Pl.: Arc(X, Y, Kezdőszög, Zárószög, Sugár); eljárás grafikus módban - körcikket rajzol
Függvények adatbevitel Readln[(változóaz.)]; Read[(változóaz.)]; megjelenítés képernyőn Write[(kifejezés)]; Writeln[(kifejezés)]; képernyő pozíció GotoXY(Xpoz, Ypoz); képernyő törlés ClrScr; képernyő sor törlése ClrEol; /crt unit/ véletlen szám (0- h) Radom(h); négyzet Sqr(i); négyzet gyökvonás Sqrt(i); kerekítés Round(i);
Karakterlánc függvények: lánc hossza length(karakterlánc); a lánc egy darabját adja copy(karakterlánc,kezd,darab); részláncot keres pos(részlánc, karakterlánc);
Karakterlánc eljárások törlés delete(karlánc,kezd, darab); beszúrás insert(részlánc,karlánc,pozíció); számot karakterlánccá alakítja str(szám, karakterlánc); karláncot számmá alakítja val(karlánc, szám, kód);
Egyéb a karakterrel visszatérő fv ReadKey; billentyűzet puffert vizsgáló boolean fv KeyPressed; késleltetés delay(ezredmásodperc); zenélés sound(frekvencia);
Fájlkezelés Lépései programozási nyelvtől függetlenek: - fájl megnyitása - adatok írása, olvasása - fájl lezárása Fajtái: - szöveges fájlok - típusos fájlok - típus nélküli fájlok
Szöveges fájlok - Karaktereket tartalmazó sorokból épülnek fel - Lezárása: CR/LF (kocsi vissza/soremelés) (ASCII kódja: 13 és 10) - Szekvenciális elérés és használat - Vagy csak olvasható vagy csak írható
Szöveges fájlok - Használatakor deklarálni kell egy változót, típusa: text var fájl_változó: Text; - A fájlváltozóhoz hozzá kell rendelni a fájlt Assign(fájl_változó, fájl_név); - Ezek után jöhetnek a műveletek
Szöveges fájlok - megnyitás reset(fájl_változó); csak olvasásra nyitja eof függvény true értékkel jelzi, ha a fájl üres. rewrite(fájl_változó); új szövegfájlt hoz létre, vagy felülír egy létezőt append(fájl_változó); létező fájlt nyit meg csak hozzáírásra
Szöveges fájlok –I/O műveletek Írás write(fájl_változó, kifejezéslista); writeln(fájl_változó, kiflista); Olvasás read(fájl_változó, kifejezéslista); readln(fájl_változó, kifejezéslista);
Szöveges fájlok – eof, eoln - Fájl végének ellenőrzése eof(fájl_változó); true: az aktuális pozíció a fájl utolsó eleme után helyezkedik el - Sor végének ellenőrzése eoln(fájl_változó); függvény true értékkel tér vissza, ha az aktuális pozíció az end-of-line (sorvége - CR/LF) jelzőn áll seekeoln(fájl_változó); (true: sor vége) seekeof(fájl_változó); (true:állomány vége) http://www.lib.uni-miskolc.hu/digital/0001/html/delphi5.htm
Fájlkezelés Assignfile hozzárendelés Reset nyitás csak olvasásra Rewrite nyitás írásara, felülírásra Read I/O olvasás Write I/O írás Closefile lezárás
Hibakezelés - I/O műveleteknél fellépő hibák kezelése lehetséges - programrészletet a {$I-} és {$I+} direktívák közé kell helyezni - IOResult függvény visszaadott értékéből következtethetünk a hiba megjelenésére (tároljuk integer változóba!) - IOResult visszatérési értéke: 0, ha a legutolsó I/O művelet sikeres volt run-time hiba kódja, ha sikertelen
Hibakezelés - példa {$I-} Reset(f); {megnyitás} Ior:=IOResult; {változóba mentés} if Ior<>0 then begin WriteLn('A fájl nem létezik!'); Exit; end; {$I+}
Grafika Grafikus képernyő használatához: - GRAPH unit - .BGI fájlok - a TP/BGI könyvtárban található - az általunk használt VGA üzemmódhoz az EGAVGA.BGI fájlra lesz szükség - ez a fájl a videokártya vezérléséhez szükséges alacsonyszintű parancsokat tartalmazza
Grafika DetectGraph(gd,gm); gd a grafikus meghajtó, a monitor típus kódja gm a képernyőfelbontás kódja InitGraph(gd,gm,'c:\tp\bgi'); kapcsolja be a grafikus képernyőt ReadLn; az ábra megjelenítése CloseGraph; a grafikus képernyő bezárása
Grafika SetBkColor(white); beállítja a háttérszínt, majd ezzel a színnel töröljük a képernyőt: ClearDevice; SetColor(red); eljáráshívással a rajz színét állítjuk be SetTextStyle(0,0,2); a megjelenítendő szöveg karaktertípusát, irányát és a nagyítás mértékét
Grafikai függvények putpixel(x,y:integer;szin:word); az (x,y) koordinátájú pontot szin színűre festi getpixel(x,y):word; visszaadja az (x,y) koord. pont színét line(x1,y2,x2,y2); adott színnel és stílussal vonalat húz két pont között setcolor(szin:word); aktuális szín beállítása (16 szín 0-15ig, konstansok) getcolor:szin; értéke 0 és 15 között lehet, visszaadja az aktuális színt setlinestyle(stilus, minta, vastagsag); a húzott vonalak stílusát SolidLn (0,normál), DottedLn (1,pontozott), CenterLn (2,szaggatott), DashedLn (3,szaggatott), UserBitLn (4, a minta-ban definiált mintájú) vastagságát NormWidth (0,1,2), illetve ThickWidth (3)
Grafikai alakzatok rectangle(x1,y1,x2,y2); téglalapot rajzol circle(x,y,radius:integer); kört rajzol x,y középponttal és radius sugárral drawpoly(p:word; var pontok); sokszöget rajzol
Feladatok 1. Számok bekérése, sorrendben való kiíratása 2. Osztás adott pontossággal 3. Maximumelem kiválasztás tömbből 4. Buborékrendezés 5. Lotto – legtöbbször kisorsolt elem 6. Fájlkezelés – a rejtö.txt fájl tartalmát átmásolni egy másik fájlba 7. Menürajzolás 8. Vonal, kör, rúd kirajzoltatása 9. Egy pontba érintkező koncentrikus körök kirajzolása Hf.: 1. Mátrix szorzása (tükrözése) 2. Bekért személyi adatok fájlba mentése 3. Alakzatok kirajzolása bekért paraméterek szerint
Megoldás 1. Számok bekérése, sorrendben való kiíratása if n<30 then begin {sorrend} for i:= 1 to n do for j :=1 to n do if A[i]<A[j] then tmp:=A[i]; A[i]:=A[j]; A[j]:=tmp; end; {kiiratas} if A[i]<>A[i+1] then write(' ' ,A[i], ''); readln; end else end. Program hf1; {szam beolvasasa, sorrenben kiiratasa} uses Crt; var i,j,n,tmp: integer; A : array[1..30] of integer; begin clrscr; {bekeres} for i:=1 to n do A[i]:=0; write('mennyi n erteke?'); readln(n); if n>30 then writeln('tul sok a szam') else for i:=1 to n do write('kerem ezt az ',i,'szamot'); readln(A[i]); end;
Megoldás 2. Osztás adott pontossággal Str(osztando div oszto, t); eredmeny:=eredmeny+t; end; writeln('az eredmeny',eredmeny); { masik} writeln; writeln('kerem az osztot'); readln(szam1); writeln('kerem az osztandot'); readln(szam2); writeln('hany tizedesig'); readln(hanytizedesig); tmp:= szam1 div szam2; write('az eredmeny: ',tmp,','); maradek:=szam1 mod szam2; tmp:= (maradek*10) div szam2; write(tmp); for j:=1 to hanytizedesig do begin maradek:=maradek mod szam2; tmp:=(maradek*10) div szam2; write(maradek); readkey; end. program osztas; uses crt; var eredmeny,t:string; osztando, oszto:longint; pontossag:byte; i:byte; {ciklusvaltozo} szam1,szam2:longint; hanytizedesig,tmp,maradek,j:integer; begin clrscr; writeln('kerem az osztot'); readln(oszto); writeln('kerem az osztandot'); readln(osztando); writeln('hany tizedesig'); readln(pontossag); Str(osztando div oszto, eredmeny); eredmeny:=eredmeny+','; for i:=1 to pontossag do osztando:=10*(osztando mod oszto);
Megoldás 3. Jelszóbekérő PROGRAM CiklusDemo2;{Jelsz˘ beˇr sa} Uses CRT; VAR jelszo,tipp:string; c:char; BEGIN jelszo:='TM'; Repeat tipp:=''; Write('K‚rem a jelsz˘t (Enter=kil‚p‚s): '); repeat c:=Readkey; if c<>#13 then begin Write('*'); tipp:=tipp+c; end; until c=#13; Writeln; Until (tipp=jelszo) or (tipp=''); if tipp=jelszo then Writeln('Bel‚pett!') else Writeln('Nem l‚pett be'); END.
Megoldás 4. Maximumelem kiválasztás tömbből PROGRAM maximumkivalasztas; Uses CRT; CONST n=10; a:array[1..n] of integer=(2,20,2,2,2,-2,5,2,2,2); VAR m,cv:integer; BEGIN clrscr; m:=1; for cv:=2 to n do if a[cv]>a[m] then m:=cv; writeln('a legnagyobb elem helye: ', m, ' erteke', a[m]); readkey; END.
Megoldás 5. Buborékrendezés PROGRAM buborekrendezes; Uses CRT; CONST n=10; a:array[1..n] of integer=(2,20,2,2,2,-2,5,2,-5,2); VAR m,cv,temp:integer; volt:Boolean; {false, true} BEGIN clrscr; repeat volt:=false; for cv:=1 to n-1 do if a[cv]>a[cv+1] then begin temp:=a[cv]; a[cv]:=a[cv+1]; a[cv+1]:=temp; volt:=true; end; until not volt; for cv:=1 to n do write(a[cv]:5); writeln; readkey; END.
Megoldás 6. Lotto – legtöbbször kisorsolt elem program lotto_proceduras; uses crt; CONST N=90; { Huzas:array[1..N] of word=(133,112,156,124,115,131,140,128,117,156, 130,150,151,129,140,124,122,136,136,139, 131,141,140,133,140,125,126,122,156,112, 115,133,125,138,139,131,127,127,111,116, 135,148,135,121,131,133,149,125,145,131, 146,134,124,141,126,144,123,124,126,130, 129,125,107,154,130,143,136,125,146,116, 138,143,135,120,155,134,160,135,129,125, 138,125,129,132,131,152,118,109,116,138);} Huzas:array[1..N] of word= (137,115,161,128,118,133,146,130,118,158, 132,155,156,130,141,125,127,142,136,147, 136,145,146,139,145,127,127,128,160,116, 118,137,133,142,142,134,132,129,113,122, 138,154,137,123,134,138,152,126,147,135, 149,136,127,146,133,151,124,127,133,138, 136,127,107,157,134,149,141,129,149,121, 145,146,141,128,157,140,164,139,135,129, 141,126,133,133,139,155,121,111,121,142); var temp,tmp,osszhuzas:word; i,m,cv,valt,Kevesebbszer,Tobbszor,Atlag:integer; PROCEDURE Huzasszam; var i:integer; Begin tmp:=0; for i:=1 to N do tmp:=tmp+Huzas[i]; writeln('A huzasok szama', tmp div 90); End;
Megoldás 6. – folyt. Fájlkezelés – a rejtö Megoldás 6. – folyt. Fájlkezelés – a rejtö.txt fájl tartalmát átmásolni egy másik fájlba var i:integer; Begin Atlag:= tmp div 90; Kevesebbszer:=0; for i:=1 to N do if Huzas[i]<Atlag then Inc(Kevesebbszer); Tobbszor:= N-Kevesebbszer; writeln('atlagnal kevesebbszer kihuzott: ',Kevesebbszer); writeln('ill. tobbszor kihuzott ',Tobbszor); End; PROCEDURE Maximum; PROCEDURE Atlagszamitas; tmp:=0; for i:=1 to N do if (tmp<Huzas[i]) then begin tmp:=Huzas[i]; valt:=i; end; writeln('a leggyakrabban kihuzott szam:',valt); PROCEDURE Minimum; Procedure maxkereses(var m:integer); {hogy tmp valt honnet induljon} Begin m:=1; for cv:=2 to N do if Huzas[cv]>Huzas[m] then m:=cv; End; maxkereses(m); tmp:=Huzas[m]; for i:=1 to N do if (tmp>Huzas[i]) then begin tmp:=Huzas[i]; valt:=i; end; writeln('a legritkabban kihuzott szam:',valt); BEGIN clrscr; Huzasszam; Atlagszamitas; Maximum; Minimum; readkey; END.
Megoldás 7. Menürajzolás PROGRAM menu_keszites; Uses CRT; VAR m:char; a,b:integer; Begin TextBackGround(Blue); TextColor(Black); clrscr; GotoXY(33,12); write('╔══════════╗'); GotoXY(33,13); write('║ ║ '); GotoXY(33,14); write('╚══════════╝'); a:=0; b:=0; a:=random(21); b:=random(11)+5; if ((a<10) and (b<10)) then begin GotoXY(33,13); write('║',a,' ',b,'║'); end; if ((a>9) and (b>9)) then GotoXY(33,13); write('║',a,' ',b,'║'); readkey; End.
Megoldás 8. Vonal, kör, rúd kirajzoltatása PROGRAM grafik; Uses CRT,GRAPH; VAR videokartya,Grafikusmod:integer; BEGIN videokartya:=Detect; InitGraph(videokartya,Grafikusmod,'C:\tp\bgi'); SetBkColor(9); SetLineStyle(3,3,1); SetFillStyle(HatchFill,1); Bar(300,300,350,350); Line(10,10,200,200); Circle(250,250,20); readkey; CloseGraph; END.
Megoldás 9. Egy pontba érintkező koncentrikus körök kirajzolása program KOROK; uses GRAPH; var gd,gm,i:integer; begin DetectGraph(gd,gm); InitGraph(gd, gm,''); for i:=1 to 10 do begin Circle(200+i*10,200,60+i*10); end; ReadLn; CloseGraph; end.