ír t a: GROFF TAMÁS 0
Típusok, operátorok, kifejezések, műveletek és precedencia Egész típusok shortint
-128..127
1 bájt
smallint
-32768..32767
2 bájt
longint
-2147483648..2147483647
4 bájt
int64
-9223372036854775808..9223372036854775807
8 bájt
integer
smallint, shortint vagy int64
előjeles 2, 4 vagy 8 bájt
byte
0..255
1 bájt
word
0..65535
2 bájt 4 bájt
longword 0..4294967295 qword
0..18446744073709551615
cardinal
word, longword vagy qword Valós típusok
2, 4 vagy 8 bájt
real
single vagy double
4 vagy 8 bájt
single
1.5e-45 .. 3.4e+38
4 bájt
double
5.0e-324 .. 1.7e+308
8 bájt 10 bájt
extended 3.4e-4932 .. 1.1e+4932 63
63
8 bájt
comp
-2 + 1 .. 2
currency
-922337203685477.5808..922337203685477.5807 8 bájt Logikai típusok
-1
Boolean
false..true
1 bájt
ByteBool false..true
1 bájt
WordBool false..true
2 bájt
LongBool false..true
4 bájt Karakteres típusok Típus
Max hossz
char AnsiChar WideChar (WChar) Karaktersorozat típusok ShortString
255
AnsiString
platformfüggő
String
255, illetve platformfüggő
WideString
platformfüggő
PChar
platformfüggő
PAnsiChar
platformfüggő
PWideChar
1 gigabájt
1
A kifejezések operátorok és operandusok sorozatából áll. Az operátoroknak nevezzük a különféle műveleti jeleket, amelyek összekapcsolják a kifejezésben szereplő változókat, konstansokat és függvényhívásokat, tehát az ún. operandusokat. Az operátorok lehetnek egyoperandusú: -a, not b És lehetnek két operandusú: a + b, a and b, a < b Az operátorokat különböző típusú műveletek szerint csoportosíthatjuk: - aritmetikai operátorok - logikai operátorok - bitenkénti logikai operátorok - relációk - string összekapcsolás operátora - halmaz műveleti operátorok - pointer operátor o A @ operátor bármilyen típusú operandus címét jelenti. A például a @ a változó címét jelenti. o A ^ jelet pointer változó esetén lehet használni. A példában a p^ jelenti a pointer által mutatott objektumot. Aritmetikai műveletek -a
előjelváltás
String műveletek a+b
karaktersorozat összefűzése Halmazműveletek
+a
előjel megerősítés
a+b
összeadás
a+b
unió
a-b
kivonás
a*b
metszet
a*b
szorzás
a-b
különbség
a/b
osztás
a in b
a div b
egész osztás
a mod b maradékképzés Logikai műveletek
eleme-e, vizsgálat Relációs műveletek
a=b
egyenlő
a <> b
nem egyenlő
not a
tagadás
a
kisebb mint
a and b
ÉS
a>b
nagyobb mint
a or b
VAGY
a <= b
kisebb vagy egyenlő
a xor b
kizáró VAGY Bitműveletek
a >= b
nagyobb vagy egyenlő Pointer műveletek
not a
tagadás bitenként
@
@a
a and b
ÉS bitenként
^
p^
a or b
VAGY bitenként
a xor b kizáró VAGY bitenként a shl b
biteltolás balra
a shr b
biteltolás jobbra
A precedencia a műveletvégzés elsőbbségi sorrendjét jelenti. Ha több operátorunk van, akkor valamilyen szabály alapján el kell dönteni, melyik műveletet hajtjuk végre először. 1. Ha két különböző precedenciájú operátor között van az operandus, akkor a magasabb precedenciájú operátorhoz tartozik, tehát először az a művelet kerül végrehajtásra. 2. Ha két azonos precedenciájú operátor között van az operandus, akkor a tőle balra álló operátorhoz tartozik és az a művelet kerül végrehajtásra. 3. Ha a művelet zárójelezve van, akkor a zárójelben lévő műveletek kiértékelésének van elsőbbsége. Művelet not, -, +, ^, @
Precedencia első, legmagasabb
*, /, div, mod, and, shl, shr második +, -, or, xor =, <>, <, >, <=, >=, in
harmadik negyedik, legalacsonyabb
2
Színjelöléseim megjegyzés string változó konstans egyéb
Kiíratás Kiíratás DOS-os ablakban, ékezetes karaktereket akkor tudok használni, ha a forráskódnál nyomok egy jobb egérgombot, majd File Settings>Encoding>CP852 //lehet megjegyzéseket írni a forráskódba így, mint ez program kiir; //a program nevének megadása //az utasítások után ; áll uses //unitok megadása, amiben függvények és eljárások találhatóak crt; //a readkey-hez kell begin //a törzsrész eleje write('Ez egy részt'); //kiírás sortörés nélkül //a kiírandó szöveget aposztróf (' ') közé tesszük writeln(' ír ki.'); //kiírás sortöréssel write('Kilépéshez nyomj meg egy billentyűt!'); readkey; //egy billentyű lenyomásáig nem lép ki end. //a törzsrész vége, csak itt van pont az end után
Beolvasás Beolvasás DOS-os ablakban program beolvas; uses crt; var //változók deklarálása s:string; //egy string (karaktersor) létrehozása s néven //deklarálásnál : -ot használunk, értékadásnál := -t begin write('Írj be egy szót: '); readln(s); //a begépelt karakter(ek) beolvasása az s változóba write('A beírt szó: '); writeln(s); //kiírom a begépelt karaktereket //a változót nem tesszük aposztróf (' ') közzé write('Kilépéshez nyomj meg egy billentyűt!'); readkey; end.
3
Alapműveletek Két szám összege, különbsége, szorzata és hányadosa DOS-os ablakban. Kerekítés alkalmazása a hányadosnál. Div és mod használata. Egyéb változó típusok használata. program muveletek; uses crt; var s:string; szam1:integer; //az első szám szam2:integer; //a második szám osszeg:integer; //az integer egész típus, mint a Z halmaz kulonbseg:integer; szorzat:longint; //olyan, mint az integer, csak nagyobb méretű hanyados:real; //valós típus kerekit:real; egesz:integer; maradek:integer; //olyan típus, ami a pozitív egészeket és a 0-át tartalmazza, mint az N halmaz begin write('Add meg az első számot: '); readln(szam1); write('Add meg a második számot: '); readln(szam2); //megvan a két szám, amivel dolgozni fogunk osszeg:=szam1+szam2; //a két szám összegének kiszámolása //a := az értékadást jelöli kulonbseg:=szam1-szam2; //a két szám különbségének kiszámolása szorzat:=szam1*szam2; //a két szám szorzatának kiszámolása hanyados:=szam1/szam2; //a két szám hányadosának kiszámolása egesz:=szam1 div szam2; //a div a hányados egész részét veszi maradek:=szam1 mod szam2; //a mod a hányados maradékát veszi kerekit:=round(hanyados*100)/100; //kerekíti a hányadost write('A két szám összege: '); writeln(osszeg); write('A két szám különbsége: '); writeln(kulonbseg); write('A két szám szorzata: '); writeln(szorzat); write('A két szám hányados századra kerekítve: '); writeln(kerekit:0:2); write('A két szám hányadosának egész része: '); writeln(egesz); write('A két szám hányadosának maradéka: '); writeln(maradek); writeln; //sor kihagyás write('Kilépéshez nyomj meg egy billentyűt!'); readkey; end.
4
if…else… használata Az if egy elágazás a program futtásában. A begin … end; egy blokkot alkot, azért használjuk, mert a program egyszerre egy utasítást képes végrehajtani, ez a több utasításból egy blokkot alkot, amit a program egyszerre végre tud hajtani.
Formája:
if (feltétel) then utasítás1 else utasítás2;
program hasz_if; uses crt; var s:string; szam:byte; begin write('Válaszon! 1 vagy 2? '); readln(s); szam:=0; if s='1' then szam:=1 else if s='2' then //egymásba ágazott if elágazás szam:=2; if (szam in [1,2]) then //benne van-e a halmazban? begin //ez a begin a blokk eleje if szam=1 then writeln('A beírt szám: egy') else writeln('A beírt szám: kettő'); end //ez az end a blokk vége else begin //ez egy másik blokk eleje if s='' then writeln('Nem írtál be semmit.') else writeln('Hülye vagy! 1 vagy 2 a kérdés, akkor ne írjál '+s+'-t!'); end; //ez meg a vége writeln; write('Kilépéshez nyomj meg egy billentyűt!'); readkey; end.
5
case_of használata A case_of egy többirányú elágazás.
Formája:
program caseof; uses crt; var nap:string;
case változó of érték1: utasítás1; érték2: utasítás2; érték3: utasítás3; értékN: utasításN; else: utasítás+; end;
begin write('Add meg a mai napot!(hétfő...vasárnap) '); readln(nap); case nap of 'hétfő':writeln('Hétfő van.'); 'kedd':writeln('Kedd van.'); 'szerda':writeln('Szerda van.'); 'csütörtök':writeln('Csütörtök van.'); 'péntek':writeln('Péntek van.'); 'szombat':writeln('Szombat van.'); 'vasárnap':writeln('Vasárnap van.'); else writeln('Hülye vagy!'); end; writeln; write('Kilépéshez nyomj meg egy billentyűt!'); readkey; end.
for ciklus Akkor használjuk, ha tudjuk, hogy hányszor kell lefutnia. program ciklus_for; uses crt; var i:byte; //ez ciklusváltozó lesz begin for i:=1 to 10 do //ez 1-től 10-ig(vagyis 10x) végrehajtja a ciklusmagot writeln(i); //ez a ciklus mag: az utasítás, amit a ciklus futtat, sokszor blokkot alkalmazunk writeln; //ez egy sorkihagyás for i:=10 downto 1 do //ez 10-től 1-ig (szintén 10x) végrehajtja a ciklusmagot writeln(i); //ez és az előbbi ciklusban lévő utasítás is kiírja az i értékét writeln; write('Kilépéshez nyomj meg egy billentyűt!'); readkey; end.
6
while ciklus Ez egy elől tesztelő ciklus: megvizsgálja a feltételt, és ha igaz, akkor végrehajtja a ciklusmagot. program ciklus_while; uses crt; var szam:byte; begin szam:=1; while (szam mod 13<>0) do //ciklusfej a feltétellel begin writeln(szam); inc(szam); //a szam értéke 1-el nő end; writeln; write('Kilépéshez nyomj meg egy billentyűt!'); readkey; end.
Repeat ciklus Ez egy hátul tesztelő ciklus: addig hajtja végre a ciklusmagot, amíg a feltétel igaz nem lesz. program ciklus_repeat; uses crt; var szam:byte; ok:boolean; //ez egy logikai típus; vagy igaz (true), vagy hamis (false) az értéke begin randomize; //ez a parancs bekapcsolja a randomizálást ok:=false; //az ok értékét hamisra állítjuk repeat //ciklusfej szam:=random(5); //random(5) - 0,1,2,3 vagy 4 lehet az értéke writeln(szam); if (szam=2) and (ok=false) then //elágazás 2 feltétellel, akkor lép bele, ha mind a 2 igaz begin ok:=true; szam:=szam+1; end; until (ok=true) and (szam=2); //ciklusláb:until és utánna a feltétel writeln; write('Kilépéshez nyomj meg egy billentyűt!'); readkey; end.
7
Egy dimenziós tömb használata program tomb; uses crt; var i:byte; tomb:array[1..20] of byte; //tömb deklarálása így történik begin randomize; for i:=1 to 20 do //a tömb elemeinek értéket adok a ciklus használatával (elejétől-végéig) tomb[i]:=random(100); for i:=20 downto 1 do //visszafelé írom ki a tömb elemeit (végétől-elejéig) writeln(tomb[i]); writeln; write('Kilépéshez nyomj meg egy billentyűt!'); readkey; end.
Kilépés csak ENTER gombbal program kilep; uses crt; var kod:word; //olyan, mint a byte, csak nagyobb méretű, ez kilépéshez fog kelleni begin writeln('Hello! Most kikéne lépned!'); write('Kilépés <ENTER> gombbal történhet!'); //writeln(ord(readkey)); — paranccsal lehet kiíratni a billentyű gombjával bevitt kódot repeat kod:=ord(readkey); //így lehet a lenyomott billentyű kódját a kod változóba tenni until kod=13; //addig ismétli, amíg a kód nem az ENTER (13) kódja end.
8
gombok kódtáblája 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z á é í ó ö ő ú ü ű * +
48 49 50 51 52 53 54 55 56 57 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 160 130 161 162 148 139 163 129 251 42 43
egy gombbal , . /
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 ESC ENTER TAB SPACE BACKSPACE DELETE HOME END INSERT PAGE UP PAGE DOWN WINDOWS L SHIFT R SHIFT L CTRL R CTRL L ALT R ALT CAPS LOCK NUM LOCK PRINT SCREEN PAUSE BREAK
44 45 46 53 72 80 75 77 59 60 61 62 63 64 65 66 67 68 133 134 27 13 9 32 8 83 71 79 82 73 81 91
Shift+gomb A 65 B 66 C 67 D 68 E 69 F 70 G 71 H 72 I 73 J 74 K 75 L 76 M 77 N 78 O 79 P 80 Q 81 R 82 S 83 T 84 U 85 V 86 W 87 X 88 Y 89 Z 90 Á 181 É 144 Í 214 Ó 224 Ö 153 Ő 138 Ú 233 Ü 154 Ű 235 ( 40 ) 41 ? 63 ! 33 = 61 % 37 : 58 „” 34 ’ 39 _ 95 § 245
Alt+gomb ; 59 [ 91 ] 93 { 123 } 125 < 60 > 62 @ 64 # 35 & 38 × 158 ÷ 246 ° 124 ~ 126 $ 36 € 63 ß 225 ¤ 207 ^ 122 — 74 | 124 \ 92 ˘ 123 ˇ 121 ` 96 ´ 128 ˝ 129 ˙ 127 ¨ 130 ˛ 125 ¸ 131 ä 132 Ä 142 đ 208 Đ 209 ł 136 Ł 157 ™ 20 ® 19
9
Összegzés, eldöntés és kiválasztás tétele program tetelek; uses crt, sysutils; //a konvertáláshoz kell const N=20; //konstans létrehozása, az N értéke nem változtatható var kod:word; i:byte; tomb:array[1..N] of byte; van:boolean; sorszam:byte; procedure feltolt; //ez egy eljárás, amire feltolt névvel hivatkozhatok begin for i:=1 to N do tomb[i]:=random(20)+1; //1-től 20-ig end; procedure kiir; //ez egy másik eljárás, amire kiir névvel hivatkozhatok begin for i:=1 to N do begin write(tomb[i]); //kiírom a tömb elemeit write(' '); //szóközzel vannak elválasztva end; writeln; //lépjen a következő sorba end; procedure osszegzes; //az összegzés tétele //Adott egy számsorozat. Számoljuk ki az elemek összegét. var //ez egy lokális változó deklarálása, a másik (i,kod,tomb) a globális változók osszegez:word; begin osszegez:=0; for i:=1 to N do osszegez:=osszegez+tomb[i]; //összeadom a tömb elemeit writeln('A tömb elemeinek összege: '+inttostr(osszegez)); //az inttostr egy konvertáló, ami számból csinál karaktersort //a + használatával összefűzhetem a karaktersorokat 1 karaktersorrá end; procedure eldontes; //az eldöntés tétele //Annak eldöntése, hogy van-e a sorozatban legalább egy "T" tulajdonsággal rendelkező elem. begin i:=0; van:=false; repeat i:=i+1; if tomb[i] mod 7 = 0 then //a "T" tulajdonság:Van-e 7-el osztható szám a tömbben? van:=true; //van "T" tulajdonságú elem until (i=N) or (van=true); end;
10
procedure kivalasztas; //a kiválasztás tétele //A tömb első "T" tulajdonsággal rendelkező elemének a sorszámának meghatározása. begin i:=0; van:=false; repeat i:=i+1; if tomb[i] mod 7 = 0 then begin van:=true; sorszam:=i; //ez a sorszámú elem osztható 7-tel end; until van=true; end; begin randomize; repeat feltolt; //így hivatkozhatok az eljárásra eldontes; until van=true; kiir; writeln; //egy sor kihagyása a két rész között osszegzes; kivalasztas; //ha kiakarom íratni, akkor így tehetem: writeln('A tömb '+inttostr(sorszam)+'. eleme osztható 7-tel. Ez a szám a '+inttostr(tomb[sorszam])+'.'); writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Lineáris keresés, megszámlálás, kiválogatás, maximum-kiválasztás és minimum-kiválasztás tétele program tetelek2; uses crt, sysutils; const N=10; var kod:word; i:byte; tomb:array[1..N] of byte; van:boolean; sorszam:byte; db:byte; //valamiből mennyi van indexek:array[1..N] of byte; //a kiválogatás tételéhez; nem tudjuk, hogy hány eleme lesz, de N-től nem több procedure feltolt; begin for i:=1 to N do tomb[i]:=random(20)+1; end;
11
procedure kiir; begin for i:=1 to N do begin write(tomb[i]); write(' '); end; writeln; end; procedure lin_kereses; //a lineáris keresés tétele rendezetlen tömbben //Eldönti, hogy van-e "T" tulajdonságú elem a tömbben, és kiírja a sorszámát, vagy hogy nincs olyan. begin i:=0; van:=false; repeat i:=i+1; if tomb[i] mod 3 = 0 then van:=true; until (van=true) or (i=N); if van=true then begin sorszam:=i; writeln('A(z) '+inttostr(sorszam)+'. elem osztható 3-mal.'); end else writeln('Nincs 3-mal osztható szám a tömbben.'); end; procedure megszamlalas; //a megszámlálás tétele begin db:=0; for i:=1 to N do if tomb[i] mod 3 = 0 then db:=db+1; writeln(inttostr(db)+' db 3-mal osztható szám van a tömbben.'); end; procedure maximum; //a maximum-kiválasztás tétele //a tömb legnagyobb elemét (értékét) keressük var max:byte; //a tömb legnagyobb eleme begin max:=tomb[1]; for i:=1 to N do if max
tomb[i] then min:=i; writeln('A tömb '+inttostr(min)+'. eleme a legkisebb, aminek az értéke: '+inttostr(tomb[min])); end;
12
procedure kivalogat; //a kiválogatás tétele //az összes "T" tulajdonságú elem indexét tároljuk az indexek[] vektorban begin db:=0; for i:=1 to N do if tomb[i] mod 3 = 0 then begin db:=db+1; indexek[db]:=i; //a sorszámot tároljuk end; end; begin randomize; feltolt; kiir; writeln; lin_kereses; writeln; megszamlalas; writeln; kivalogat; //ha kiakarom íratni, akkor így tehetem: write('A 3-mal osztható elemek: '); for i:=1 to db do write(inttostr(tomb[indexek[i]])+' '); writeln; writeln; maximum; writeln; minimum; writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Metszetképzés és unióképzés tétele program tetelek3; uses crt, sysutils; const N=20; M=15; var kod:word; i:byte; j:byte; //ez egy másik ciklusváltozó A:array[1..N] of byte; B:array[1..M] of byte; metszet:array[1..M] of byte; //metszetnél a kisebb halmaz elemszámával egyenlő elemű unio:array[1..N+M] of byte; //uniónál a két halmaz elemszámának összegével egyenlő elemű db_m:byte; //metszet elemszáma db_u:byte; //unió elemszáma rossz:boolean; //feltöltéshez
13
procedure nullaz; begin for i:=1 to M do metszet[i]:=0; for i:=1 to N+M do unio[i]:=0; end; procedure feltolt; //úgy töltöm fel a tömböt, hogy ne legyen azonos elem begin A[1]:=random(50)+1; for i:=2 to N do repeat rossz:=false; A[i]:=random(50)+1; for j:=1 to i-1 do if A[i]=A[j] then rossz:=true; until rossz=false; B[1]:=random(50)+1; for i:=2 to M do repeat rossz:=false; B[i]:=random(50)+1; for j:=1 to i-1 do if B[i]=B[j] then rossz:=true; until rossz=false; end; procedure kiir; begin write('A[]: '); for i:=1 to N do begin write(A[i]); write(' '); end; writeln; write('B[]: '); for i:=1 to M do begin write(B[i]); write(' '); end; writeln; end; procedure metszet_t; //a metszetképzés tétele //Két halmaz metszetébe azok az elemek tartoznak, amelyek mindkettőben szerepelnek. begin db_m:=0; for i:=1 to N do //az A[] elemei begin j:=1; while (j<=M) and (A[i]<>B[j]) do inc(j); //a B[] elemei if j<=M then //ha volt egyező elem begin inc(db_m); metszet[db_m]:=A[i]; //beletesszük a C[] vektorba end; end; end;
14
procedure unio_t; //az unióképzés tétele //Két halmaz egyesítésében azok az elemek tartoznak, amelyek legalább az egyikben szerepelnek. begin for i:=1 to N do unio[i]:=A[i]; //először az A[] elemeit beletesszük az unio[]-ba db_u:=N; for j:=1 to M do begin i:=1; while (i<=N) and (A[i]<>B[j]) do inc(i); if i>N then //ha nincs közös elem, begin inc(db_u); unio[db_u]:=B[j]; //akkor belerakjuk az elemet unio[]-ba end; end; end; begin randomize; nullaz; feltolt; kiir; writeln; metszet_t; unio_t; writeln('A két halmaz metszete: '); for i:=1 to db_m do //kiírom a két halmaz metszetét write(inttostr(metszet[i])+' '); writeln; writeln('A két halmaz uniója: '); for i:=1 to db_u do //kiírom a két halmaz unióját write(inttostr(unio[i])+' '); writeln; writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Minimum kiválasztásos, maximum kiválasztásos, buborék és beszúrásos rendezés program tetelek4; uses crt, sysutils; const N=10; var kod:word; i:byte; j:byte; tomb:array[1..N] of byte; tomb2:array[1..N] of byte; //ez a tömb rendezéshez kell min:byte; //kisebb elem max:byte; //nagyobb elem csere:byte; //rendezéseknél használom rossz:boolean;
15
procedure feltolt; //úgy töltöm fel a tömböt, hogy ne legyen azonos elem begin tomb[1]:=random(30)+1; for i:=2 to N do repeat rossz:=false; tomb[i]:=random(30)+1; for j:=1 to i-1 do if tomb[i]=tomb[j] then rossz:=true; until rossz=false; end; procedure kiir; begin write('A tömb elemei: '); for i:=1 to N do begin write(tomb[i]); write(' '); end; writeln; end; procedure rendez_min; //minimum kiválasztásos rendezés tétele begin tomb2:=tomb; //1..N-ig átadom az elemeket a másik halmaznak for i:=1 to N-1 do begin min:=i; for j:=i+1 to N do if tomb2[j]min then begin csere:=tomb2[i]; tomb2[i]:=tomb2[min]; tomb2[min]:=csere; end; end; writeln('A tömb minimum kiválasztással rendezve:'); for i:=1 to N do write(inttostr(tomb2[i])+' '); writeln; end;
16
procedure rendez_max; //maximum kiválasztásos rendezés tétele begin tomb2:=tomb; for i:=1 to N-1 do begin max:=i; for j:=i+1 to N do if tomb2[j]>tomb2[max] then max:=j; if i<>max then begin csere:=tomb2[i]; tomb2[i]:=tomb2[max]; tomb2[max]:=csere; end; end; writeln('A tömb maximum kiválasztással rendezve:'); for i:=1 to N do write(inttostr(tomb2[i])+' '); writeln; end; procedure rendez_buborek; //buborékos rendezés tétele // minden szomszédos elempárt megvizsgál, és a nagyobbat helyezi hátrébb, így a legnagyobb lesz hátul és az egyre kisebbek előrébb; a maradék elemek legnagyobbika úgy halad át a tömbön, mint egy buborék, innen kapta a nevét begin tomb2:=tomb; for i:=1 to N-1 do for j:=1 to N-1 do if tomb2[j]>tomb2[j+1] then begin csere:=tomb2[j]; tomb2[j]:=tomb2[j+1]; tomb2[j+1]:=csere; end; writeln('A tömb buborékosan rendezve:'); for i:=1 to N do write(inttostr(tomb2[i])+' '); writeln; end; procedure rendez_beszuras; //beszúrásos rendezés tétele //a tömb elemeit úgy adom át a másik tömbnek, hogy azt közben rendezem („2 in 1”) begin tomb2[1]:=tomb[1]; for i:=2 to N do begin tomb2[i]:=tomb[i]; if tomb2[i]
17
begin randomize; feltolt; kiir; writeln; rendez_max; rendez_min; rendez_buborek; rendez_beszuras; writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Lineáris és logaritmikus keresések program tetelek4; uses crt, sysutils; const N=10; var kod:word; i:byte; j:byte; tomb:array[1..N] of byte; tomb2:array[1..N] of byte; s:string; //beolvasáshoz azonos:boolean; //lehet-e azonos? rossz:boolean; csere:byte; keres:byte; //keresett érték elso:byte; //log_kereshez utolso:byte; //log_kereshez kozepso:byte; //log_kereshez van:boolean; //van-e keresett érték? procedure feltolt; begin if azonos=false then //ha nem lehet azonos elem begin tomb[1]:=random(30)+1; for i:=2 to N do repeat rossz:=false; tomb[i]:=random(30)+1; for j:=1 to i-1 do if tomb[i]=tomb[j] then rossz:=true; until rossz=false; end else //ha lehet azonos elem begin for i:=1 to N do tomb[i]:=random(30)+1; end; end;
18
procedure kiir; begin write('A tömb elemei: '); for i:=1 to N do begin write(tomb[i]); write(' '); end; writeln; end; procedure rendez_beszuras; begin tomb2[1]:=tomb[1]; for i:=2 to N do begin tomb2[i]:=tomb[i]; if tomb2[i]
19
procedure log_keres; //a logaritmikus keresés tétele, ahol nem lehet azonos elem //N elemű növekvő sorrendbe rendezett sorozatban keressük a keres elemet (0 vagy 1 lehet) begin elso:=1; utolso:=N; van:=false; while (elso<=utolso) and (van=false) do begin kozepso:=(elso+utolso) div 2; if keres=tomb2[kozepso] then van:=true else if keres
procedure lin_keres_r2; //lineáris keresés rendezett tömbben, ahol lehet azonos elem //N elemű növekvő sorrendbe rendezett sorozatban keressük a keres elemet (akár N-szer is lehet) begin i:=1; while (i<=N) and (tomb2[i]
20
procedure log_keres2; //a logaritmikus keresés tétele, ahol lehet azonos elem //N elemű növekvő sorrendbe rendezett sorozatban keressük a keres elemet (akár N-szer is lehet) begin elso:=1; utolso:=N; van:=false; while (elso<=utolso) and (van=false) do begin kozepso:=(elso+utolso) div 2; if keres=tomb2[kozepso] then van:=true else if keres
21
begin randomize; repeat write('Lehet azonos érték? (nem v. igen) '); readln(s); until (s='nem') or (s='igen'); if s='nem' then azonos:=false else azonos:=true; writeln; feltolt; kiir; writeln; rendez_beszuras; writeln; write('Adja meg a keresett értéket: '); readln(keres); //ha nem 0-255-ig lévő egész számot írnak be, lefagy, vagy nem jól működik if azonos=false then begin lin_keres_r; log_keres; end else begin lin_keres_r2; log_keres2; end; writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Az összefuttatás tétele program tetelek5; uses crt, sysutils; const N=15; M=10; var kod:word; i:byte; j:byte; s:string; azonos:boolean; rossz:boolean; kozos:byte; //a közös halmaz (C[]) indexe, megadja, hogy hány közös elem van kozos2:byte; //segédváltozó a közös halmazhoz A:array[1..N] of byte; B:array[1..M] of byte; C:array[1..N+M] of byte; //az összefuttatott halmaz seged:array[1..N] of byte; //a halmazok rendezéséhez seged2:array[1..N+M] of byte; //az azonos értéket tartalmazó összefuttatott halmazhoz csere:byte; //a rendezésekhez
22
procedure feltolt; begin if azonos=false then begin A[1]:=random(40)+1; for i:=2 to N do repeat rossz:=false; A[i]:=random(40)+1; for j:=1 to i-1 do if A[i]=A[j] then rossz:=true; until rossz=false; B[1]:=random(40)+1; for i:=2 to N do repeat rossz:=false; B[i]:=random(40)+1; for j:=1 to i-1 do if B[i]=B[j] then rossz:=true; until rossz=false; end else begin for i:=1 to N do A[i]:=random(30)+1; for i:=1 to M do B[i]:=random(30)+1; end; end; {megjegyzéseket így is lehet írni, mint ez, tehát { } zárójelek közzé, ez több soros is lehet, az a lényeg, hogy a { zárójelnél kezdődik, és a } zárójelnél van vége a megjegyzésnek} procedure kiir; begin write('A[] elemei: '); for i:=1 to N do write(inttostr(A[i])+' '); writeln; write('B[] elemei: '); for i:=1 to M do write(inttostr(B[i])+' '); writeln; end;
23
procedure rendez_beszuras; begin seged[1]:=A[1]; //az A[] rendezése for i:=2 to N do begin seged[i]:=A[i]; if seged[i]<seged[i-1] then begin csere:=seged[i]; j:=i; repeat inc(j,-1); seged[j+1]:=seged[j] until (seged[j-1]<=csere) or (j<1); seged[j]:=csere; end; end; A:=seged; seged[1]:=B[1]; //az B[] rendezése for i:=2 to M do begin seged[i]:=B[i]; if seged[i]<seged[i-1] then begin csere:=seged[i]; j:=i; repeat inc(j,-1); seged[j+1]:=seged[j] until (seged[j-1]<=csere) or (j<1); seged[j]:=csere; end; end; for i:=1 to M do B[i]:=seged[i]; end; procedure osszefuttat; //az összefuttatás tétele //két rendezett tömb egyesítése úgy, hogy az eredmény is rendezett legyen begin i:=1; j:=1; kozos:=0; repeat if A[i]B[j] then begin inc(kozos); C[kozos]:=B[j]; inc(j); end else begin inc(kozos); C[kozos]:=A[i]; inc(i); inc(j); end; until (i>N) or (j>M);
24
while i<=N do begin inc(kozos); C[kozos]:=A[i]; inc(i); end; while j<=M do begin inc(kozos); C[kozos]:=B[j]; inc(j); end; if azonos=true then //az azonos elemek kiszűrése a közös tömbből begin kozos2:=kozos; kozos:=1; seged2[kozos]:=C[kozos]; //az első biztos jó for i:=2 to kozos2 do begin rossz:=false; for j:=1 to i-1 do if seged2[j]=C[i] then rossz:=true; if rossz=false then begin inc(kozos); seged2[kozos]:=C[i]; end; end; for i:=1 to kozos do //visszaadom a közös elemeket a C[]-ba C[i]:=seged2[i]; end; end; begin randomize; repeat write('Lehet azonos érték? (nem v. igen) '); readln(s); until (s='nem') or (s='igen'); if s='nem' then azonos:=false else azonos:=true; writeln; feltolt; rendez_beszuras; kiir; osszefuttat; write('A közös halmaz: '); for i:=1 to kozos do write(inttostr(C[i])+' '); writeln; writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
25
Két dimenziós tömb (mátrix) használata program matrix; uses crt, sysutils; var i:byte; j:byte; kod:word; tomb:array[1..5,1..5] of byte; //ez egy 5x5-ös mátrix (táblázat) procedure feltolt; //a mátrixot így járjuk be begin for i:=1 to 5 do //ez a sor for j:=1 to 5 do //ez az oszlop tomb[i,j]:=random(10); end; procedure kiir; begin for i:=1 to 5 do begin for j:=1 to 5 do begin write(tomb[i,j]); //kiírom a mátrix elemeit write(' '); //szóközzel vannak elválasztva end; writeln; //a sorokat (i) külön sorba írom end; end; procedure sorok; var osszegez:byte; //ez egy lokális változó, csak ebben az eljárásban tudom használni begin for i:=1 to 5 do begin osszegez:=0; for j:=1 to 5 do osszegez:=osszegez+tomb[i,j]; //összeadom a sor elemeit writeln('Az '+inttostr(i)+'. sor összege: '+inttostr(osszegez)); end; end; begin randomize; feltolt; kiir; writeln; sorok; writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
26
Rekord létrehozása és használata program rekord; uses crt, sysutils; type tan=record //ez a típus deklaráció vezn:string[30]; //30 karakterű string kern:string[30]; jegy:array[1..5] of byte; //az év végi bizonyítványban melyik jegyből mennyi van atlag:real; end; const N=5; //5 tanuló adatait tartjuk nyilván var i:byte; j:byte; kod:word; tanulok:array[1..N] of tan; //ez egy rekord (tan) típusú tömb jegyek:byte; //hány tantárgya van a tanulónak, randomszám miatt akármennyi lehet osszeg:byte; //jegyek értékeinek az összege procedure feltolt; //ez egy szabadkézi feltöltés lesz most begin tanulok[1].vezn:='Szabó'; //így adunk értéket egy rekord típusú tömbnek tanulok[1].kern:='Attila'; tanulok[2].vezn:='Tóth'; tanulok[2].kern:='Ferenc'; tanulok[3].vezn:='Kis'; tanulok[3].kern:='Tibor'; tanulok[4].vezn:='Kiss'; tanulok[4].kern:='Anikó'; tanulok[5].vezn:='Tóth'; tanulok[5].kern:='Kinga'; for i:=1 to N do begin tanulok[i].jegy[1]:=random(3); //1-es lehet:0,1 vagy 2 db tanulok[i].jegy[2]:=random(5); //2-es lehet:0,1,2,3 vagy 4 db tanulok[i].jegy[3]:=random(4)+1; //3-as lehet:1,2,3 vagy 4 db tanulok[i].jegy[4]:=random(5)+1; //4-es lehet:1,2,3,4 vagy 5 db tanulok[i].jegy[5]:=random(3); //5-ös lehet:0,1 vagy 2 db end; end; procedure kiir; //kiírom az 5 tanuló adatait begin for i:=1 to N do //5 tanuló van begin write(tanulok[i].vezn+' '+tanulok[i].kern+' '); //vezetéknév és keresztnév kiírása for j:=1 to 5 do //5 jegy van write(inttostr(tanulok[i].jegy[j])+' '); //jegyek kiírása writeln; //külön sorba írom a tanulók adatait end; end;
27
procedure atlag_sz; //évvégi átlag számítása begin for i:=1 to N do begin jegyek:=0; osszeg:=0; for j:=1 to 5 do begin jegyek:=jegyek+tanulok[i].jegy[j]; osszeg:=osszeg+tanulok[i].jegy[j]*j; //3db 2-es = 3*2=6 end; tanulok[i].atlag:=round((osszeg/jegyek)*100)/100; //századra kerekítés end; end; procedure ki_atlag; //az átlagok kiírása begin for i:=1 to N do begin write(tanulok[i].vezn+' '+tanulok[i].kern+' átlaga: '); writeln(tanulok[i].atlag:3:2); //formája: 3.22 end; end; begin randomize; feltolt; kiir; writeln; atlag_sz; ki_atlag; writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Formázott kiíratás program formaz_kiir; uses crt, sysutils; var i:byte; sor:byte; //hanyadik sorba járunk s:string; ok:array[1..3] of boolean; //1-255-ig akarok bekérni, az maximum 3 karakter rossz:boolean; seged:word; X:byte; Y:byte; osztas:real; //X/Y osztas2:real; //Y/X kod:word;
28
procedure irkal; //kiírok pár színt begin writeln('kék piros zöld sárga'); //alapszínnel (szürke) írom ki inc(sor); textcolor(blue); //a szövegszínt kékre állítom write('kék '); textcolor(red); //a szövegszínt pirosra állítom write('piros '); textcolor(green); //a szövegszínt zöldre állítom write('zöld '); textcolor(yellow); //a szövegszínt citromsárgára állítom write('sárga '); writeln; inc(sor); end; procedure irkal2; //gotoxy használata begin gotoxy(5,sor); //a gotoxy a kurzort az xy koordinátára helyezi //az első érték az oszlop (X tengely), a második a sor (Y tengely) writeln('piros színű és beljebb kezdődik'); writeln('ez egy másik sor'); //a következő sorba lépek inc(sor,+2); //két sorral vagyok lejjebb textcolor(red); //átváltók piros színre gotoxy(5,sor-2); //visszaugrok a piros szöveghez write('piros'); //kicseréli az ott lévő karaktereket, a piros szót átírom píros színűvel gotoxy(1,sor); //itt jártam korábban textcolor(white); //visszaváltók fehérre writeln(inttostr(sor)+'. sorban járok MOST'); end; procedure irkal3; //valós számok kiírása begin writeln(X:5); //három karakternyi helyre írom ki, jobbra rendezi a számot writeln(Y:-5); //a - balra rendezést jelöl osztas:=X/Y; write('A hányadosuk: '); writeln(osztas:3:2); //formája: 124.38 inc(sor,+3); writeln(format('%.3F', [osztas])); //így is kiírathatom, az F a fixpontos formátumot takarja, formátum: 23,258 osztas2:=Y/X; writeln(format('%.3F %.1F', [osztas, osztas2])); //többet is kilehet íratni, a változókat felkell sorolni, formátum: 4,576 0,4 writeln; //sorkihagyás writeln('X értéke: '+inttostr(X)+' Y:értéke: '+inttostr(Y)+format(' X/Y: %.3F Y/X: %.3F',[osztas, osztas2])); inc(sor,+4); end;
29
procedure beker1; //két szám bekérése begin s:=''; //s-ben nincs semmi repeat write('Adjon meg egy pozitív egész számot: '); readln(s); //beolvasom a begépelt karaktereket inc(sor); if (length(s)<=3) and (s<>'') then //a length(s) megadja, hogy hány karakter hosszú az s begin for i:=1 to length(s) do if s[i] in ['0'..'9'] then //számokat tartalmaz-e? ok[i]:=true else ok[i]:=false; rossz:=false; for i:=1 to length(s) do if ok[i]=false then //csak számot tartalmaz-e? rossz:=true; if rossz=false then begin rossz:=true; seged:=strtoint(s); if (seged>=1) and (seged<=255) then //1-255 között van-e? rossz:=false; end; end else begin rossz:=true; if length(s)>43 then //ha hosszabb szöveget gépelek be, mint amennyi kifér abban a sorban inc(sor); end; until rossz=false; //ha minden jó, akkor kilép a ciklusból X:=strtoint(s); //szövegből konvertálok egész típusra, és biztos, hogy nem fagy le hiba miatt s:=''; repeat write('Adjon meg egy másik pozitív egész számot: '); readln(s); inc(sor); if length(s)<=3 then //a length(s) megadja hogy hány karakter hosszú az s begin for i:=1 to length(s) do if s[i] in ['0'..'9'] then ok[i]:=true else ok[i]:=false; rossz:=false; for i:=1 to length(s) do if ok[i]=false then rossz:=true; if rossz=false then begin rossz:=true; seged:=strtoint(s); if (seged>=1) and (seged<=255) then //1-255 között van-e? rossz:=false; end; end else begin rossz:=true; if length(s)>37 then inc(sor); end;
30
until rossz=false; Y:=strtoint(s); end; begin sor:=1; writeln('01234567890123456789012345678901234567890123456789012345678901234567890123456+9'); //a DOS-os ablakban akármilyen 80 karakter fér el 1 sorban //(a gyakorlatban 79, mert a writeln, vagyis a sortörés is egy karakternek számít) writeln; inc(sor,+2); irkal; //színek kiírása writeln; inc(sor); textcolor(white); //a szövegszínt fehérre állítom beker1; //két szám bekérése writeln; inc(sor); irkal2; //gotoxy használata writeln; inc(sor); irkal3; //valós számok különböző formátumú kiírása writeln; writeln; inc(sor,+2); //ebben a sorban lesz kiírva a kilépés szöveg write(’Kilépéshez nyomja meg az <ENTER> gombot!’); repeat kod:=ord(readkey); until kod=13; end.
Műveletek, függvények és eljárások program muveletek2; uses crt, sysutils; var kod:word; procedure aritmet; //aritmetikai műveletek var a:integer; b:byte; begin a:=random(1000)+50; b:=random(50)+1; //a b kisebb lesz mint a writeln('Az a értéke: ',a); //kiírom az a értékét writeln('A b értéke: ',b); writeln('Ez egy előjel váltás(a): ',-a); writeln('Ez egy előjel megerősítés(a): ',+a); writeln('A két szám összege(a,b): ',a+b); writeln('A két szám különbsége(a,b): ',a-b); writeln('A két szám szorzata(a,b): ',a*b); writeln('A két szám hányadosa(a,b): ',a/b); writeln('A két szám hányadosa formázva(a,b): '+format('%.2F',[round((a/b)*100)/100])); writeln('A két szám egészképzéssel(a,b): ',a div b); writeln('A két szám maradékképzéssel(a,b): ',a mod b); end;
31
procedure bitmuv; //bitműveletek var a:byte; b:byte; begin a:=random(50)+1; b:=random(100)+1; writeln('Az a értéke: ',a); writeln('A b értéke: ',b); writeln('Bitek szerinti negálás not-al(a): ',not a); //(not a) + a = 255 writeln('Bitek szerinti ÉS művelet(a,b): ',a and b); writeln('Bitek szerinti VAGY művelet(a,b): ',a or b); writeln('Bitek szerinti kizáró VAGY művelet(a,b): ',a xor b); //xor művelet: az aritmetikai kizáró vagy esetében ott kapunk 1-et, ahol a két operandusban 0 1 vagy 1 0 //volt‚ és 0-t kapunk 0 0 vagy 1 1 esetében. Ez azt jelenti, hogy az eltérések helyén 1, //azonos értékeknél pedig 0 lesz az eredmény. writeln('Biteltolás balra(a,2): ',a shl 2); //shl művelet: a megadott számú bittel az operandus bitjeit eltolja balra writeln('Biteltolás jobbra(a,2): ',a shr 2); //shr művelet: megadott számú bittel az operandus bitjeit eltolja jobbra end; procedure logikai; //logikai műveletek var A:boolean; B:boolean; begin if random(2)=0 then A:=false else A:=true; if random(2)=0 then B:=false else B:=true; writeln('Az A logikai változó értéke: ',A); writeln('A B logikai változó értéke: ',B); writeln('Logikai tagadás(A): ',not A); writeln('Logikai ÉS művelet(A,B): ',A and B); writeln('Logikai VAGY művelet(A,B): ',A or B); writeln('Logikai kizáró VAGY művelet(A,B): ',A xor B); //Az xor (logikai kizáró VAGY) akkor ad igaz eredményt, ha a két boolean operandus tartalma klünböző //és akkor ad hamis eredményt, ha a két operandus tartalma megegyezik, tehát mindkettő igaz, //vagy mindkettő hamis. end; procedure karakterlanc; //stringek összekapcsolása var a:string; b:string; begin a:='alma'; b:='fa'; writeln('Az a szó: ',a); writeln('A b szó: ',b); writeln('A két szó összefűzve: ',a + b); end;
32
procedure relacios; //relációs műveletek var a:byte; b:byte; c:byte; begin a:=random(20)+1; b:=random(20)+1; c:=random(20)+1; writeln('Az a értéke: ',a); writeln('A b értéke: ',b); writeln('A c értéke: ',c); if a = b then writeln('a és b egyenlő.') else writeln('a és b nem egyenlő.'); if b <> c then writeln('b és c nem egyenlő.') else //nem nemegyenlő, vagyis egyenlő writeln('b és c egyenlő.'); if a < b then writeln('Az a kisebb, mint b.') else //az a nagyobb vagy egyenlő, mint b writeln('Az a nem kisebb, mint b.'); if b > c then writeln('A b nagyobb, mint c.') else writeln('A b nem nagyobb, mint c.'); if a <= c then writeln('Az a kisebb vagy egyenlő, mint c.') else //a c csak kisebb lehet writeln('A c kisebb, mint az a.'); if a >= c then writeln('Az a nagyobb vagy egyenlő, mint c.') else //a c csak nagyobb lehet writeln('A c nagyobb, mint az a.'); //ha (a <= c) and (a >= c) akkor a = c end; procedure fuggvenyek; //függvények és eljárások //A függvények mindig egy értéket állítanak elő (visszatérési érték), kifejezésekben hívhatjuk meg őket, //pl. egy értékadó utasítás jobb oldalán; a := Abs(a) + 2 . //A függvények paraméteri kifejezések lehetnek, pl. Sqr(a + Round(x)). //Az eljárásokat utasításszerűen hívjuk, pl. Inc(i). var egesz:integer; a:byte; fok:real; s:string; s2:string; s3:string; code:byte; c:char; valos:real; begin randomize; //ez egy eljárás, a véletlenszám generátornak véletlen kezdőértéket ad egesz:=-(random(20)+1); //a random is egy függvény writeln('Az egész szám értéke: ',egesz); a:=abs(egesz); writeln('A szám abszolút értéke, ami a lesz: ',a); str(a,s); //az a string-é konvertálása writeln('Az a értéke konvertálással: ',s);
33
if odd(a)=true then //páratlan-e a szám? writeln('Az a szám páratlan.') else //ha odd(a)=false writeln('Az a szám páros.'); inc(a); //növeli az értéket writeln('Az a inc-eljárással(+1): ',a); dec(a); //csökkenti az értéket inc(a,3); writeln('Az a inc-eljárással(+3): ',a); dec(a,3); inc(a,-2); //a+-2 = a-2 writeln('Az a inc-eljárással(-2): ',a); dec(a,-2); //a--2 = a+2 writeln('Az a szám négyzete: ',sqr(a)); writeln('Az a szám négyzetgyöke: ',sqrt(a)); writeln('Az a szám természetes alapú logaritmusa: ',ln(a)); writeln('Az a exponenciálisa: ',exp(a)); fok:=Pi; //a Pi is egy függvény a:=random(360)+1; fok:=(a/360)*2*Pi; writeln('A fok értéke fokban: ',a); str(fok:2:5,s); //valósból string, formája: 23.56400 writeln('A fok értéke radiánban: ',s); writeln('A fok értéke egészre kerekítve: ',round(fok)); writeln('A fok értéke nulla felé kerekítve: ',trunc(fok)); //= int(fok) writeln('A fok egész része: ',int(fok)); //valós típusként adja vissza writeln('A fok tört része: ',frac(fok)); writeln('A fok szinusza: ',sin(fok)); writeln('A fok cosinusa: ',cos(fok)); writeln('A fok tangense: ',(sin(fok)/cos(fok))); write('Nyomjon le egy billentyűt! '); kod:=ord(readkey); //az ord is egy függvény writeln; writeln('A lenyomott billentyű számértéke: ',kod); writeln('A lenyomott billentyű előtti kód: ',pred(kod)); writeln('A lenyomott billentyű utáni kód: ',succ(kod)); writeln('A 110-es kód értéke: ',chr(110)); s:='Fecske '; s2:='fészek '; s3:='a fán.'; writeln('A stringek összefüzve: ',concat(s,s2,s3)); s:='Fecske fészek a fán.'; writeln('A sting hossza: ',length(s)); s2:=copy(s,8,6); //az s2-be a 8. karaktertől 6 karaktert másol, ami: fészek writeln('A copy függvény használatával: ',s2); delete(s,7,7); //az s-ből a 7. karaktertől 7 karaktert kitöröl, így marad: Fecske a fán. writeln('A delete függvény használatával: ',s); s2:=' szar'; insert(s2,s,7); //az s-be a 7.karakternél beszúrja az s2-t writeln('Az insert függvény használatával: ',s); s3:='ke sza'; //F ecsk e writeln('A keresett karakterlánc(ke sza) a(z) ',pos(s3,s),'. karakternél kezdődik.'); c:='b'; writeln('A b nagybetűre alakítása: ',upcase(c)); write('Adjon meg egy valós értéket .-ot használva: '); readln(s); writeln('Az s értéke: ',s); val(s,valos,code); //az s valóssá konvertálása if valos<>0 then writeln('Az s valós típusra konvertálva: ',valos) else writeln('A ',code,'. karakternél próbléma van.'); end;
34
begin randomize; aritmet; writeln; //sorkihagyás bitmuv; writeln; //sorkihagyás logikai; writeln; //sorkihagyás relacios; writeln; //sorkihagyás karakterlanc; writeln; //sorkihagyás //halmazműveletek: nem tudom, hogy hogyan müködik a dolog fuggvenyek; writeln; write('Kilépéshez nyomja meg az <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
35
Egyirányú láncolt lista használata program lancolt1; uses crt, sysutils; type mut=^tip; //így kell összekapcsolni, hogy mutató típusú legyen tip=record szam1:longword; szam2:longword; szorzat:qword; //ez egy pozitív egész típus hanyados:real; mutat:mut; end; var elso:mut; //ez majd rámutat az első elemre uj:mut; //ez az új elem létrehozásához kell akt:mut; //ez egy segéd mutató lesz, az aktuálisra mutat db:byte; //ez tartalmazza, hogy hány elemből áll a lánc s:string; //ez tartalmazza a bevitt karaktereket rossz:boolean; //rossz számokat adunk-e meg? kilep:boolean; //kilépés a ciklusból van:boolean; //van-e benne szóköz i:byte; //ciklusváltozó k:byte; //a szóköz helye s2:string; //részegységekre bontás kod:word; //kilépés ENTER-el procedure beolvas; begin writeln('Adjon meg számokat párossával, például (5 86)!'); writeln('Kilépéshez csak ENTER-t nyomjon!'); db:=0; kilep:=false; repeat readln(s); rossz:=false; van:=false; if s='' then kilep:=true; for i:=1 to length(s) do if s[i]=' ' then begin van:=true; k:=i; end; if van=true then begin for i:=1 to k-1 do if not (s[i] in ['0'..'9']) then //ha tartalmaz nem számot rossz:=true; for i:=k+1 to length(s) do if not (s[i] in ['0'..'9']) then rossz:=true; end else rossz:=true; if s=' ' then rossz:=true;
36
if van=true then begin s2:=''; for i:=1 to k-1 do s2:=s2+s[i]; if s2='' then rossz:=true; s2:=''; for i:=k+1 to length(s) do s2:=s2+s[i]; if s2='' then rossz:=true; end; if (kilep=false) and (rossz=false) then begin new(uj); if db=0 then elso:=uj else akt^.mutat:=uj; akt:=uj; akt^.mutat:=nil; //jelenlegi utolsó elem s2:=''; for i:=1 to k-1 do s2:=s2+s[i]; akt^.szam1:=strtoint(s2); s2:=''; for i:=k+1 to length(s) do s2:=s2+s[i]; akt^.szam2:=strtoint(s2); inc(db); writeln('Az adatok bevive a láncra!'); end; if (kilep=false) and (rossz=true) then writeln('Nem megfelelő adatok!'); if kilep=true then writeln('Az összes adat sikeresen beolvasva!'); until kilep=true; end; procedure szamolgat; begin if db<>0 then //ha van elem begin akt:=elso; akt^.szorzat:=akt^.szam1*akt^.szam2; akt^.hanyados:=akt^.szam1/akt^.szam2; if db>1 then //ha nem csak 1 elem van for i:=2 to db do //az utolsó elemig fog menni begin akt:=akt^.mutat; akt^.szorzat:=akt^.szam1*akt^.szam2; akt^.hanyados:=akt^.szam1/akt^.szam2; end; end; end;
37
procedure kiir; begin writeln('A kiszámolt adatok:'); if db<>0 then begin akt:=elso; writeln('szám1: '+inttostr(akt^.szam1)+' szám2: '+inttostr(akt^.szam2)+' szorzat: '+inttostr(akt^.szorzat)+ +' hányados: '+floattostr(round(akt^.hanyados*100000)/100000)); //a hányados kerekítése százezredre if db>1 then for i:=2 to db do begin akt:=akt^.mutat; writeln('szám1: '+inttostr(akt^.szam1)+' szám2: '+inttostr(akt^.szam2)+ +' szorzat: '+inttostr(akt^.szorzat)+' hányados: '+floattostr(round(akt^.hanyados*100000)/100000)); end; end else writeln('Nem adott meg adatot!'); end; begin beolvas; sleep(1000); //alvó mód: 1 másodpercig nem lehet semmit csinálni clrscr; //képernyő törlése, üres DOS ablak lesz szamolgat; kiir; writeln; writeln('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Beszúrásos rendezés az egyirányú láncolt listában program lancolt2; uses crt, sysutils; type mut=^tip; tip=record szam:word; mutat:mut; end; var uj:mut; akt:mut; elso:mut; utolso:mut; //ez majd rámutat az utolsó elemre seged:mut; //ez a beillesztéshez kell db:byte; s:string; ertek:word; //ez a bevitt számot fogja tartalmazni rossz:boolean; kilep:boolean; i:byte; kod:word;
38
procedure listazas; begin ertek:=strtoint(s); if elso=nil then //ha ez az első elem begin new(uj); elso:=uj; akt:=elso; akt^.szam:=ertek; akt^.mutat:=nil; utolso:=akt; end else if ertek<elso^.szam then //beszúrás a lista elejére begin new(uj); akt:=uj; akt^.szam:=ertek; akt^.mutat:=elso; elso:=akt; end else if ertek>utolso^.szam then //beszúrás a lista végére begin new(uj); akt:=uj; akt^.szam:=ertek; akt^.mutat:=nil; utolso^.mutat:=akt; utolso:=akt; end else //beszúrás a lista közepére begin new(uj); akt:=uj; akt^.szam:=ertek; seged:=elso; while (seged^.mutat^.szam<=ertek) and (seged^.mutat<>utolso) do seged:=seged^.mutat; akt^.mutat:=seged^.mutat; seged^.mutat:=akt; end; inc(db); writeln('Érték tárolva!'); end; procedure beolvas; begin writeln('Adjon meg 0 és 65535 közötti pozitív egészeket!'); writeln('Kilépni szöveggel tud!'); kilep:=false; elso:=nil; utolso:=nil; seged:=nil;
39
repeat readln(s); rossz:=false; if s='kilép' then kilep:=true else if s=’’ then rossz:=true else begin for i:=1 to length(s) do if not (s[i] in ['0'..'9']) then rossz:=true; if rossz=false then if (strtoint(s)<0) or (strtoint(s)>65535) then rossz:=true else listazas; //ez egy saját eljárás end; if rossz=true then writeln('Rossz érték!'); until kilep=true; writeln('Az értékek tárolva!'); sleep(1000); clrscr; end; procedure kiir; //a számokat növekvő rendben kiírom begin writeln('A számok növekvő rendben:'); if db<>0 then begin akt:=elso; write(akt^.szam); if db>1 then begin write(', '); for i:=2 to db do begin akt:=akt^.mutat; write(akt^.szam); if i<>db then write(', ') else writeln('.'); end; end else writeln('.'); end else writeln('Nem adott meg számot!'); writeln; end; begin beolvas; kiir; writeln('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
40
Törlés az egyirányú láncolt listából program lancolt3; uses crt, sysutils; type mut=^tip; tip=record szam:word; mutat:mut; end; var uj:mut; akt:mut; elso:mut; utolso:mut; seged:mut; db:byte; s:string; ertek:word; rossz:boolean; kilep:boolean; i:byte; kod:word; procedure listazas; begin ertek:=strtoint(s); if elso=nil then //ha ez az első elem begin new(uj); elso:=uj; akt:=elso; akt^.szam:=ertek; akt^.mutat:=nil; utolso:=akt; end else if ertek<elso^.szam then //beszúrás a lista elejére begin new(uj); akt:=uj; akt^.szam:=ertek; akt^.mutat:=elso; elso:=akt; end else if ertek>utolso^.szam then //beszúrás a lista végére begin new(uj); akt:=uj; akt^.szam:=ertek; akt^.mutat:=nil; utolso^.mutat:=akt; utolso:=akt; end
41
else //beszúráss a lista közepére begin new(uj); akt:=uj; akt^.szam:=ertek; seged:=elso; while (seged^.mutat^.szam<=ertek) and (seged^.mutat<>utolso) do seged:=seged^.mutat; akt^.mutat:=seged^.mutat; seged^.mutat:=akt; end; inc(db); writeln('Érték tárolva!'); end; procedure beolvas; begin writeln('Adjon meg legalább 4 db 0 és 65535 közötti pozitív egészeket!'); writeln('Kilépni szöveggel tud!'); kilep:=false; elso:=nil; seged:=nil; repeat readln(s); rossz:=false; if s='kilép' then kilep:=true else if s='' then rossz:=true else begin for i:=1 to length(s) do if not (s[i] in ['0'..'9']) then rossz:=true; if rossz=false then if (strtoint(s)<0) or (strtoint(s)>65535) then rossz:=true else listazas; end; if rossz=true then writeln('Rossz érték!'); if (kilep=true) and (db<4) then //ha nincs meg a 4 adat, akkor nem lépünk ki begin kilep:=false; writeln('Kevés adat! Még kell minimum ',4-db,'!'); end; until kilep=true; writeln('Az értékek tárolva!'); sleep(1000); clrscr; end; procedure kiir; //a számokat növekvő rendben kiírom begin writeln('A számok növekvő rendben:'); akt:=elso; write(akt^.szam); write(', ');
42
for i:=2 to db do begin akt:=akt^.mutat; write(akt^.szam); if i<>db then write(', ') else writeln('.'); end; writeln; end; procedure torolelol; //törlés a lista elejéről begin akt:=elso; elso:=akt^.mutat; dispose(akt); //így tudok egy elemet törölni inc(db,-1); //1-el kevesebb eleme lett a listának end; procedure torolhatul; //törlés a lista végéről begin akt:=elso; while akt^.mutat^.mutat<>nil do //az utolsó előtti elemre állítom az akt-ot akt:=akt^.mutat; dispose(akt^.mutat); akt^.mutat:=nil; utolso:=akt; //beállítom utolsó elemnek inc(db,-1); end; procedure torolkozep; begin seged:=akt^.mutat^.mutat; dispose(akt^.mutat); akt^.mutat:=seged; inc(db,-1); end; procedure torles; begin writeln('Törlöm a legkisebb és legnagyobb adatot, valamint a páros számokat!'); torolelol; torolhatul; if elso^.mutat^.mutat=nil then //ha 2 elem maradt begin if (elso^.mutat^.szam mod 2 = 0) then begin dispose(elso^.mutat); inc(db,-1); elso^.mutat:=nil; utolso:=elso; end; if (elso^.szam mod 2 = 0) then if elso^.mutat=nil then begin dispose(elso); inc(db,-1); elso:=nil; utolso:=nil; end else torolelol; end
43
else //ha nem 2 elem maradt begin akt:=elso; while akt^.mutat^.mutat<>nil do begin if (akt^.mutat^.szam mod 2 = 0) then torolkozep else akt:=akt^.mutat; end; if (elso^.szam mod 2 = 0) then torolelol; akt:=elso; while akt^.mutat<>nil do akt:=akt^.mutat; if (akt^.szam mod 2 = 0) then torolhatul; end; end; begin beolvas; kiir; torles; kiir; //úgyanaz az eljárás, de az eredmény nem úgyanaz lesz writeln('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Kétirányú láncolt lista használata, beszúrás a listába, törlés a listából rogram lancolt4; uses crt, sysutils, dos; //a jelenlegi dátumhoz type mut=^tip; tip=record adat:tdate; //dátum típusú elozo:mut; kov:mut; //következő elemre mutató end; var uj:mut; akt:mut; elso:mut; utolso:mut; seged:mut; db:byte; s:string; i:byte; datum:tdate; ok:boolean; kilep:boolean; kod:word;
44
ev:word; //a mai dátum év-je honap:word; //a mai dátum hónap-ja nap:word; //a mai dátum nap-ja heten:word; //a hét milyen napja, vasárnap(0)-szombat(6), ez most felesleges, de a függvény miatt kell aktev:word; //a legfiatalabb/legidősebb születési év-je akthonap:word; //a legfiatalabb/legidősebb születési hónap-ja aktnap:word; //a legfiatalabb/legidősebb születési nap-ja procedure vizsgal; //megviszgáljuk, hogy megfelelő dátum-e begin ok:=false; if length(s)=11 then //forma: 12345678901 if (s[1] in ['0'..'9']) and (s[2] in ['0'..'9']) and (s[3] in ['0'..'9']) and (s[4] in ['0'..'9']) and (s[6] in ['0'..'9']) and (s[7] in ['0'..'9']) and (s[9] in ['0'..'9']) and (s[10] in ['0'..'9']) and (s[5]='.') and (s[8]='.') and (s[11]='.') then //forma: 2804.57.01. if ((s[1]+s[2]+s[3]+s[4])>inttostr(ev-200)) and ((s[1]+s[2]+s[3]+s[4])<=inttostr(ev)) and (s[6]+s[7]>='01') and (s[6]+s[7]<='12') and (s[9]+s[10]>='01') and (s[9]+s[10]<='31') then //forma: 1850.02.30. if ((((strtoint(s[1]+s[2]+s[3]+s[4]) mod 4 = 0) and (strtoint(s[1]+s[2]+s[3]+s[4]) mod 100 <> 0)) or (strtoint(s[1]+s[2]+s[3]+s[4]) mod 400 = 0)) and (s[6]+s[7]='02') and (strtoint(s[9]+s[10])<=29)) or (((strtoint(s[1]+s[2]+s[3]+s[4]) mod 4 <> 0) or (strtoint(s[1]+s[2]+s[3]+s[4]) mod 100 = 0)) and (s[6]+s[7]='02') and (strtoint(s[9]+s[10])<=28)) or (((s[6]+s[7]='04') or (s[6]+s[7]='06') or (s[6]+s[7]='09') or (s[6]+s[7]='11')) and (strtoint(s[9]+s[10])<=30)) or (((s[6]+s[7]='01') or (s[6]+s[7]='03') or (s[6]+s[7]='05') or (s[6]+s[7]='07') or (s[6]+s[7]='08') or (s[6]+s[7]='10') or (s[6]+s[7]='12')) and (strtoint(s[9]+s[10])<=31)) then //forma: 2014.11.24. if strtodate(s)<=date then //a mai dátumtól nem nagyobb dátum ok:=true; end; procedure beszurelol; //beszúrás a lista elejéré begin new(uj); akt:=uj; akt^.adat:=datum; akt^.elozo:=nil; akt^.kov:=elso; elso^.elozo:=akt; elso:=akt; end; procedure beszurhatul; //beszúrás a lista végére begin new(uj); akt:=uj; akt^.adat:=datum; akt^.elozo:=utolso; akt^.kov:=nil; utolso^.kov:=akt; utolso:=akt; end; procedure beszurkozep; //beszúrás a lista közepére begin new(uj); akt:=uj; akt^.adat:=datum; seged:=elso; while seged^.kov^.adat
45
procedure hozzaad; begin datum:=strtodate(s); if elso=nil then //ha ez az első begin new(uj); akt:=uj; elso:=akt; utolso:=akt; akt^.adat:=datum; akt^.elozo:=nil; akt^.kov:=nil; end else if datum<elso^.adat then beszurelol else if datum>utolso^.adat then beszurhatul else beszurkozep; inc(db); writeln('Dátum beolvasva!'); end; procedure beolvas; begin writeln('Adjon meg minimum 5 születési dátumot ÉÉÉÉ.HH.NN. formában!'); writeln('Kilépni szöveggel tud!'); db:=0; getdate(ev,honap,nap,heten); //forma: 2014,11,23,4 kilep:=false; elso:=nil; utolso:=nil; repeat readln(s); if s='kilép' then if db<5 then writeln('Kevés adat!') else kilep:=true else begin vizsgal; //megvizsgáljuk, hogy megfelelő dátum-e if ok=true then //ha jó hozzaad //hozzáadás a listához else writeln('Ez nem dátum!'); end; until kilep=true; writeln('A(z) ',db,' dátum beolvasva!'); sleep(1000); //1 másodperc után clrscr; //képernyő törlés end;
46
procedure kor; //az életkor meghatározása begin if honap>=akthonap then if ev>=aktev+1 then writeln(ev-aktev,' éves!') //2013.05.20.--2014.06.18. else if nap>=aktnap then if honap>akthonap then writeln(honap-akthonap,' hónapos!') //2014.01.10.--2014.03.12. else if nap>aktnap then writeln(nap-aktnap,' napos!') //2014.01.10.--2014.01.12. else writeln('ma született!') //2014.03.14.--2014.03.14. else if akthonap+12 then if (akthonap=4) or (akthonap=6) or (akthonap=9) or (akthonap=11) then writeln(30-aktnap+nap,' napos!') //2014.04.27.--2014.05.12. else writeln(31-aktnap+nap,' napos!') //2014.03.27.--2014.04.12. else if ((strtoint(s[1]+s[2]+s[3]+s[4]) mod 4 = 0) and (strtoint(s[1]+s[2]+s[3]+s[4]) mod 100 <> 0)) or (strtoint(s[1]+s[2]+s[3]+s[4]) mod 400 = 0) then //ha szökőév writeln(29-aktnap+nap,' napos!') //2012.02.22.--2012.03.10. else writeln(28-aktnap+nap,' napos!') //2014.02.27.--2014.03.10. else if aktev+1<ev then writeln(ev-aktev-1,' éves!') //2012.09.20.--2014.05.22. else if nap>=aktnap then writeln(12-akthonap+honap,' hónapos!') //2013.11.20.--2014.05.22. else writeln(31-aktnap+nap,' napos!'); //2013.12.20.--2014.01.10. end; procedure kiir; begin //datum:=strtodate('2012.05.07.');---így adok értéket egy dátum típusúnak //writeln(datetostr(datum));---így írom ki a dátumot //writeln(datetostr(date));---így írom ki a jelenlegi dátumot writeln('A láncon lévő dátumok!'); akt:=elso; writeln(datetostr(akt^.adat)); while akt^.kov<>nil do begin akt:=akt^.kov; writeln(datetostr(akt^.adat)); end; writeln; //legfiatalabb ember születési év-je,hónap-ja,nap-ja aktev:=strtoint(datetostr(utolso^.adat)[1]+datetostr(utolso^.adat)[2]+datetostr(utolso^.adat)[3]+ datetostr(utolso^.adat)[4]); akthonap:=strtoint((datetostr(utolso^.adat))[6]+(datetostr(utolso^.adat))[7]); aktnap:=strtoint((datetostr(utolso^.adat))[9]+(datetostr(utolso^.adat))[10]); write('A legfiatalabb ember '); kor; //az életkor meghatározása
47
//legidősebb ember születési év-je,hónap-ja,nap-ja aktev:=strtoint(datetostr(elso^.adat)[1]+datetostr(elso^.adat)[2]+datetostr(elso^.adat)[3]+ datetostr(elso^.adat)[4]); akthonap:=strtoint((datetostr(elso^.adat))[6]+(datetostr(elso^.adat))[7]); aktnap:=strtoint((datetostr(elso^.adat))[9]+(datetostr(elso^.adat))[10]); write('A legidősebb ember '); kor; //az életkor meghatározása end; procedure torolelol; //törlés a lista elejéről begin elso:=elso^.kov; dispose(elso^.elozo); elso^.elozo:=nil; inc(db,-1); end; procedure torolhatul; //törlés a lista végéről begin akt:=utolso^.elozo; dispose(utolso); utolso:=akt; utolso^.kov:=nil; inc(db,-1); end; procedure torolkozep; //törlés a lista közepéről begin seged:=akt; akt:=akt^.elozo; akt^.kov:=seged^.kov; seged^.kov^.elozo:=akt; dispose(seged); inc(db,-1); end; procedure torles; begin writeln('Töröljük a láncról a ',honap,'. hónapban születetteket!'); writeln; akt:=elso^.kov; while akt^.kov^.kov<>nil do begin if strtoint(datetostr(akt^.adat)[6]+datetostr(akt^.adat)[7])=honap then torolkozep; akt:=akt^.kov; end; if strtoint(datetostr(akt^.adat)[6]+datetostr(akt^.adat)[7])=honap then //utolsó előttit külön megnézem, ezt másképp is meglehet oldani, csak így könnyebb volt torolkozep; if strtoint(datetostr(elso^.adat)[6]+datetostr(elso^.adat)[7])=honap then torolelol; if strtoint(datetostr(utolso^.adat)[6]+datetostr(utolso^.adat)[7])=honap then torolhatul; sleep(1000); //késleltetés end;
48
begin beolvas; //a dátumok beolvasása kiir; //beolvasott elemek kiírása sleep(5000); //5 másodperc után clrscr; //képernyő törlés torles; //pár elem törlése kiir; //megmaradt elemek kiírása writeln; writeln('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Öröknaptár készítése program oroknaptar; uses crt, sysutils; var kod:word; s:string; ok:boolean; ev:word; honap:byte; nap:byte; h:byte; //milyen nap, vasárnap(0)-szombat(6) procedure vizsgal; //megviszgáljuk, hogy megfelelő dátum-e begin ok:=false; if length(s)=11 then //forma: 12345678901 if (s[1] in ['0'..'9']) and (s[2] in ['0'..'9']) and (s[3] in ['0'..'9']) and (s[4] in ['0'..'9']) and (s[6] in ['0'..'9']) and (s[7] in ['0'..'9']) and (s[9] in ['0'..'9']) and (s[10] in ['0'..'9']) and (s[5]='.') and (s[8]='.') and (s[11]='.') then //forma: 2804.57.01. if ((s[1]+s[2]+s[3]+s[4])>='1000') and (s[6]+s[7]>='01') and (s[6]+s[7]<='12') and (s[9]+s[10]>='01') and (s[9]+s[10]<='31') then //forma: 1850.02.30. if ((((strtoint(s[1]+s[2]+s[3]+s[4]) mod 4 = 0) and (strtoint(s[1]+s[2]+s[3]+s[4]) mod 100 <> 0)) or (strtoint(s[1]+s[2]+s[3]+s[4]) mod 400 = 0)) and (s[6]+s[7]='02') and (strtoint(s[9]+s[10])<=29)) or (((strtoint(s[1]+s[2]+s[3]+s[4]) mod 4 <> 0) or (strtoint(s[1]+s[2]+s[3]+s[4]) mod 100 = 0)) and (s[6]+s[7]='02') and (strtoint(s[9]+s[10])<=28)) or (((s[6]+s[7]='04') or (s[6]+s[7]='06') or (s[6]+s[7]='09') or (s[6]+s[7]='11')) and (strtoint(s[9]+s[10])<=30)) or (((s[6]+s[7]='01') or (s[6]+s[7]='03') or (s[6]+s[7]='05') or (s[6]+s[7]='07') or (s[6]+s[7]='08') or (s[6]+s[7]='10') or (s[6]+s[7]='12')) and (strtoint(s[9]+s[10])<=31)) then //forma: 2014.11.24. ok:=true; end; procedure szamol; //az öröknaptár számítása begin if honap<=2 then begin honap:=honap+12; inc(ev,-1); end; h:=(ev+honap+nap+8*(honap+1) div 5+ev div 4-ev div 100+ev div 400) mod 7;
49
case h of 0:writeln('vasárnap'); 1:writeln('hétfő'); 2:writeln('kedd'); 3:writeln('szerda'); 4:writeln('csütörtök'); 5:writeln('péntek'); 6:writeln('szombat'); end; end; begin writeln('Add meg a dátumot ÉÉÉÉ.HH.NN. formában!'); repeat readln(s); vizsgal; if ok=false then writeln('Nem jó dátum!'); until ok=true; writeln('Megfelelő dátum!'); ev:=strtoint(s[1]+s[2]+s[3]+s[4]); honap:=strtoint(s[6]+s[7]); nap:=strtoint(s[9]+s[10]); writeln; write('A dátum napja: '); szamol; writeln; write('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Prímszám meghatározása program primszam; uses crt, sysutils; var s:string; i:byte; ok:boolean; szam:longword; seged:longword; kod:word; procedure beker; //bekérünk egy pozitív egész számot begin writeln('Addjon meg egy egész számot 1 és 2.000.000.000 között!'); repeat readln(s); ok:=true; if (length(s)=0) or (length(s)>10) then ok:=false else for i:=1 to length(s) do if not(s[i] in ['0'..'9']) then ok:=false;
50
if ok=true then begin ok:=false; for i:=1 to length(s) do if s[i] in ['1'..'9'] then ok:=true; if ok=true then begin i:=1; while not (s[i] in ['1'..'9']) do inc(i); if i<>1 then ok:=false else if length(s)=10 then begin ok:=false; if (s>='1000000000') and (s<='2000000000') then ok:=true; end; end else ok:=false; end; if ok=false then writeln('Nem megfelelő szám!') else writeln('A szám megfelelő!'); until ok=true; szam:=strtoint(s); //2.100.000.000 fölött már nem tud konvertálni end; procedure prime; //prímszám-e begin seged:=2; ok:=false; while (szam mod seged <> 0) and (ok=false) do begin if seged>=szam/2 then ok:=true else inc(seged); end; //az 1-et és 2-öt külön megnézem, mert nem nagyobbak mint a kezdő érték(2) if szam=1 then ok:=false; if szam=2 then ok:=true; if ok=true then writeln('Prím szám!') else writeln('Nem prím szám!'); end; begin beker; writeln; prime; writeln; write('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
51
Átváltás 10-es számrendszerből 2-esbe program kettesszam; uses crt, sysutils; var s:string; i:byte; ok:boolean; szam:word; kod:word; procedure beker; //bekérünk egy pozitív egész számot begin writeln('Adjon meg egy egész számot 1 és 65.000 között!'); repeat readln(s); ok:=true; if (length(s)=0) or (length(s)>5) then ok:=false else for i:=1 to length(s) do if not(s[i] in ['0'..'9']) then ok:=false; if ok=true then begin ok:=false; for i:=1 to length(s) do if s[i] in ['1'..'9'] then ok:=true; if ok=true then begin i:=1; while not (s[i] in ['1'..'9']) do inc(i); if i<>1 then ok:=false else if length(s)=5 then begin ok:=false; if (s>='10000') and (s<='65000') then ok:=true; end; end else ok:=false; end; if ok=false then writeln('Nem megfelelő szám!') else writeln('A szám megfelelő!'); until ok=true; szam:=strtoint(s); end;
52
procedure kettes; //átváltás a 2-es számrendszerbe begin s:=''; while szam<>0 do begin s:=s+inttostr(szam mod 2); szam:=szam div 2; end; for i:=length(s) downto 1 do write(s[i]); writeln; end; begin beker; writeln; kettes; writeln; write('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Faktoriális számítása program faktorialis; uses crt, sysutils; var s:string; i:byte; ok:boolean; szam:word; ertek:extended; //ez a legnagyobb valós típus kod:word; procedure beker; //bekérünk egy pozitív egész számot begin writeln('Addjon meg egy egész számot 1 és 1754 között!'); //a faktoriálisnál nagyon nagy értékek jönnek ki, így max 1754! lehet, ami elfér a longwordben repeat readln(s); ok:=true; if (length(s)=0) or (length(s)>4) then ok:=false else for i:=1 to length(s) do if not(s[i] in ['0'..'9']) then ok:=false;
53
if ok=true then begin ok:=false; for i:=1 to length(s) do if s[i] in ['1'..'9'] then ok:=true; if ok=true then begin i:=1; while not (s[i] in ['1'..'9']) do inc(i); if i<>1 then ok:=false else if length(s)=4 then begin ok:=false; if (s>='1000') and (s<='1754') then ok:=true; end; end else ok:=false; end; if ok=false then writeln('Nem megfelelő szám!') else writeln('A szám megfelelő!'); until ok=true; szam:=strtoint(s); end; procedure faktor; //faktoriális számítása begin ertek:=szam; inc(szam,-1); while szam<>0 do begin ertek:=ertek*szam; inc(szam,-1); end; writeln('A faktoriálisa: ',ertek:0:0); //egy idő után már nem írja ki teljesen, csak normálalakban end; begin beker; writeln; faktor; writeln; write('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
54
Pénzösszeg legegyszerűbb kifizetése program penzosszeg; uses crt, sysutils; type re=record ertek:word; db:longword; //a 20.000-ből max 100.000 lehet, de az már nem fér bele a word-be end; var s:string; ok:boolean; szam:longword; kod:word; i:byte; x:longword; y:longword; e:array[1..12] of re; procedure beker; begin //a magyar valuták beállítása e[1].ertek:=20000; e[2].ertek:=10000; e[3].ertek:=5000; e[4].ertek:=2000; e[5].ertek:=1000; e[6].ertek:=500; e[7].ertek:=200; e[8].ertek:=100; e[9].ertek:=50; e[10].ertek:=20; e[11].ertek:=10; e[12].ertek:=5; //szám bekérése writeln('Addjon meg egy egész számot 1 és 2.000.000.000 között!'); repeat readln(s); ok:=true; if (length(s)=0) or (length(s)>10) then ok:=false else for i:=1 to length(s) do if not(s[i] in ['0'..'9']) then ok:=false; if ok=true then begin ok:=false; for i:=1 to length(s) do if s[i] in ['1'..'9'] then ok:=true; if ok=true then begin i:=1; while not (s[i] in ['1'..'9']) do inc(i);
55
if i<>1 then ok:=false else if length(s)=10 then begin ok:=false; if (s>='1000000000') and (s<='2000000000') then ok:=true; end; end else ok:=false; end; if ok=false then writeln('Nem megfelelő szám!') else begin writeln; writeln('A szám megfelelő!'); end; until ok=true; szam:=strtoint(s); x:=szam; end; procedure szamol; begin for i:=1 to 12 do begin e[i].db:=x div e[i].ertek; x:=x mod e[i].ertek; end; if (x=3) or (x=4) then //ha marad tartozás, akkor +1db 5Ft-os inc(e[12].db); end; procedure kiir; begin writeln('A megadott összeg: ',szam,' Ft'); writeln; ok:=false; for i:=1 to 12 do if e[i].db<>0 then begin writeln(e[i].db,' db ',e[i].ertek,' Ft-os'); if ok=false then ok:=true; end; if ok=false then writeln('Az összeget 0-ra kerekítjük!'); end; begin beker; sleep(3000); clrscr; szamol; kiir; writeln; write('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
56
Prímtényezős felbontás program primtenyezo; uses crt, sysutils; var s:string; ok:boolean; szam:longword; i:byte; kod:word; x:longword; y:longword; procedure beker; begin writeln('Addjon meg egy egész számot 2 és 2.000.000.000 között!'); repeat readln(s); ok:=true; if (length(s)=0) or (length(s)>10) then ok:=false else for i:=1 to length(s) do if not(s[i] in ['0'..'9']) then ok:=false; if ok=true then begin ok:=false; for i:=1 to length(s) do if s[i] in ['1'..'9'] then ok:=true; if ok=true then begin i:=1; while not (s[i] in ['1'..'9']) do inc(i); if i<>1 then ok:=false else if length(s)=10 then begin ok:=false; if (s>='1000000000') and (s<='2000000000') then ok:=true; end; end else ok:=false; end; if s='1' then //ezt lehet hogy belehet építeni az előző részbe, ok:=false; //de így egyszerűbb volt if ok=false then writeln('Nem megfelelő szám!') else begin writeln; writeln('A szám megfelelő!'); end; until ok=true;
57
szam:=strtoint(s); end; procedure primez; begin writeln('A megadott szám: '); write(szam,'='); ok:=false; x:=szam; y:=2; repeat if x mod y = 0 then begin if ok=false then //ha az első elem begin ok:=true; write(y); end else write('*',y); x:=x div y; end else inc(y); until (y=x) or (x=1); if x<>1 then begin if ok=true then write('*'); writeln(x); end; writeln; end; begin beker; sleep(1000); clrscr; primez; write('Kilépéshez nyomjon <ENTER> gombot!'); repeat kod:=ord(readkey); until kod=13; end.
Segéd program programozáshoz 1. (35 db azonos objektum tulajdonságainak beállítása) program segedprog1; uses crt, sysutils; var i:byte; f:text; //ez a típus szolgál txt fájl használatához s:string;
58
begin assign(f,'kiir.txt'); //így tudok txt fájlt csatolni változóhoz rewrite(f); //így lehet létrehozni a kiir.txt fájlt for i:=1 to 35 do begin s:=' betu'+inttostr(i)+'.visible:=false;'; writeln(f,s); s:=' jelolo'+inttostr(i)+'.visible:=false;'; writeln(f,s); s:=' jelolo'+inttostr(i)+'checked:=false;'; writeln(f,s); end; close(f); //így tudom bezárni a fájlt readkey; end.
Segéd program programozáshoz 2. (35 db azonos objektum tulajdonságainak beállítása) program segedprog2; uses crt, sysutils; var i:byte; f:text; s:string; begin assign(f,'kiir.txt'); rewrite(f); for i:=1 to 35 do begin case i of 1:s:='a'; 2:s:='á'; 3:s:='b'; 4:s:='c'; 5:s:='d'; 6:s:='e'; 7:s:='é'; 8:s:='f'; 9:s:='g'; 10:s:='h'; 11:s:='i'; 12:s:='í'; 13:s:='j'; 14:s:='k'; 15:s:='l'; 16:s:='m'; 17:s:='n'; 18:s:='o'; 19:s:='ó'; 20:s:='ö'; 21:s:='ő'; 22:s:='p'; 23:s:='q'; 24:s:='r';
59
25:s:='s'; 26:s:='t'; 27:s:='u'; 28:s:='ú'; 29:s:='ü'; 30:s:='ű'; 31:s:='v'; 32:s:='w'; 33:s:='x'; 34:s:='y'; 35:s:='z'; end; s:=' '+chr(39)+s+chr(39)+':gomb'+inttostr(i)+'.enabled:=false;'; //a chr(39) az aposztróf kiírására szolgál writeln(f,s); end; close(f); readkey; end.
Felírat késleltetése 1. program kesleltet1; uses crt, sysutils; type re=record ora:byte; perc:byte; mperc:byte; szoveg:string; end; var f:text; t:text; s:string; sor:re; seged:string; i:integer; hossz:integer; begin assign(f,'be.txt'); //kettő fájlt is csatolók assign(t,'ki.txt'); reset(f); //megnyitom olvasásra rewrite(t); //megnyitom írásra while not eof(f) do //ismétel, amíg végig nem ér a be.txt-n begin readln(f,s); //beolvas 1 sort a be.txt-ből hossz:=length(s); sor.ora:=strtoint(s[1]+s[2]); sor.perc:=strtoint(s[4]+s[5]); sor.mperc:=strtoint(s[7]+s[8]); seged:=''; i:=10; while i<>(hossz+1) do begin seged:=seged+s[i];
60
inc(i); end; sor.szoveg:=seged; sor.mperc:=sor.mperc+19; //19 másodperccel tolom el a felíratot if sor.mperc>59 then //átváltás percre begin sor.mperc:=sor.mperc-60; sor.perc:=sor.perc+1; end; if sor.perc>59 then //átváltás órára begin sor.perc:=sor.perc-60; sor.ora:=sor.ora+1; end; //kiírom az új adatokat a ki.txt-be write(t,'0'); write(t,sor.ora); write(t,':'); if sor.perc div 10 = 0 then write(t,'0'); write(t,sor.perc); write(t,':'); if sor.mperc div 10 = 0 then write(t,'0'); write(t,sor.mperc); write(t,':'); writeln(t,sor.szoveg); end; close(f); //bezárom mindkettő fájlt close(t); write('Kilépés'); readkey; end.
Felírat késleltetése 2. program kesleltet2; //ez egy kicsit komplikáltabb mint az előző, de ilyen is van, sőt ez a jobb felírat uses crt, sysutils; type re=record ora:byte; perc:byte; mperc:byte; eperc:word; end; var f:text; t:text; s:string; sor:re; seged:string; i:integer; kulonb:longword;
61
begin assign(f,'be.txt'); assign(t,'ki.txt'); reset(f); rewrite(t); while not eof(f) do begin readln(f,s); writeln(t,s); readln(f,s); sor.ora:=strtoint(s[1]+s[2]); sor.perc:=strtoint(s[4]+s[5]); sor.mperc:=strtoint(s[7]+s[8]); sor.eperc:=strtoint(s[10]+s[11]+s[12]); kulonb:=(strtoint(s[18]+s[19]))*3600000+(strtoint(s[21]+s[22]))*60000 +(strtoint(s[24]+s[25]))*1000+(strtoint(s[27]+s[28]+s[29])); kulonb:=kulonb-(sor.ora*3600000+sor.perc*60000+sor.mperc*1000+sor.eperc); sor.mperc:=sor.mperc+20; //a másodperc eltolása if sor.mperc>59 then begin sor.mperc:=sor.mperc-60; sor.perc:=sor.perc+1; end; if sor.perc>59 then begin sor.perc:=sor.perc-60; sor.ora:=sor.ora+1; end; sor.eperc:=sor.eperc+200; //ezredmásodperc eltolása if sor.eperc>999 then begin sor.eperc:=sor.eperc-1000; sor.mperc:=sor.mperc+1; end; if sor.mperc>59 then begin sor.mperc:=sor.mperc-60; sor.perc:=sor.perc+1; end; if sor.perc>59 then begin sor.perc:=sor.perc-60; sor.ora:=sor.ora+1; end; write(t,'0'); write(t,sor.ora); write(t,':'); if sor.perc div 10 = 0 then write(t,'0'); write(t,sor.perc); write(t,':'); if sor.mperc div 10 = 0 then write(t,'0'); write(t,sor.mperc); write(t,','); if sor.eperc<10 then write(t,'00') else if sor.eperc<100 then write(t,'0'); write(t,sor.eperc); write(t,' --> ');
62
sor.eperc:=sor.eperc+kulonb; //az eltünés ideje while sor.eperc>999 do begin sor.eperc:=sor.eperc-1000; sor.mperc:=sor.mperc+1; end; while sor.mperc>59 do begin sor.mperc:=sor.mperc-60; sor.perc:=sor.perc+1; end; while sor.perc>59 do begin sor.perc:=sor.perc-60; sor.ora:=sor.ora+1; end; write(t,'0'); write(t,sor.ora); write(t,':'); if sor.perc div 10 = 0 then write(t,'0'); write(t,sor.perc); write(t,':'); if sor.mperc div 10 = 0 then write(t,'0'); write(t,sor.mperc); write(t,','); if sor.eperc<10 then write(t,'00') else if sor.eperc<100 then write(t,'0'); writeln(t,sor.eperc); repeat readln(f,s); writeln(t,s); until s=''; end; close(f); close(t); writeln('Kilépés'); readkey; end.
Hang lejátszása 1. program hang; //szükséges egy zene.wav fájl uses crt, sysutils, MMSystem; var s:string; s2:string; begin writeln('Hello'); write('Válasz 1,2 és 3 között! '); readln(s);
63
case s of '1':playsound('zene.wav',0,snd_async); //hang lejátszása, de a program fut tovább '2':sndplaysound('zene.wav',snd_nodefault); //lejátsza végig és utána fut tovább a program '3':sndplaysound('zene.wav',snd_loop or snd_async); //egyfolytába ismétli else writeln('Hülye vagy!'); end; if s='3' then begin write('<elég> szöveggel abbahagyhatja a zenét! '); readln(s2); if s2='elég' then sndplaysound(nil, snd_async); //a hang kikapcsolása end; write('Kilépés '); readkey; end.
WinForm-os ablak unit winformos; //a Form-os programban unitot írok a programnak {$mode objfpc} //Compiler módok egyike: OBJFPC mode {$H+} //a string típusát határozza meg: ANSIString/UnicodeString (ez az alapértelmezett) //a másik: {$H-} pedig ShortString típust határoz meg interface //interfész, szolgáltatás a felhasználó felé, ez egy alap része, deklaráció uses Forms, Classes, StdCtrls, Graphics, SysUtils, Controls; type Tablak = class(TForm) kilep: TButton; felir: TLabel; procedure FormCreate(Sender: TObject); procedure kilepClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak;
implementation //implementáció, belső megvalósítás, ez a másik része, programtörzs {$R *.lfm} //csatolja az unithoz tartozó .lfm Lazarus Form fájlt, ami információkat tartalmaz //egy form összes eleméről (egyedi, a Lazarus által használt szöveges formátum; //a műveletek Pascal forráskóddal megírva a megfelelő *.pas fájlban találhatók) procedure Tablak.FormCreate(Sender: TObject); //az ablak létrehozásakor //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.caption:='WinForm-os'; //az ablak felíratának beállítása ablak.color:=clSilver; //szürke hátterű legyen az ablak ablak.width:=500; //az ablak szélessége ablak.height:=300; //az ablak magassága
64
ablak.left:=round((screen.width-ablak.width)/2); //vízszintesen középre igazítom az ablakot ablak.top:=round((screen.height-ablak.height)/2); //függőlegesen középre igazítom az ablakot //a screen.width és screen.height segítségével lehet a felbontást lekérdezni //létrehozok egy gombot(Button), a gomb neve legyen kilep kilep.caption:='Kilépés'; //a gomb felíratának beállítása kilep.font.size:=20; //20-as betűméret kilep.width:=110; //110x50-es méretű gomb, ezt próbálgatással csináltam kilep.height:=50; kilep.left:=ablak.width-kilep.width-10; //a jobb alsó saroktól 10-10 px-re helyezem el kilep.top:=ablak.height-kilep.height-10; //létrehozok egy cimkét(Label), a cimke neve legyen felir felir.caption:='Ez egy WinForm-os ablak!'; //a cimke felíratának beállítása felir.font.size:=30; //30-as betűméretű legyen a cimke felir.font.color:=clBlue; //kék színű legyen a cimke felir.cursor:=crNo; //az egérmutató beállítása felir.left:=20; //ezt próbálgatással csináltam felir.top:=round(ablak.height/2)-50; //ezt próbálgatással csináltam end; procedure Tablak.kilepClick(Sender: TObject); //a kilépés gombra kattintva begin Application.Terminate; //bezárja a programot end; end. //a fájlok nagy méretűek, ezért célszerű tömöríteni őket, ehhez van egy segédprogram, amit el kell inditani //a futtatás programmal, úgy hogy a tömeríteni kívánt program is szerepeljen benne, például így: //C:\ExeTomorito\tomorEXE.bat C:\ExeTomorito\program.exe
65
Button és Label használata 1. unit objektumok1; {$mode objfpc}{$H+} interface uses Forms, Classes, StdCtrls, Graphics, SysUtils, Controls; type Tablak = class(TForm) valtoz: TButton; kilep: TButton; felir: TLabel; procedure FormCreate(Sender: TObject); procedure kilepClick(Sender: TObject); procedure valtozClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.caption:='Button és Label használata'; ablak.color:=clSilver; ablak.width:=500; ablak.height:=300; ablak.left:=round((screen.width-ablak.width)/2); ablak.top:=round((screen.height-ablak.height)/2); //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', width=110, height=50, font.size:=20 kilep.left:=ablak.width-kilep.width-10; kilep.top:=ablak.height-kilep.height-10; //létrehozok egy cimkét(Label), a cimke neve legyen felir //felir tulajdonságai:caption='Látszom!', width=158, height=54, font.size=30, font.color:=clBlue; felir.left:=round((ablak.width-felir.width)/2); felir.top:=round((ablak.height-felir.height)/3); //létrehozok egy gombot(Button), a gomb neve legyen valtoz //valtoz tulajdonságai: caption='Eltűntet', width=110, height=50, font.size:=20 valtoz.left:=round((ablak.width-valtoz.width)/2); valtoz.top:=felir.top+felir.height+20; end; procedure Tablak.kilepClick(Sender: TObject); begin close; //bezárja az ablakot, de most csak 1 ablak van, így a programot is end;
66
procedure Tablak.valtozClick(Sender: TObject); //A valtoz gomb megnyomására a szöveg látható/nem látható lesz. begin if valtoz.caption='Eltűntet' then begin felir.visible:=false; //ne legyen látható valtoz.caption:='Mutat'; end else begin felir.visible:=true; //legyen látható valtoz.caption:='Eltűntet'; end; end; end.
Button és Label használata 2. unit objektumok2; {$mode objfpc}{$H+} interface uses Forms, Classes, StdCtrls, Graphics, SysUtils, Controls; type Tablak = class(TForm) gomb1: TButton; gomb2: TButton; kilep: TButton; felir: TLabel; procedure FormCreate(Sender: TObject); procedure gomb1Click(Sender: TObject); procedure gomb2Click(Sender: TObject); procedure kilepClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.BorderStyle:=bsSingle; //a form nem méretezhető át, a rendszergombok alapállapotban vannak ablak.BorderIcons:=[]; //a kisméret, teljes méret és bezárás gomb eltűntetése ablak.caption:='Button és Label használata'; ablak.color:=clSilver; ablak.width:=500; ablak.height:=300; ablak.position:=poDesktopCenter; //az ablak közepére helyezi az ablakot //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', width=110, height=50, font.size:=20 kilep.left:=ablak.width-kilep.width-10; kilep.top:=ablak.height-kilep.height-10; kilep.TabStop:=False; //elérhetetlenné tesszük a gombot a „Tab” használatára
67
//létrehozok egy cimkét(Label), a cimke neve legyen felir //felir tulajdonságai:caption='Próba', width=200, height=100, font.size=30, font.color=clBlue; felir.Color:=clLime; //a cimke háttere világoszöld színű legyen felir.Alignment:=taCenter; //vízszintesen középre igazítja a cimke szövegét felir.Layout:=tlCenter; //függőlegesen középre igazítja a cimke szövegét felir.left:=round((ablak.width-felir.width)/2); felir.top:=round((ablak.height-felir.height)/4); //létrehozok egy gombot(Button), a gomb neve legyen gomb1 //gomb1 tulajdonságai: caption='ENTER', width=110, height=50, font.size=20, TabStop=False gomb1.left:=round((ablak.width-gomb1.width-gomb2.Width)/5)*2; gomb1.top:=felir.top+felir.height+20; gomb1.Default:=True; //az ENTER megnyomására lefut //létrehozok egy gombot(Button), a gomb neve legyen gomb2 //gomb2 tulajdonságai: caption='ESC', width=110, height=50, font.size=20, TabStop=False gomb2.left:=gomb1.left+gomb1.width+round(gomb1.left/2); gomb2.top:=felir.top+felir.height+20; gomb2.Cancel:=True; //az ESC-re reagál és lefut end; procedure Tablak.gomb1Click(Sender: TObject); begin felir.Caption:='ENTER'; //ha lenyomom az ENTER-t, akkor a cimkét megváltoztatja end; procedure Tablak.gomb2Click(Sender: TObject); begin felir.Caption:='ESC'; //ha lenyomom az ESC-t, akkor a cimkét megváltoztatja gomb1.setfocus; //ez azért kell, hogy a gomb2-re kattintva is tudjuk folytatni end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; end.
Edit használata unit objektumok3; {$mode objfpc}{$H+} interface uses Forms, Classes, StdCtrls, Graphics, SysUtils, Controls; type Tablak = class(TForm) bevisz: TEdit; szam: TLabel; vizsgal: TButton; kilep: TButton; felir: TLabel; procedure FormCreate(Sender: TObject); procedure vizsgalClick(Sender: TObject); procedure kilepClick(Sender: TObject); private { private declarations } public { public declarations } end;
68
var ablak: Tablak; res:byte; //az objektumok közti rés mértéke implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.BorderStyle:=bsSingle; //a form nem méretezhető át, a rendszergombok alapállapotban vannak ablak.BorderIcons:=[]; //a kisméret, teljes méret és bezárás gomb eltűntetése ablak.caption:='Edit használata'; ablak.color:=clSilver; ablak.width:=500; ablak.height:=300; ablak.position:=poDesktopCenter; //az ablak közepére helyezi az ablakot //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', width=110, height=50, font.size=20 kilep.left:=ablak.width-kilep.width-10; kilep.top:=ablak.height-kilep.height-10; kilep.TabStop:=False; //elérhetetlenné tesszük a gombot a „Tab” használatára kilep.Visible:=false; //a kilépés gomb láthatatlan lesz //létrehozok egy cimkét(Label), a cimke neve legyen felir //felir tulajdonságai:caption='Írd le betűvel!', width=250, height=60, font.size=30, font.color=clBlue; felir.Color:=clLime; felir.Alignment:=taCenter; felir.Layout:=tlCenter; //létrehozok egy cimkét(Label), a cimke neve legyen szam //szam tulajdonságai:Caption='237', Width=90, Height=60, //Font.Size=30, Font.Color=clRed, Font.Style=[fsBold] szam.Color:=clBlack; szam.Alignment:=taCenter; szam.Layout:=tlCenter; //létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen bevisz //bevisz tulajdonságai: Text='', Color=clYellow, Width=320, Height=45, MaxLength=20, //Font.Size=20, Font.Color=$00B30F17 bevisz.Alignment:=taCenter; //létrehozok egy gombot(Button), a gomb neve legyen vizsgal //vizsgal tulajdonságai: caption='OK', width=60, height=35, font.size=20 res:=Round((kilep.Top-felir.Height-szam.Height-bevisz.Height-vizsgal.Height)/4); felir.left:=round((ablak.width-felir.width)/2); felir.Top:=res; szam.Left:=Round((ablak.Width-szam.Width)/2); szam.Top:=felir.Top+felir.Height+res; bevisz.Left:=Round((ablak.Width-bevisz.Width)/2); bevisz.Top:=szam.Top+szam.Height+res; vizsgal.left:=round((ablak.width-vizsgal.width)/2); vizsgal.top:=bevisz.top+bevisz.height+res; end; procedure Tablak.vizsgalClick(Sender: TObject); begin if bevisz.Text='kétszázharminchét' then //ha megfelelő a bevitt adat begin bevisz.Color:=clLime; Sleep(500); //fél másodpercet vár bevisz.ReadOnly:=True; //csak olvashatóvá teszi vizsgal.Visible:=false; kilep.Visible:=True; //a kilépés gomb látható lesz kilep.SetFocus; end
69
else //ha rossz a bevitt adat begin bevisz.Color:=clRed; Sleep(500); //fél másodpercet vár bevisz.Clear; //törli a szövegdoboz tartalmát bevisz.Font.Color:=clLime; bevisz.SetFocus; //a szövegdoboz lesz aktív end; end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; end.
RadioButton használata unit objektumok4; {$mode objfpc}{$H+} interface uses Forms, //a Form használatához Classes, //az objektumok használatához Controls, //a tulajdonságok használatához Graphics, //grafikus elemek használatához, színek ismeréséhez StdCtrls, //objektum típusokhoz //az előző 5 unit kötelező minden WinForm-os programhoz MMSystem; //hang lejátszásához type Tablak = class(TForm) film1: TRadioButton; film2: TRadioButton; film3: TRadioButton; vizsgal: TButton; kilep: TButton; felir: TLabel; procedure FormCreate(Sender: TObject); procedure vizsgalClick(Sender: TObject); procedure kilepClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; res:byte; //az objektumok közti rés mértéke implementation {$R *.lfm}
70
procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett //szükséges kettő fájl: jo.wav és rossz.wav begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.BorderStyle:=bsSingle; ablak.BorderIcons:=[]; ablak.caption:='RadioButton használata'; ablak.color:=$00DBDBDB; ablak.width:=500; ablak.height:=300; ablak.position:=poDesktopCenter; //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', width=110, height=50, font.size=20 kilep.left:=ablak.width-kilep.width-10; kilep.top:=ablak.height-kilep.height-10; kilep.TabStop:=False; kilep.Visible:=false; //létrehozok egy cimkét(Label), a cimke neve legyen felir //felir tulajdonságai:caption='Melyik nem film?', width=300, height=50, font.size=30, font.color=clBlue; felir.Color:=clLime; felir.Alignment:=taCenter; felir.Layout:=tlCenter; //létrehozok 3 választógombot(RadioButton), a választógombok nevei: film1, film2, film3 //film1, film2, film3 tulajdonságai: AutoSize=false, Width=480, Height=45, Font.Size=20 //film1 tulajdonságai: Caption='Star Wars - Csillagok háborúja (1977)' //film2 tulajdonságai: Caption='Shrek a vége, fuss el véle (2010)' //film3 tulajdonságai: Caption='A Gyűrűk Ura - A király visszatér (2003)' //létrehozok egy gombot(Button), a gomb neve legyen vizsgal //vizsgal tulajdonságai: caption='OK', width=60, height=35, font.size=20 res:=Round((kilep.Top-felir.Height-film1.Height-film2.Height-film3.Height-vizsgal.Height)/5); felir.left:=round((ablak.width-felir.width)/2); felir.Top:=res; film1.left:=round((ablak.width-film1.width)/2); film1.Top:=felir.Top+felir.Height+res; film2.left:=round((ablak.width-film2.width)/2); film2.Top:=film1.Top+film1.Height+res; film3.left:=round((ablak.width-film3.width)/2); film3.Top:=film2.Top+film2.Height+res; vizsgal.left:=round((ablak.width-vizsgal.width)/2); vizsgal.top:=film3.top+film3.height+res; end; procedure Tablak.vizsgalClick(Sender: TObject); begin if film2.Checked=True then begin playsound('jo.wav',0,snd_async); //a hang lejátszása, de a program fut tovább vizsgal.Visible:=false; kilep.Visible:=True; end else playsound('rossz.wav',0,snd_async); end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; end.
71
CheckBox használata unit objektumok5; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, StdCtrls, SysUtils; //konvertáláshoz type Tablak = class(TForm) formaz: TButton; kilep: TButton; felir: TLabel; stilus1: TCheckBox; stilus2: TCheckBox; stilus3: TCheckBox; stilus4: TCheckBox; procedure formazClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure kilepClick(Sender: TObject); procedure stilus1Change(Sender: TObject); procedure stilus2Change(Sender: TObject); procedure stilus3Change(Sender: TObject); procedure stilus4Change(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; res:byte; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.BorderStyle:=bsSingle; ablak.BorderIcons:=[]; ablak.caption:='CheckBox használata'; ablak.color:=$00DBDBDB; ablak.width:=500; ablak.height:=300; ablak.position:=poDesktopCenter; ablak.KeyPreview:=True; //a lenyomott billentyűt először a form kapja meg //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', width=110, height=50, font.size=20 kilep.left:=ablak.width-kilep.width-10; kilep.top:=ablak.height-kilep.height-10; kilep.TabStop:=False; //a TAB-bal nem lehet rá eljutni //létrehozok egy cimkét(Label), a cimke neve legyen felir //felir tulajdonságai: width=230, height=50, font.size=30, font.color=clBlue, Color=clYellow felir.Caption:='Rock && Roll'; //ha & akarok kiíratni akkor dubla kell, mert az & aláhuzza az utána lévő karaktert felir.Alignment:=taCenter; felir.Layout:=tlCenter; felir.Hint:='A jelölő négyzeteket használva megváltozik az alakja.'; //információ közlés valamiről, ha az egér rajta van a komponensen felir.ShowHint:=True; //látható legyen-e az információ, ha igen akkor a ParentShowHint=False lesz
72
//létrehozok 4 jelölő négyzetet(CheckBox), ezek nevei: stilus1, stilus2, stilus3, stilus4 //stilus1, stilus2, stilus3, stilus4 tulajdonságai: Font.Size=20, AutoSize=False, Width=175, Height=41 //stilus1 tulajdonságai: TabOrder=0, Caption='Félkövér (f)', Font.Style=[fsBold] //stilus2 tulajdonságai: TabOrder=1, Caption='Dőlt (d)', Font.Style=[fsItalic] //stilus3 tulajdonságai: TabOrder=2, Caption='Aláhúzott (a)', Font.Style=[fsUnderline] //stilus4 tulajdonságai: TabOrder=3, Caption='Áthúzott (á)', Font.Style=[fsStrikeOut] res:=Round((kilep.Top-(felir.Height+stilus1.Height+stilus2.Height+stilus3.Height+stilus4.Height))/2); felir.Top:=res; felir.Left:=Round((ablak.Width-felir.Width)/2); stilus1.Top:=felir.Top+felir.Height; stilus1.Left:=Round((ablak.Width-stilus1.Width)/2); stilus2.Top:=stilus1.Top+stilus1.Height; stilus2.Left:=Round((ablak.Width-stilus2.Width)/2); stilus3.Top:=stilus2.Top+stilus2.Height; stilus3.Left:=Round((ablak.Width-stilus3.Width)/2); stilus4.Top:=stilus3.Top+stilus3.Height; stilus4.Left:=Round((ablak.Width-stilus4.Width)/2); //létrehozok egy gombot(Button), a gomb neve legyen formaz //formaz tulajdonságai: TabStop=False, Visible=False //ezt egy eljáráshoz fogom használni end; procedure Tablak.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin //a lenyomott f,d,a,á betűkre reagál a program //Label1.Caption:=IntToStr(Ord(Key)); -- így tudom megnézni a billentyű kódját if Key=70 then //ha az f lett lenyomva stilus1.Checked:=not stilus1.Checked; //ha jelölt, akkor nem jelölt lesz; ha nem jelölt, akkor jelölt lesz if Key=68 then //ha az d lett lenyomva stilus2.Checked:=not stilus2.Checked; if Key=65 then //ha az a lett lenyomva stilus3.Checked:=not stilus3.Checked; if Key=222 then //ha az á lett lenyomva stilus4.Checked:=not stilus4.Checked; end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; procedure Tablak.stilus1Change(Sender: TObject); begin formaz.Click; end; procedure Tablak.stilus2Change(Sender: TObject); begin formaz.Click; end; procedure Tablak.stilus3Change(Sender: TObject); begin formaz.Click; end; procedure Tablak.stilus4Change(Sender: TObject); begin formaz.Click; end;
73
procedure Tablak.formazClick(Sender: TObject); //ez egy eljárás a szöveg formázására, másképp nem tudtam megoldani begin //az összes (16) esetett számba kell venni if (stilus1.Checked=True) and (stilus2.Checked=True) and (stilus3.Checked=True) and (stilus4.Checked=True) then felir.Font.Style:=[fsBold,fsItalic,fsUnderline,fsStrikeOut]; if (stilus1.Checked=True) and (stilus2.Checked=True) and (stilus3.Checked=True) and (stilus4.Checked=False) then felir.Font.Style:=[fsBold,fsItalic,fsUnderline]; if (stilus1.Checked=True) and (stilus2.Checked=True) and (stilus3.Checked=False) and (stilus4.Checked=True) then felir.Font.Style:=[fsBold,fsItalic,fsStrikeOut]; if (stilus1.Checked=True) and (stilus2.Checked=False) and (stilus3.Checked=True) and (stilus4.Checked=True) then felir.Font.Style:=[fsBold,fsUnderline,fsStrikeOut]; if (stilus1.Checked=False) and (stilus2.Checked=True) and (stilus3.Checked=True) and (stilus4.Checked=True) then felir.Font.Style:=[fsItalic,fsUnderline,fsStrikeOut]; if (stilus1.Checked=True) and (stilus2.Checked=True) and (stilus3.Checked=False) and (stilus4.Checked=False) then felir.Font.Style:=[fsBold,fsItalic]; if (stilus1.Checked=True) and (stilus2.Checked=False) and (stilus3.Checked=True) and (stilus4.Checked=False) then felir.Font.Style:=[fsBold,fsUnderline]; if (stilus1.Checked=False) and (stilus2.Checked=True) and (stilus3.Checked=True) and (stilus4.Checked=False) then felir.Font.Style:=[fsItalic,fsUnderline]; if (stilus1.Checked=True) and (stilus2.Checked=False) and (stilus3.Checked=False) and (stilus4.Checked=True) then felir.Font.Style:=[fsBold,fsStrikeOut]; if (stilus1.Checked=False) and (stilus2.Checked=True) and (stilus3.Checked=False) and (stilus4.Checked=True) then felir.Font.Style:=[fsItalic,fsStrikeOut]; if (stilus1.Checked=False) and (stilus2.Checked=False) and (stilus3.Checked=True) and (stilus4.Checked=True) then felir.Font.Style:=[fsUnderline,fsStrikeOut]; if (stilus1.Checked=True) and (stilus2.Checked=False) and (stilus3.Checked=False) and (stilus4.Checked=False) then felir.Font.Style:=[fsBold]; if (stilus1.Checked=False) and (stilus2.Checked=True) and (stilus3.Checked=False) and (stilus4.Checked=False) then felir.Font.Style:=[fsItalic]; if (stilus1.Checked=False) and (stilus2.Checked=False) and (stilus3.Checked=True) and (stilus4.Checked=False) then felir.Font.Style:=[fsUnderline]; if (stilus1.Checked=False) and (stilus2.Checked=False) and (stilus3.Checked=False) and (stilus4.Checked=True) then felir.Font.Style:=[fsStrikeOut]; if (stilus1.Checked=False) and (stilus2.Checked=False) and (stilus3.Checked=False) and (stilus4.Checked=False) then felir.Font.Style:=[]; end; end.
74
0 1 2 3 4 5 6 7 8 9 Num0 Num1 Num2 Num3 Num4 Num5 Num6 Num7 Num8 Num9 + * / , .
gombok kódtáblája (WinForm-os) 48 a 65 49 b 66 50 c 67 51 d 68 52 e 69 F1 53 f 70 F2 54 g 71 F3 55 h 72 F4 56 i 73 F5 57 j 74 F6 45 k 75 F7 35 l 76 F8 40 m 77 F9 34 n 78 F10 37 o 79 F11 12 p 80 F12 39 q 81 ESC 36 r 82 ENTER 38 s 83 TAB 33 t 84 SPACE 107 u 85 BACKSPACE 109 v 86 DELETE 106 w 87 HOME 111 x 88 END 188 y 89 INSERT 189 z 90 PAGE UP 190 á 222 PAGE DOWN é 186 WINDOWS í 226 L SHIFT ó 187 R SHIFT ö 192 L CTRL ő 219 R CTRL ú 221 L ALT ü 191 R ALT ű 220 CAPS LOCK NUM LOCK PAUSE BREAK
38 40 37 39 112 113 114 115 116 117 118 119 120 121 122 123 27 13 9 32 8 46 36 35 45 33 34 91 16 16 17 17 18 18 20 144 19
75
Üzenetablakok használata unit uzenetek; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, StdCtrls, Windows, //Windows hang lejátszásához Dialogs; //üzenet ablakok használatához type Tablak = class(TForm) uzenet1: TButton; kilep: TButton; kiir: TLabel; uzenet2: TButton; uzenet3: TButton; uzenet4: TButton; procedure FormCreate(Sender: TObject); procedure kilepClick(Sender: TObject); procedure uzenet1Click(Sender: TObject); procedure uzenet2Click(Sender: TObject); procedure uzenet3Click(Sender: TObject); procedure uzenet4Click(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; res:byte; gomb:integer; //az üzenet ablakokhoz nev:string; //játékos nevének megadása implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.BorderStyle:=bsSingle; ablak.BorderIcons:=[]; ablak.caption:='Üzenetablakok használata'; ablak.color:=$00DBDBDB; ablak.width:=500; ablak.height:=300; ablak.position:=poDesktopCenter; //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', width=110, height=50, font.size=20 kilep.left:=ablak.width-kilep.width-10; kilep.top:=ablak.height-kilep.height-10; kilep.TabStop:=False; //létrehozok egy cimkét(Label), a cimke neve legyen kiir //felir tulajdonságai: AutoSize=False, width=400, height=60, font.size=30, font.color=clBlue, Color=clYellow, //Caption='', Alignment=taCenter, Layout=tlCenter kiir.Left:=Round((ablak.Width-kiir.Width)/2); kiir.Top:=10; kiir.Caption:='Válassz egy gombot!'; //létrehozok egy gombot(Button), a gomb neve legyen unezet1 //uzenet1 tulajdonságai: Caption='Üzenet', Font.Size=20, Width=110, Height=50, TabOrder=0 //létrehozok egy gombot(Button), a gomb neve legyen unezet2 //uzenet2 tulajdonságai: Caption='Elment', Font.Size=20, Width=110, Height=50, TabOrder=1
76
//létrehozok egy gombot(Button), a gomb neve legyen unezet3 //uzenet3 tulajdonságai: Caption='R.Elment', Font.Size=20, Width=110, Height=50, TabOrder=2 //létrehozok egy gombot(Button), a gomb neve legyen unezet4 //uzenet4 tulajdonságai: Caption='Beolvas', Font.Size=20, Width=110, Height=50, TabOrder=3 res:=Round((ablak.Width-(uzenet1.Width+uzenet2.Width+uzenet3.Width+uzenet4.Width))/5); uzenet1.Left:=res; uzenet2.Left:=uzenet1.Left+uzenet1.Width+res; uzenet3.Left:=uzenet2.Left+uzenet2.Width+res; uzenet4.Left:=uzenet3.Left+uzenet3.Width+res; res:=Round((kilep.Top-(kiir.Top+kiir.Height)-uzenet1.Height)/3); uzenet1.Top:=kiir.Top+kiir.Height+res; uzenet2.Top:=uzenet1.Top; uzenet3.Top:=uzenet2.Top; uzenet4.Top:=uzenet3.Top; end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; procedure Tablak.uzenet1Click(Sender: TObject); //ha csak 1 egyszerű szöveget szeretnénk kiíratni, akkor ShowMessage-t használunk begin kiir.Caption:='Üzenetablak'; ShowMessage('Ön rekordot ért el!'); //így hívom meg az ablakot end; procedure Tablak.uzenet2Click(Sender: TObject); //ha az előzőnél többet akarunk, akkor használjuk a MessageDlg-t begin //a gomb változóban lesz a visszatérés értéke gomb:=MessageDlg( //így hívom meg az ablakot 'El akarja menteni a fájlt?', //a szöveg amit megakarunk jeleníteni mtConfirmation, //az üzenetablak célját jelzi, ez kérdést jelző kék kérdőjel //mtWarning -- figyelmeztetést jelző sárga-fekete ikon //mtError -- hibát jelző piros „stoptábla” //mtInformation -- információt jelző kék „i” bető //mtCustom -- az üzenetablakon nem lesz kép [mbYes, //megadja, hogy milyen gombok legyenek láthatóak, ez a Yes gomb //mbOk -- OK gomb //mbCancel -- Mégse gomb //mbAbort -- Megszakít/Leállít gom //mbRetry -- Újra gomb //mbIgnore -- Mellőzés gomb //mbAll -- Mindegyik/Összes gomb //mbNoToAll -- Nem mindegyik gomb //mbYesToAll -- Igen, mindegyik gomb //mbHelp -- //Segítség gomb mbNo], //No gomb 0); //nem akarok súgót használni if gomb=mrYes then kiir.Caption:='Elmentve'; //annak a nyomógombnak az értéke, amellyel a felhasználó bezárta az üzenetablakot, ez a Yes gombnak if gomb=mrNo then kiir.Caption:='Nincs mentés'; //ez a No gombnak //mrOk -- az OK gombnak //mrCancel -- a Cancel gombnak //mrRetry -- a Retry gombnak //mrAbort -- az Abort gombnak //mrIgnore -- az Ignore gombnak //mrAll -- az All gombnak //mrNone -- ha semmit nem nyomok (ez nem tudom hogy müködik :( ) end;
77
procedure Tablak.uzenet3Click(Sender: TObject); //MessageDlgPos a MessageDlg továbbfejlesztett változata, amiben a gombok ikonokat kapnak és //nem középen jelenik meg az ablak, hanem ott, ahová a koordináták mutatnak begin //a gomb változóban lesz a visszatérés értéke gomb:=MessageDlgPos('El akarja menteni a fájlt?',mtConfirmation,[mbYes,mbNo],0, ablak.Left, //X koordináta ablak.Top); //Y koordináta if gomb=mrYes then kiir.Caption:='Elmentve2'; if gomb=mrNo then kiir.Caption:='Nincs mentés2'; end; procedure Tablak.uzenet4Click(Sender: TObject); //egyszerű adatbeolvasáshoz használhatjuk az InputBox ablakot begin nev:=InputBox( //így hívom meg az ablakot 'Játékos neve', //a dialógusablak felirata 'Kérlek add meg a neved:', //a dialógusablakban megjelenő szöveg ''); //a beviteli mezőben megjelenő kezdeti szöveg if nev<>'' then //ha megadott egy játékos nevet kiir.Caption:=nev else //ha nem adott meg játékos nevet kiir.Caption:='Nem adtál meg nevet!'; MessageBeep($33333333); //ezzel hangokat lejátszani //MessageBeep(MB_ICONASTERISK); //MessageBeep(MB_ICONEXCLAMATION); //MessageBeep(MB_ICONHAND); //MessageBeep(MB_ICONQUESTION); //MessageBeep(MB_OK); end; end.
RadioGroup használata unit objektumok6; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, StdCtrls, SysUtils, ExtCtrls; //a RadioGrouphoz kell type Tablak = class(TForm) kilep: TButton; kiir: TLabel; csoport1: TRadioGroup; csoport2: TRadioGroup; vizsgal: TButton; procedure FormCreate(Sender: TObject); procedure kilepClick(Sender: TObject); procedure vizsgalClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; res:byte;
78
implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.BorderStyle:=bsSingle; ablak.BorderIcons:=[]; ablak.caption:='Választógomb csoport használata'; ablak.color:=$00DBDBDB; ablak.width:=500; ablak.height:=300; ablak.position:=poDesktopCenter; //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', width=110, height=50, font.size=20 kilep.left:=ablak.width-kilep.width-10; kilep.top:=ablak.height-kilep.height-10; kilep.TabStop:=False; kilep.Enabled:=False; //a kilépés gombot nem lehet használni //létrehozok egy cimkét(Label), a cimke neve legyen kiir //felir tulajdonságai: AutoSize=False, width=475, height=60, font.size=30, //font.color=clBlue, Color=clYellow, Caption='', Alignment=taCenter, Layout=tlCenter kiir.Left:=Round((ablak.Width-kiir.Width)/2); kiir.Top:=10; kiir.Caption:='Válasszd ki a kakukktojást!'; //létrehozok egy választógomb csoportot(RadioGroup), a csoport neve legyen csoport1 //csoport1 tulajdonságai: Caption='1. csoport', Font.Size=12, Width=85, Height=120 csoport1.Items.Add('alma'); //így adhatok hozzá elemet csoport1.Items.Add('körte'); csoport1.Items.Add('paprika'); csoport1.Items.Add('banán'); //létrehozok egy választógomb csoportot(RadioGroup), a csoport neve legyen csoport2 //csoport2 tulajdonságai: Caption='2. csoport', Font.Size=12, Width=170, Height=90 csoport2.Columns:=2; //2 oszlopban legyen elhelyezve csoport2.Items.Add('Volvo'); csoport2.Items.Add('BMW'); csoport2.Items.Add('Mercedes'); csoport2.Items.Add('Man'); //létrehozok egy gombot(Button), a gomb neve legyen vizsgal //vizsgal tulajdonságai: Captioin='OK', Font.Size=20, Width=60, Height=35 res:=Round((kilep.Top-(kiir.Top+kiir.Height)-(csoport1.Height+vizsgal.Height))/5); csoport1.Top:=kiir.Top+kiir.Height+2*res; csoport2.Top:=csoport1.Top+Round((csoport1.Height-csoport2.Height)/2); vizsgal.Top:=csoport1.Top+csoport1.Height+res; res:=Round((ablak.Width-(csoport1.Width+csoport2.Width))/9); csoport1.Left:=4*res; csoport2.Left:=csoport1.Left+csoport1.Width+res; vizsgal.Left:=csoport1.Left+csoport1.Width +Round((csoport2.Left-(csoport1.Left+csoport1.Width))/2-vizsgal.Width/2); end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end;
79
procedure Tablak.vizsgalClick(Sender: TObject); begin if (csoport1.ItemIndex=2) and (csoport2.ItemIndex=1) then //ha paprika és BMW //ha -1 akkor nincs kiválasztva egyik sem, amúgy 0-tól kezdődik a számozása begin kiir.Caption:='Jó válasz!'; csoport1.Enabled:=False; csoport2.Enabled:=False; vizsgal.Enabled:=False; kilep.Enabled:=True; ablak.Color:=clLime; //ha jó, akkor legyen zöld az ablak színe end else begin kiir.Caption:='Rossz válasz!'; ablak.Color:=$004246FF; //ha rossz, akkor legyen fakó piros az ablak színe end; end; end.
CheckGroup használata unit objektumok7; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, StdCtrls, ExtCtrls; //a CheckGrouphoz kell type Tablak = class(TForm) traktorok: TCheckGroup; kilep: TButton; kiir: TLabel; vizsgal: TButton; procedure FormCreate(Sender: TObject); procedure kilepClick(Sender: TObject); procedure vizsgalClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében ablak.BorderStyle:=bsSingle; ablak.BorderIcons:=[]; ablak.caption:='Jelölőnégyzet csoport használata'; ablak.color:=$00DBDBDB; ablak.width:=600; ablak.height:=250; ablak.position:=poDesktopCenter;
80
//létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', width=110, height=50, font.size=20 kilep.left:=ablak.width-kilep.width-10; kilep.top:=ablak.height-kilep.height-10; kilep.TabStop:=False; kilep.Enabled:=False; //a kilépés gombot nem lehet használni //létrehozok egy cimkét(Label), a cimke neve legyen kiir //felir tulajdonságai: AutoSize=False, width=550, height=60, font.size=30, //font.color=clBlue, Color=clYellow, Caption='', Alignment=taCenter, Layout=tlCenter kiir.Left:=Round((ablak.Width-kiir.Width)/2); kiir.Top:=10; kiir.Caption:='Válasszd ki a traktor márkákat!'; //létrehozok egy gombot(Button), a gomb neve legyen vizsgal //vizsgal tulajdonságai: Captioin='OK', Font.Size=20, Width=60, Height=35 vizsgal.Left:=kilep.Left+Round((kilep.Width-vizsgal.Width)/2); vizsgal.Top:=kilep.Top-vizsgal.Height-20; //20px a rés //létrehozok egy jelölőnégyzet csoportot(CheckGroup), a csoport neve legyen traktorok //traktorok tulajdonságai: Font.Size=12, Caption='Traktorok', Columns=2, Width=250, Height=150 traktorok.Items.Add('New Holland'); traktorok.Items.Add('John Deere'); traktorok.Items.Add('Volvo'); traktorok.Items.Add('Dutra'); traktorok.Items.Add('Lamborghini'); traktorok.Items.Add('Audi'); traktorok.Items.Add('IFA'); traktorok.Items.Add('MTZ'); traktorok.Left:=Round((ablak.Width-traktorok.Width)/2); traktorok.Top:=Round((ablak.Height+kiir.Top+kiir.Height-traktorok.Height)/2); end; procedure Tablak.vizsgalClick(Sender: TObject); begin if (traktorok.Checked[0]=True) and (traktorok.Checked[1]=True) and (traktorok.Checked[2]=False) and (traktorok.Checked[3]=True) and (traktorok.Checked[4]=True) and (traktorok.Checked[5]=False) and (traktorok.Checked[6]=False) and (traktorok.Checked[7]=True) then //ha helyesen jelöltem, itt is 0-tól indul az indexelés begin traktorok.Enabled:=False; ablak.Color:=clLime; kilep.Enabled:=True; vizsgal.Enabled:=False; end else //ha nem jól jelölt ablak.Color:=$004246FF; end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; end.
81
Memo használata unit objektumok8; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, StdCtrls; type Tablak = class(TForm) jegyzet: TMemo; torol: TButton; ment: TButton; betolt: TButton; kilep: TButton; procedure betoltClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure kilepClick(Sender: TObject); procedure mentClick(Sender: TObject); procedure torolClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett //szükséges egy jegyzet.bat fájl, ezt úgy tudom elérni, hogy elöször mentek, és utána már minden megy begin //a form nevét megváltoztatom ablak-ra //ablak tulajdonságai: BorderStyle=bsSingle, BorderIcons=[], Color=$00DBDBDB, //Width=600, Height=300, Position=poDesktopCenter, Caption='A jegyzettömb használata' //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', font.size=20, TabStop=False, //Width=110, Height=50, Left=485, Top=216 //létrehozok egy jegyzettömböt(Memo), a jegyzettömb neve legyen jegyzet //jegyzet tulajdonságai: Font.Size=14, Font.Color=clRed, Lines='' //Width=475, Height=290, Left=5, Top=5 //ScrollBars=ssAutoVertical -- a függőleges görgetősáv legyen látható //WordWrap=True -- automatikus sortörés //WantReturns=True -- lehet használni ENTER-t //WantTabs=True -- lehet használni TAB-ot //ReadOnly=True -- csak olvasható //a Lines.Count eljárás megadja a sorok számát //a Lines.Append('ezzel sort adhatok hozzá') eljárás is hasznos //jegyzet.Lines[5] -- megadja a 6. sorban lévő karaktereket //létrehozok egy gombot(Button), a gomb neve legyen betolt //kilep tulajdonságai: caption='Betöltés', font.size=20, TabStop=False, //Width=110, Height=50, Left=485, Top=155 //létrehozok egy gombot(Button), a gomb neve legyen ment //kilep tulajdonságai: caption='Mentés', font.size=20, TabStop=False, //Width=110, Height=50, Left=485, Top=94 //létrehozok egy gombot(Button), a gomb neve legyen torol //kilep tulajdonságai: caption='Törlés', font.size=20, TabStop=False, //Width=110, Height=50, Left=485, Top=33 betolt.Click; //betöltöm az elmentett jegyzetet end;
82
procedure Tablak.torolClick(Sender: TObject); begin //a jegyzettömb törlése jegyzet.Clear; jegyzet.SetFocus; end; procedure Tablak.mentClick(Sender: TObject); begin //a jegyzet mentése jegyzet.Lines.SaveToFile('jegyzet.bat'); end; procedure Tablak.betoltClick(Sender: TObject); begin //elmentet jegyzet betöltése jegyzet.Lines.LoadFromFile('jegyzet.bat'); end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; end.
ScrollBar használata unit objektumok9; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, StdCtrls, SysUtils, //konvertáláshoz Windows; //RGB színkeveréshez type Tablak = class(TForm) kever: TButton; kilep: TButton; szin: TLabel; Lpiros: TLabel; Lzold: TLabel; Lkek: TLabel; piros: TScrollBar; zold: TScrollBar; kek: TScrollBar; procedure FormCreate(Sender: TObject); procedure kekChange(Sender: TObject); procedure keverClick(Sender: TObject); procedure kilepClick(Sender: TObject); procedure pirosChange(Sender: TObject); procedure zoldChange(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation
83
{$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra //ablak tulajdonságai: BorderStyle=bsSingle, BorderIcons=[], Color=$00DBDBDB, //Width=450, Height=255, Position=poDesktopCenter, Caption='A görgetősáv használata' //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', font.size=20, TabStop=False, //Width=110, Height=50, Left=72, Top=200 //létrehozok egy görgetősávot(ScrollBar), a görgetősáv neve legyen piros piros.Kind:=sbHorizontal; //vízszintesen helyezkedik el piros.Min:=0; //a legkisebb érték piros.Max:=255; //a legnagyobb érték piros.Position:=0; //meghatározza, hogy hol jár a csúszka piros.SmallChange:=1; //mennyi legyen a lépésköz piros.LargeChange:=1; //az eltolás mértéke, ha a görgetősáv sávjában kattintunk piros.TabStop:=False; piros.Width:=250; //a hossza piros.Height:=30; //a magassága piros.Left:=5; piros.Top:=30; //létrehozok egy görgetősávot(ScrollBar), a görgetősáv neve legyen zold zold.Kind:=sbHorizontal; zold.Min:=0; zold.Max:=255; zold.Position:=0; zold.SmallChange:=1; zold.LargeChange:=1; zold.TabStop:=False; zold.Width:=250; zold.Height:=30; zold.Left:=5; zold.Top:=95; //létrehozok egy görgetősávot(ScrollBar), a görgetősáv neve legyen kek kek.Kind:=sbHorizontal; kek.Min:=0; kek.Max:=255; kek.Position:=0; kek.SmallChange:=1; kek.LargeChange:=1; kek.TabStop:=False; kek.Width:=250; kek.Height:=30; kek.Left:=5; kek.Top:=160; //létrehozok egy címkét(Label), a címke neve legyen Lpiros //Lpiros tulajdonságai: Font.Size=12, Font.Color=clRed, Caption='Piros: 0', Left=5, Top=5 //létrehozok egy címkét(Label), a címke neve legyen Lzold //Lzold tulajdonságai: Font.Size=12, Font.Color=clGreen, Caption='Zöld: 0', Left=5, Top=70 //létrehozok egy címkét(Label), a címke neve legyen Lkek //Lkek tulajdonságai: Font.Size=12, Font.Color=clBlue, Caption='Kék: 0', Left=5, Top=135 //létrehozok egy címkét(Label), a címke neve legyen szin //szin tulajdonságai: Autosize=False, Width=160, Height=160, Left=280, Top=30 //létrehozok egy gombot(Button), a gomb neve legyen kever //kever tulajdonságai: Visible=False, TabStop=False kever.Click; end; procedure Tablak.pirosChange(Sender: TObject); begin Lpiros.Caption:='Piros: '+IntToStr(piros.Position); kever.Click; end;
84
procedure Tablak.zoldChange(Sender: TObject); begin Lzold.Caption:='Zöld: '+IntToStr(zold.Position); kever.Click; end; procedure Tablak.kekChange(Sender: TObject); begin Lkek.Caption:='Kék: '+IntToStr(kek.Position); kever.Click; end; procedure Tablak.keverClick(Sender: TObject); begin //itt keverem meg a színt szin.Color:=RGB(piros.Position,zold.Position,kek.Position); end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; end.
SpinEdit használata unit objektumok10; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, StdCtrls, Spin, Windows; //RGB színkeveréshez type Tablak = class(TForm) kever: TButton; kilep: TButton; piros: TSpinEdit; zold: TSpinEdit; kek: TSpinEdit; szin: TLabel; procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure kekChange(Sender: TObject); procedure keverClick(Sender: TObject); procedure kilepClick(Sender: TObject); procedure pirosChange(Sender: TObject); procedure zoldChange(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation {$R *.lfm}
85
procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra //ablak tulajdonságai: BorderStyle=bsSingle, BorderIcons=[], Color=$00DBDBDB, KeyPreview=True //Width=240, Height=200, Position=poDesktopCenter, Caption='SpinEdit használata' //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: caption='Kilépés', font.size=16, TabStop=False, //Width=80, Height=40, Left=45, Top=155 //létrehozok egy SpinEdit-et, az edit neve legyen piros piros.Font.Size:=16; //a szám nagysága (betűméret) piros.Font.Style:=[fsBold]; //legyen félkövér piros.Font.Color:=clWhite; //fehér színű legyen a szám piros.Color:=clRed; //piros legyen a háttérszíne piros.MaxLength:=3; //maximum 3 számot írhatok be piros.AutoSize:=False; piros.TabStop:=False; piros.Alignment:=taCenter; //középen helyezkedjen el a szám piros.Width:=75; //a hossza piros.Height:=40; //a magassága piros.MinValue:=0; //a legkisebb érték piros.MaxValue:=255; //a legnagyobb érték piros.Value:=0; //meghatározza az edit értékét piros.Increment:=1 //a jobb szélén lévő nyílakra kattintva 1-gyel nővekedjen ill. csökkenjen a SpinEdit aktuális értéke piros.Left:=5; piros.Top:=5; //létrehozok egy SpinEdit-et, az edit neve legyen zold zold.Font.Size:=16; //a szám nagysága (betűméret) zold.Font.Style:=[fsBold]; //legyen félkövér zold.Font.Color:=clWhite; //fehér színű legyen a szám zold.Color:=clGreen; //piros legyen a háttérszíne zold.MaxLength:=3; //maximum 3 számot írhatok be zold.AutoSize:=False; zold.TabStop:=False; zold.Alignment:=taCenter; //középen helyezkedjen el a szám zold.Width:=75; //a hossza zold.Height:=40; //a magassága zold.MinValue:=0; //a legkisebb érték zold.MaxValue:=255; //a legnagyobb érték zold.Value:=0; //meghatározza az edit értékét zold.Left:=5; zold.Top:=55; //létrehozok egy SpinEdit-et, az edit neve legyen kek kek.Font.Size:=16; //a szám nagysága (betűméret) kek.Font.Style:=[fsBold]; //legyen félkövér kek.Font.Color:=clWhite; //fehér színű legyen a szám kek.Color:=clBlue; //piros legyen a háttérszíne kek.MaxLength:=3; //maximum 3 számot írhatok be kek.AutoSize:=False; kek.TabStop:=False; kek.Alignment:=taCenter; //középen helyezkedjen el a szám kek.Width:=75; //a hossza kek.Height:=40; //a magassága kek.MinValue:=0; //a legkisebb érték kek.MaxValue:=255; //a legnagyobb érték kek.Value:=0; //meghatározza az edit értékét kek.Left:=5; kek.Top:=105; //létrehozok egy címkét(Label), a címke neve legyen szin //szin tulajdonságai: Autosize=False, Width=140, Height=140, Left=90, Top=5 //létrehozok egy gombot(Button), a gomb neve legyen kever //kever tulajdonságai: Visible=False, TabStop=False kever.Click; end;
86
procedure Tablak.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); //kéretlen karakterek kiszűrésére begin if (Key=107) or (Key=109) or (Key=189) then //ha + vagy - vagy - a lenyomott gomb Key := Ord(#0); //akkor olyan legyen, mintha nem nyomott volna le end; procedure Tablak.pirosChange(Sender: TObject); begin kever.Click; end; procedure Tablak.zoldChange(Sender: TObject); begin kever.Click; end; procedure Tablak.kekChange(Sender: TObject); begin kever.Click; end; procedure Tablak.keverClick(Sender: TObject); begin //itt keverem meg a színt szin.Color:=RGB(piros.Value,zold.Value,kek.Value); end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; end.
ListBox használata unit objektumok11; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, StdCtrls, Graphics; type Tablak = class(TForm) hozzaad: TButton; beszur: TButton; torles: TButton; tisztit: TButton; kilepes: TButton; doboz: TListBox; bevisz: TEdit; procedure FormCreate(Sender: TObject); procedure hozzaadClick(Sender: TObject); procedure beszurClick(Sender: TObject); procedure torlesClick(Sender: TObject); procedure tisztitClick(Sender: TObject); procedure kilepesClick(Sender: TObject); private { private declarations } public { public declarations } end;
87
var ablak: Tablak; res: byte; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768 felbontáson tervezve begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen bevisz //bevisz tulajdonságai: AutoSize=False, Text='', Color=clYellow, Width=190, Height=30, //MaxLength=15, Font.Size=14, Font.Color=$009D0D14, TabOrder=0 //létrehozok egy gombot(Button), a gomb neve legyen hozzaad //hozzaad tulajdonságai: caption='Hozzáad', width=75, height=25, font.size=9, TabOrder=1 //létrehozok egy gombot(Button), a gomb neve legyen beszur //beszur tulajdonságai: caption='Beszúr', width=75, height=25, font.size=9, TabOrder=2 //létrehozok egy gombot(Button), a gomb neve legyen torles //torles tulajdonságai: caption='Tétel törlés', width=75, height=25, font.size=9, TabOrder=3 //létrehozok egy gombot(Button), a gomb neve legyen tisztit //tisztit tulajdonságai: caption='Törlés', width=75, height=25, font.size=9, TabOrder=4 //létrehozok egy gombot(Button), a gomb neve legyen kilepes //kilepes tulajdonságai: caption='Kilépés', width=75, height=25, font.size=9, TabOrder=5 //létrehozok egy listadobozt(ListBox), a listadoboz neve legyen doboz //doboz tulajdonságai: Width=200, Height=200, Font.Size=14, Font.Color=clBlue, TabOrder=6 bevisz.Left:=10; bevisz.Top:=10; hozzaad.Left:=bevisz.Left; res:=hozzaad.Height+beszur.Height+torles.Height+tisztit.Height; //a 4 gomb magassága res:=res+3*15; //4 gomb és 15 px köztük res:=doboz.Height-res; //az alsó és felső rés együtt hozzaad.Top:=bevisz.Top+bevisz.Height+10+Round(res/2); //elhelyezem a gombot a megfelelő helyre beszur.Left:=bevisz.Left; beszur.Top:=hozzaad.Top+hozzaad.Height+15; //15 a rés torles.Left:=bevisz.Left; torles.Top:=beszur.Top+beszur.Height+15; tisztit.Left:=bevisz.Left; tisztit.Top:=torles.Top+torles.Height+15; doboz.Left:=hozzaad.Left+hozzaad.Width+20; //20 a rés doboz.Top:=bevisz.Top+bevisz.Height+10; kilepes.Left:=doboz.Left+doboz.Width-kilepes.Width; kilepes.Top:=bevisz.Top+Round((bevisz.Height-kilepes.Height)/2); ablak.Caption:='ListBox használata'; ablak.BorderStyle:=bsSingle; //a form nem méretezhető át, a rendszergombok alapállapotban vannak ablak.BorderIcons:=[]; //a kisméret, teljes méret és bezárás gomb eltűntetése ablak.color:=clSilver; ablak.Width:=doboz.Left+doboz.Width+10; //az ablak szélességének meghatározása ablak.Height:=doboz.Top+doboz.Height+10; //az ablak magasságának meghatározása ablak.position:=poDesktopCenter; //az ablak közepére helyezi az ablakot //doboz.MultiSelect:=True; --- több elem kijelölése //doboz.ExtendedSelect:=False; --- Shift és Ctrl nélkül is kitudok több elemet jelölni //bevisz.Text:=IntToStr(doboz.SelCount); --- a kiválasztót elemek számát adja //if doboz.Selected[1]=True then --- a 2. elem ki van-e jelölve? //doboz.Selected[2]:=True; --- kijelölöm a 3. elemet, ha nincs akkor lefagy doboz.Style:=lbOwnerDrawFixed; //ez a lista elem magasságának beállításához kell doboz.ItemHeight:=30; //ez a listában lévő elemek magassága //doboz.Sorted:=True; --- ABC rendbe rendezi a lista elemeit //doboz.Columns:=2; --- ha nem 0 vagy 1, akkor több oszlopban jeleniti meg, ha fullos akkor új oszlopba lép át //doboz.Items.SaveToFile('nevsor.txt'); --- mentem a lista elemeit //doboz.Items.LoadFromFile('nevsor.txt'); --- beolvasok a listadobozba //doboz.Items.Move(0,2); --- a lista első elemének áthelyezése a 3. helyre //doboz.BringToFront; --- a komponenst előre hozza //doboz.SendToBack; --- a komponenst hátra küldi end;
88
procedure Tablak.hozzaadClick(Sender: TObject); begin if bevisz.GetTextlen>0 then //ha nem üres az edit if doboz.Items.Indexof(bevisz.Text)=-1 then //ha nincs ilyen elem a listában doboz.Items.Add(bevisz.Text); //így tudok új elemet beszúrni a lista végére bevisz.Clear; //törlöm az edit tartalmát bevisz.SetFocus; //az editre fokuszálók end; procedure Tablak.beszurClick(Sender: TObject); begin if bevisz.GetTextlen>0 then //ha nem üres az edit if doboz.Items.Indexof(bevisz.Text)=-1 then //ha nincs ilyen elem a listában if doboz.ItemIndex>-1 then //ha van kiválasztva elem //ha -1 akkor nincs kiválasztva, különben 0-tól kezdődik a számozás doboz.Items.Insert(doboz.ItemIndex,bevisz.Text) //beszúrom a kijelölt elem elé else doboz.Items.Insert(0,bevisz.Text); //beszúrom a lista elejére bevisz.Clear; //törlöm az edit tartalmát bevisz.SetFocus; //az editre fokuszálók end; procedure Tablak.torlesClick(Sender: TObject); begin if doboz.ItemIndex>-1 then //ha van kiválasztva eéem doboz.Items.Delete(doboz.ItemIndex); //a kijelölt elemet törlöm, csak egyet bevisz.Setfocus; //az editre fokuszálok end; procedure Tablak.tisztitClick(Sender: TObject); begin doboz.Clear; //törlöm a listadoboz tartalmát bevisz.Clear; //törlöm az edit tartalmát bevisz.Setfocus; //az editre fokuszálók end; procedure Tablak.kilepesClick(Sender: TObject); begin Application.Terminate; end; end.
ComboBox használata unit objektumok12; {$mode objfpc}{$H+} interface uses Forms, StdCtrls, Classes, Controls, Graphics, ExtCtrls, SysUtils; type Tablak = class(TForm) vizsgal: TButton; formaz: TRadioGroup; szamol: TButton; ertek: TEdit; egyenlo: TLabel; szam2: TEdit; szam1: TEdit; muvelet: TComboBox; bezar: TButton; uj: TButton;
89
procedure bezarClick(Sender: TObject); procedure formazClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure szamolClick(Sender: TObject); procedure ujClick(Sender: TObject); procedure vizsgalClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; s:string; i:byte; ok:boolean; jo:array[1..2] of boolean; s1:qword; //nagyon nagy egész típus s2:qword; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1024x768-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //létrehozok egy kombinált listát(ComboBox), a lista neve legyen muvelet //muvelet tulajdonsagai: Text='', Style=csDropDown, AutoSize=False, Height=45, Width=45, //Font.Size=20, Font.Color=clBlue, Color=clYellow, Text='+', Items='+|-|*|/' //létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen szam1 //szam1 tulajdonságai: AutoSize=False, Font.Size=20, Font.Color=clBlue, Color=clYellow, //Height=45, Width=100, Alignment=taCenter, Text='', MaxLength=5, TabOrder=0, BorderStyle=bsNone //létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen szam2 //szam2 tulajdonságai: AutoSize=False, Font.Size=20, Font.Color=clBlue, Color=clYellow, //Height=45, Width=100, Alignment=taCenter, Text='', MaxLength=5, TabOrder=1, BorderStyle=bsNone //létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen ertek //ertek tulajdonságai: AutoSize=False, Font.Size=20, Font.Color=clBlue, Color=clYellow, //Height=45, Width=320, Alignment=taCenter, Text='', MaxLength=20, ReadOnly=True //létrehozok egy címkét(Label), a címke neve legyen egyenlo //egyenlo tulajdonságai: Caption='=', AutoSize=False, Height=44, Width=40, Font.Size=21, //Font.Color=clBlue, Color=clYellow, Alignment=taCenter, BorderStyle=bsNone //létrehozok egy gombot(Button), a gomb neve legyen szamol //szamol tulajdonságai: Font.Size=20, Caption='Számol', Height=40, Width=110 //létrehozok egy gombot(Button), a gomb neve legyen bezar //bezar tulajdonságai: Font.Size=20, Caption='Kilépés', Height=45, Width=110 //létrehozok egy gombot(Button), a gomb neve legyen uj //uj tulajdonságai: Font.Size=20, Caption='Új', Height=45, Width=60 //létrehozok egy jelölőcsoportot(CheckGroup), a csoport neve legyen formaz //formaz tulajdonságai: Caption='Formázási beállítások', Font.Size=16, //Height=150, Width=250, Items='Egyszerű|Lenyiló|Csak olvasható' //létrehozok egy gombot(Button), a gomb neve legyen vizsgal //vizsgal tulajdonságai: Visible=False szam1.Left:=10; szam1.Top:=10; muvelet.Left:=szam1.Left+szam1.Width+3; //3 a rés muvelet.Top:=szam1.Top; szam2.Left:=muvelet.Left+muvelet.Width+3; //3 a rés szam2.Top:=szam1.Top; egyenlo.Left:=szam2.Left+szam2.Width; egyenlo.Top:=szam1.Top; ertek.Left:=egyenlo.Left+egyenlo.Width; ertek.Top:=szam1.Top; uj.Left:=ertek.Left+ertek.Width-uj.Width; uj.Top:=ertek.Top+ertek.Height+20; //20 a rés
90
szamol.Left:=muvelet.Left-Round((szamol.Width-muvelet.Width)/2); szamol.Top:=uj.Top+Round((uj.Height-szamol.Height)/2); formaz.Left:=Round((bezar.Left-formaz.Width)/3); formaz.Top:=szamol.Top+szamol.Height+20; //20 a rés bezar.Left:=uj.Left+uj.Width-bezar.Width; bezar.Top:=formaz.Top+formaz.Height-bezar.Height; ablak.Caption:='ComboBox használata'; ablak.BorderStyle:=bsSingle; ablak.BorderIcons:=[]; ablak.Color:=clSilver; ablak.Width:=bezar.Left+bezar.Width+10; //10 a rés ablak.Height:=bezar.Top+bezar.Height+10; //10 a rés ablak.position:=poDesktopCenter; formaz.ItemIndex:=1; //muvelet.AutoComplete:=True; --- automatikus kiegészítő funkció bekapcsolása end; procedure Tablak.szamolClick(Sender: TObject); begin s:=szam1.Text; //az első szám ellenőrzése vizsgal.Click; if ok=true then jo[1]:=true else jo[1]:=false; s:=szam2.Text; //a második szám ellenőrzése vizsgal.Click; if ok=true then jo[2]:=true else jo[2]:=false; if (jo[1]=false) or (jo[2]=false) then ertek.Text:='Nem megfelelő számok' else begin case muvelet.Text of //megfelelő művelet elvégzése '+':ertek.Text:=inttostr(strtoint(szam1.Text)+strtoint(szam2.Text)); '-':ertek.Text:=inttostr(strtoint(szam1.Text)-strtoint(szam2.Text)); '*':begin s1:=strtoint(szam1.Text); s2:=strtoint(szam2.Text); ertek.Text:=inttostr(s1*s2); end; '/':if szam2.Text<>'0' then ertek.Text:=floattostr(strtoint(szam1.Text)/strtoint(szam2.Text)) else ertek.Text:='Nen osztunk 0-val'; else ertek.Text:='Nincs ilyen művelet'; end; end; end; procedure Tablak.ujClick(Sender: TObject); begin //tisztítóm az ablakot szam1.Clear; szam2.Clear; ertek.Clear; szam1.SetFocus; if (muvelet.Text<>'+') and (muvelet.Text<>'-') and (muvelet.Text<>'*') and (muvelet.Text<>'/') then muvelet.Text:='+'; end;
91
procedure Tablak.formazClick(Sender: TObject); begin //itt választók a 3 stílus közül case formaz.ItemIndex of 0:muvelet.Style:=csSimple; 1:muvelet.Style:=csDropDown; 2:muvelet.Style:=csDropDownList; end; end; procedure Tablak.vizsgalClick(Sender: TObject); begin //itt nézem meg a számokat, hogy megfelelő-e ok:=true; if (length(s)=0) or (length(s)>5) then ok:=false else for i:=1 to length(s) do if not(s[i] in ['0'..'9']) then ok:=false; if ok=true then begin ok:=false; for i:=1 to length(s) do if s[i] in ['1'..'9'] then ok:=true; if ok=true then begin i:=1; while not (s[i] in ['1'..'9']) do inc(i); if i<>1 then ok:=false; end else ok:=false; end; if (ok=false) and (s='0') then ok:=true; end; procedure Tablak.bezarClick(Sender: TObject); begin Application.Terminate; end; end.
92
LabeledEdit használata unit objektumok13; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, ExtCtrls, StdCtrls; type Tablak = class(TForm) bejelentkezes: TImage; kijelentkezes: TImage; kilepes: TImage; jelszo: TLabeledEdit; uzenet: TLabel; nev: TLabeledEdit; procedure bejelentkezesClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure jelszoClick(Sender: TObject); procedure kijelentkezesClick(Sender: TObject); procedure kilepesClick(Sender: TObject); procedure nevClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; kezdes: boolean; kezdes2: boolean; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1280x800-as felbontáson tervezett //szükséges 3 fájl: gomb1.jpg, gomb2.jpg, gomb3.jpg begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //létrehozok egy címkézett szövegdobozt(LabeledEdit), a szövegdoboz neve legyen nev //létrehozok egy címkézett szövegdobozt(LabeledEdit), a szövegdoboz neve legyen jelszo //létrehozok egy képet(Image), a kép neve legyen bejelentkezes //létrehozok egy képet(Image), a kép neve legyen kilepes //létrehozok egy cimkét(Label), a cimke neve legyen uzenet //létrehozok egy képet(Image), a kép neve legyen kijelentkezes nev.AutoSize:=False; nev.Font.Size:=16; nev.Font.Color:=clBlue; nev.Font.Style:=[fsItalic]; nev.Color:=clYellow; nev.Alignment:=taCenter; nev.Text:='Felhasználónév'; nev.Height:=35; nev.Width:=300; nev.LabelPosition:=lpAbove; //ez a címke pozícióját adja meg az edithez képest nev.LabelSpacing:=0; //az edit és címke közti távolság nev.EditLabel.Caption:='Felhasználói név'; //ez a címkére vonatkozik (EditLabel) nev.EditLabel.Font.Color:=clBlack; nev.EditLabel.Font.Size:=nev.Font.Size; //ez mindig olyan lesz mint az editnek nev.EditLabel.Font.Height:=35; //a címke magassága nev.TabStop:=False; jelszo.AutoSize:=False; jelszo.Font.Size:=16;
93
jelszo.Font.Color:=clBlue; jelszo.Color:=clYellow; jelszo.Alignment:=taCenter; jelszo.Text:='jelszó'; jelszo.PasswordChar:='+'; //jelszó karakter megadása jelszo.Height:=35; jelszo.Width:=300; jelszo.LabelPosition:=lpAbove; //ez a címke pozícióját adja meg az edithez képest jelszo.LabelSpacing:=0; //az edit és címke közti távolság jelszo.EditLabel.Caption:='Jelszó'; //ez a címkére vonatkozik (EditLabel) jelszo.EditLabel.Font.Color:=clBlack; jelszo.EditLabel.Font.Size:=jelszo.Font.Size; //ez mindig olyan lesz mint az editnek jelszo.EditLabel.Font.Height:=35; //a címke magassága jelszo.TabStop:=False; bejelentkezes.Width:=Round(ablak.Width/5); //a felbontásra nagyjából reagáljon bejelentkezes.Height:=32*Round((bejelentkezes.Width)/104); bejelentkezes.Proportional:=True; //méretarányok megtartása bejelentkezes.Stretch:=True; //a képet pont beleilleszti bejelentkezes.Picture.LoadFromFile('gomb1.jpg'); //kép betöltése kilepes.Width:=Round(ablak.Width/5); //a felbontásra nagyjából reagáljon kilepes.Height:=32*Round((kilepes.Width)/104); kilepes.Proportional:=True; //méretarányok megtartása kilepes.Stretch:=True; //a képet pont beleilleszti kilepes.Picture.LoadFromFile('gomb2.jpg'); //kép betöltése uzenet.Font.Size:=12; uzenet.Font.Color:=clRed; uzenet.Caption:='A megadott felhasználónév vagy jelszó helytelen.'; uzenet.Visible:=False; kijelentkezes.Width:=Round(ablak.Width/4); //a felbontásra nagyjából reagáljon kijelentkezes.Height:=Round(32*(kijelentkezes.Width/104)); kijelentkezes.Proportional:=True; //méretarányok megtartása kijelentkezes.Stretch:=True; //a képet pont beleilleszti kijelentkezes.Picture.LoadFromFile('gomb3.jpg'); //kép betöltése kijelentkezes.Visible:=False; ablak.BorderStyle:=bsSingle; ablak.Caption:='Bejelentkezés'; ablak.Color:=clSilver; ablak.Width:=500; ablak.Height:=250; ablak.Position:=poDesktopCenter; kezdes:=True; //kezdő érték megadása kezdes2:=True; //kezdő érték megadása nev.Left:=100; nev.Top:=50; jelszo.Left:=100; jelszo.Top:=nev.Top+nev.Height+nev.EditLabel.Font.Height+10; uzenet.Left:=jelszo.Left; uzenet.Top:=jelszo.Top+jelszo.Height+5; bejelentkezes.Left:=ablak.Width-bejelentkezes.Width; bejelentkezes.Top:=ablak.Height-bejelentkezes.Height-10; kilepes.Left:=10; kilepes.Top:=ablak.Height-kilepes.Height-10; kijelentkezes.Left:=Round((ablak.Width-kijelentkezes.Width)/2); kijelentkezes.Top:=Round((ablak.Height-kijelentkezes.Height)/2); end; procedure Tablak.nevClick(Sender: TObject); begin if kezdes=True then //ez a példa eltüntetésére szolgál begin nev.Font.Style:=[]; nev.Text:=''; kezdes:=False; end; end;
94
procedure Tablak.jelszoClick(Sender: TObject); begin if kezdes2=True then //ez a példa eltüntetésére szolgál begin jelszo.Text:=''; kezdes2:=False; end; end; procedure Tablak.bejelentkezesClick(Sender: TObject); begin //ha rákattintunk a bejelentkezés gombra if (nev.Text='Lazarus') and (jelszo.Text='mester') then begin nev.Visible:=False; jelszo.Visible:=False; bejelentkezes.Visible:=False; kilepes.Visible:=False; uzenet.Visible:=False; kijelentkezes.Visible:=True; end else begin jelszo.Clear; uzenet.Visible:=True; end; end; procedure Tablak.kijelentkezesClick(Sender: TObject); begin //ha kijelentkezünk kijelentkezes.Visible:=False; nev.Visible:=True; jelszo.Visible:=True; bejelentkezes.Visible:=True; kilepes.Visible:=True; jelszo.Text:='jelszó'; nev.Text:='Felhasználónév'; nev.Font.Style:=[fsItalic]; kezdes:=True; kezdes2:=True; end; procedure Tablak.kilepesClick(Sender: TObject); begin //ha rákattintunk a kilépés gombra Application.Terminate; end; end.
MaskEdit használata unit objektumok14; {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, StdCtrls, maskedit; //MaskEdithez kell
95
type Tablak = class(TForm) vtelszam: TButton; vjelszo: TButton; vemail: TButton; vnev: TButton; kilep: TButton; cjelszo2: TLabel; cemail: TLabel; cnev: TLabel; cjelszo1: TLabel; ctelszam: TLabel; jelszo1: TEdit; jelszo2: TEdit; hiba: TLabel; regisztral: TButton; telszam: TMaskEdit; nev: TEdit; email: TEdit; procedure FormCreate(Sender: TObject); procedure kilepClick(Sender: TObject); procedure regisztralClick(Sender: TObject); procedure vemailClick(Sender: TObject); procedure vjelszoClick(Sender: TObject); procedure vnevClick(Sender: TObject); procedure vtelszamClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; i: byte; tnev: string; temail: string; tjelszo1: string; tjelszo2: string; ttelszam: string; enev: boolean; eemail: boolean; ejelszo: boolean; etelszam: boolean; s:string; s2:string; f:text; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1280x800-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //ablak tulajdonságai: BorderStyle=bsSingle, Caption='Regisztráció', Color=clSilver, Width=520, Height=285, Position=poDesktopCenter //létrehozok egy cimkét(Label), a cimke neve legyen cnev //cnev tulajdonságai: Font.Size=16, Font.Color=clBlue, Caption='Felhasználónév:' //létrehozok egy cimkét(Label), a cimke neve legyen cemail //cemail tulajdonságai: Font.Size=16, Font.Color=clBlue, Caption='Email:' //létrehozok egy cimkét(Label), a cimke neve legyen cjelszo1 //cjelszo1 tulajdonságai: Font.Size=16, Font.Color=clBlue, Caption='Jelszó:' //létrehozok egy cimkét(Label), a cimke neve legyen cjelszo2 //cjelszo2 tulajdonságai: Font.Size=16, Font.Color=clBlue, Caption='Jelszó megerősítése' //létrehozok egy cimkét(Label), a cimke neve legyen ctelszam //ctelszam tulajdonságai: Font.Size=16, Font.Color=clBlue, Caption='Mobilszám:'
96
//létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen nev //nev tulajdonságai: Font.Size=16, Font.Color=clBlue, Color=clYellow, Text='', Width=280, BorderStyle=bsNone, TabStop=False //létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen email //email tulajdonságai: Font.Size=16, Font.Color=clBlue, Color=clYellow, Text='', Width=280, BorderStyle=bsNone, TabStop=False //létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen jelszo1 //jelszo1 tulajdonságai: Font.Size=16, Font.Color=clBlue, Color=clYellow, Text='', PasswordChar='*', Width=160, BorderStyle=bsNone, TabStop=False //létrehozok egy szövegdobozt(Edit), a szövegdoboz neve legyen jelszo2 //jelszo2 tulajdonságai: Font.Size=16, Font.Color=clBlue, Color=clYellow, Text='', PasswordChar='*', Width=160, BorderStyle=bsNone, TabStop=False //létrehozok egy maszkolható szövegdobozt(MaskEdit), a szövegdoboz neve legyen telszam //telszam tulajdonságai: Font.Size=16, Font.Color=clBlue, Color=clYellow, Text='', EditMask='00-00-000-0000;0;_', Width=160, BorderStyle=bsNone, TabStop=False //EditMask 3 része: a maszk; megjelenjen-e a formázás a tartalomban; beírandó karakterek helyét jelölő jel //létrehozok egy cimkét(Label), a cimke neve legyen hiba //hiba tulajdonságai: Font.Size=16, Font.Color=clGreen, Caption='Sikeres regisztráció!', Visible=False //létrehozok egy gombot(Button), a gomb neve legyen kilep //kilep tulajdonságai: Font.Size=20, Caption='Kilépés', Height=45, Width=110, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen regisztral //regisztral tulajdonságai: Font.Size=20, Caption='Regisztrálás', Height=45, Width=160, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen vnev //vnev tulajdonságai: Visible=False //létrehozok egy gombot(Button), a gomb neve legyen vemail //vemail tulajdonságai: Visible=False //létrehozok egy gombot(Button), a gomb neve legyen vjelszo //vjelszo tulajdonságai: Visible=False //létrehozok egy gombot(Button), a gomb neve legyen vtelszam //vtelszam tulajdonságai: Visible=False end; procedure Tablak.regisztralClick(Sender: TObject); begin //regisztráció vnev.Click; vemail.Click; vjelszo.Click; vtelszam.Click; if (enev=True) and (eemail=True) and (ejelszo=True) and (etelszam=True) then begin //sikeres regisztrálás hiba.Visible:=True; nev.Enabled:=False; email.Enabled:=False; jelszo1.Enabled:=False; jelszo2.Enabled:=False; telszam.Enabled:=False; regisztral.Enabled:=False; //adatok kimentése txt-be AssignFile(f,'adatok.txt'); //formos ablak esetén így kell ReWrite(f); writeln(f,tnev); writeln(f,temail); writeln(f,tjelszo1); writeln(f,ttelszam); CloseFile(f); end; end; procedure Tablak.vnevClick(Sender: TObject); begin //név vizsgálata enev:=False; tnev:=nev.Text;
97
if length(tnev)>=3 then //minimum 3 betű begin i:=1; while (tnev[i]<>' ') and (i<=length(tnev)) do //ha nincs benne szóköz inc(i); if i>length(tnev) then enev:=True; end; if enev=False then begin nev.Clear; nev.Color:=clRed; end else nev.Color:=clLime; //vizsgálhatnék sok dolgot, de most ennyi elég lesz end; procedure Tablak.vemailClick(Sender: TObject); begin //email vizsgálata eemail:=False; temail:=email.Text; if length(temail)>=3 then //minimum 3 karakter if (temail[1]='a') or (temail[1]='b') or (temail[1]='c') or (temail[1]='d') or (temail[1]='e') or (temail[1]='f') or (temail[1]='g') or (temail[1]='h') or (temail[1]='i') or (temail[1]='j') or (temail[1]='k') or (temail[1]='l') or (temail[1]='m') or (temail[1]='n') or (temail[1]='o') or (temail[1]='p') or (temail[1]='q') or (temail[1]='r') or (temail[1]='s') or (temail[1]='t') or (temail[1]='u') or (temail[1]='v') or (temail[1]='w') or (temail[1]='x') or (temail[1]='y') or (temail[1]='z') then //kisbetűvel kezdődik begin i:=2; while (temail[i]<>'@') and (i<=length(temail)) do inc(i); if i'@') and (i<=length(temail)) do inc(i); if i>length(temail) then //csak 1 @ van benne begin if temail[2]<>'@' then s:=temail[2]; i:=3; while temail[i]<>'@' do //a @ előtti rész begin s:=s+temail[i]; inc(i); end; inc(i); s2:=temail[i]; inc(i); if length(temail)>=i then while i<=length(temail) do //a @ utáni rész begin s2:=s2+temail[i]; inc(i); end; eemail:=True; i:=2; while (i<=length(s)) and (eemail=True) do if (s[i]<>'a') and (s[i]<>'b') and (s[i]<>'c') and (s[i]<>'d') and (s[i]<>'e') and (s[i]<>'f') and (s[i]<>'g') and (s[i]<>'h') and (s[i]<>'i') and (s[i]<>'j') and (s[i]<>'k') and (s[i]<>'l') and (s[i]<>'m') and (s[i]<>'n') and (s[i]<>'o') and (s[i]<>'p') and (s[i]<>'q') and (s[i]<>'r') and (s[i]<>'s') and (s[i]<>'t') and (s[i]<>'u') and (s[i]<>'v') and (s[i]<>'w') and (s[i]<>'x') and (s[i]<>'y') and (s[i]<>'z') and (s[i]<>'0') and (s[i]<>'1') and (s[i]<>'2') and (s[i]<>'3') and
98
(s[i]<>'4') and (s[i]<>'5') and (s[i]<>'6') and (s[i]<>'7') and (s[i]<>'8') and (s[i]<>'9') and (s[i]<>'.') and (s[i]<>'-') and (s[i]<>'_') then eemail:=False else inc(i); if eemail=True then begin eemail:=False; if (s2='freemail.hu') or (s2='citromail.hu') or (s2='gmail.com') or (s2='gmail.hu') or (s2='hotmail.com') then //csak ennyit fogad el, de van több is begin eemail:=True; end; end; end; end; end; if eemail=False then begin email.Clear; email.Color:=clRed; end else email.Color:=clLime; end; procedure Tablak.vjelszoClick(Sender: TObject); begin //jelszó vizsgálata ejelszo:=False; tjelszo1:=jelszo1.Text; tjelszo2:=jelszo2.Text; if length(tjelszo1)>=5 then //ha minimum 5 karakter if tjelszo2=tjelszo1 then //ha azonos a begépelt jelszó begin ejelszo:=False; i:=1; while (tjelszo1[i]<>' ') and (i<=length(tjelszo1)) do inc(i); if i>length(tjelszo1) then //ha nincs benne szóköz //most meg kell nézni hogy csak jelszó karakter legyen benne, de ezt nem tudom hogyan kell ejelszo:=True else begin jelszo1.Clear; jelszo1.Color:=clRed; jelszo2.Clear; jelszo2.Color:=clRed; end; end else begin jelszo2.Clear; jelszo2.Color:=clRed; end else begin jelszo1.Clear; jelszo1.Color:=clRed; jelszo2.Clear; jelszo2.Color:=clRed; end;
99
if ejelszo=True then begin jelszo1.Color:=clLime; jelszo2.Color:=clLime; end; end; procedure Tablak.vtelszamClick(Sender: TObject); begin //mobilszám vizsgálata etelszam:=False; ttelszam:=telszam.Text; if length(ttelszam)=11 then if ((ttelszam[1]+ttelszam[2]='06') and ((ttelszam[3]+ttelszam[4]='20') or (ttelszam[3]+ttelszam[4]='30') or (ttelszam[3]+ttelszam[4]='70'))) then etelszam:=True; if etelszam=False then begin telszam.Clear; telszam.Color:=clRed; end else telszam.Color:=clLime; end; procedure Tablak.kilepClick(Sender: TObject); begin Application.Terminate; end; end. //A maszk speciális karaktereinek listája és jelentésük:
Jel
Szerepe
>
Ha szerepel a maszkban, az őt követő karakterek nagybetűsként jelennek meg, amíg nincs vége a maszknak, vagy nem következik egy < karakter.
<
Ha szerepel a maszkban, az őt követő karakterek kisbetűsként jelennek meg, amíg nincs vége a maszknak, vagy nem következik egy > karakter.
<>
Ez után a kettős jel után semmilyen ellenőrzés nincs nagy, illetve kisbetűség szempontjából.
\
Ezt a jelet mindig egy szöveges karakter követi, mely meg is jelenik a beviteli mezőben. Segítségével a maszkolásra használt karakterek is megjeleníthetők.
L
A jel megköveteli egy ábécébeli karakter használatát az adott helyen.
l
A jel (kis L) megengedi, de nem követeli meg egy ábécébeli karakter használatát az adott helyen.
A
A jel megköveteli egy karakter (ábécébeli vagy szám) használatát az adott helyen.
a
A jel megengedi, de nem követeli meg egy karakter (ábécébeli vagy szám) használatát az adott helyen.
C
A jel megköveteli egy tetszőleges karakter használatát az adott helyen.
c
A jel megengedi, de nem követeli meg egy tetszőleges karakter használatát az adott helyen.
0
A jel megköveteli egy számkarakter használatát az adott helyen.
9
A jel megengedi, de nem követeli meg egy számkarakter használatát az adott helyen.
#
A jel megengedi, de nem követeli meg egy számkarakter vagy egy + vagy egy – jel használatát az adott helyen.
100
:
Ez a jel arra használható, hogy az időformátumban elválassza az órát, percet és másodpercet. Ha a számítógép területi beállításainál más jel van megadva erre a célra, akkor automatikusan az a jel fog megjelenni a beviteli mezőben.
/
Ez a jel arra használható, hogy a dátumformátumban elválassza a hónapokat, napokat, és az éveket. Ha a számítógép területi beállításainál más jel van megadva erre a célra, akkor automatikusan az a jel fog megjelenni a beviteli mez"ben.
;
Ez a jel választja szét a maszk három részét.
_
A jel automatikusan szóközt ír a szövegbe. Amikor a felhasználó ír a beviteli mezőbe, a kurzor átugorja a _ karaktert.
StringGrid használata unit objektumok15; {$mode objfpc}{$H+} interface uses Forms, Classes, Graphics, StdCtrls, SysUtils, Spin, //SpinEdit-hez Grids; //StringGrid-hez type Tablak = class(TForm) cimke: TLabel; rendez: TButton; general: TButton; meret: TSpinEdit; tablazat: TStringGrid; procedure FormCreate(Sender: TObject); procedure generalClick(Sender: TObject); procedure meretChange(Sender: TObject); procedure rendezClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; i:byte; j:byte; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1280x800-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //ablak tulajdonságai: BorderStyle=bsSingle, Caption='StringGrid használata', Color=clSilver, Width=520, Height=370, Position=poDesktopCenter //létrehozok egy gombot(Button), a gomb neve legyen general //general tulajdonságai: Font.Size=16, Caption='Generálás', Height=40, Width=110, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen rendez //rendez tulajdonságai: Font.Size=16, Caption='Rendezés', Height=40, Width=110, TabStop=False, Enabled=False //létrehozok egy címkét(Label), a címke neve legyen cimke //cimke tulajdonságai: Caption='A négyzet mérete:', Font.Size=14, Font.Color=clBlue //létrehozok egy SpinEdit-et, az edit neve legyen meret //létrehozok egy táblázatot(StringGrid), a táblázat neve legyen tablazat
101
tablazat.DefaultColWidth:=30; //alapértelmezett oszlop szélesség tablazat.DefaultRowHeight:=30; //alapértelmezett sor magasság tablazat.FixedCols:=0; //rögzített oszlopok száma tablazat.FixedRows:=0; //rögzített sorok száma tablazat.FixedColor:=clGreen; //rögzített cellák háttérszíne tablazat.ScrollBars:=ssNone; //ne legyen gördítősáv tablazat.GridLineWidth:=3; //a cellák közti vonal vastagsága tablazat.GridLineColor:=clRed; //a cellák közti vonal színe meret.MaxValue:=10; //legnagyobb érték meret.MinValue:=3; //legkisebb érték meret.Value:=3; //kezdő érték tablazat.ColCount:=meret.Value; //oszlopok száma fixel együtt tablazat.RowCount:=meret.Value; //sorok száma fixel együtt //beállítjuk a StringGrid szélességét és magasságát tablazat.Width:=meret.Value*tablazat.DefaultColWidth+meret.Value; tablazat.Height:=meret.Value*tablazat.DefaultRowHeight+meret.Value; rendez.Enabled:=False; //a rendezés gombot nem elérhetővé tesszük Randomize; //véletlenszám generátor elinditása //egyéb StringGrid beállítások //tablazat.Flat:=True; //a rögzített mezők laposak lesznek //tablazat.AutoAdvance:=aaNone; //a Tab hatására a kijelölt mezőből nem lép tovább //tablazat.Color:=clLime; //a táblázat háttérszíne //tablazat.AlternateColor:=clBlue; //váltósoros háttérszín end; //tablazat.Options:=[…];
102
procedure Tablak.meretChange(Sender: TObject); begin //töröljük a cellák tartalmát for i:=0 to tablazat.ColCount-1 do //0-tól kezdődik a cellák számozása for j:=0 to tablazat.RowCount-1 do tablazat.Cells[i,j]:=''; //így tudok írni a táblázat celláiba rendez.Enabled:=False; //a rendezés gombot nem elérhetővé tesszük tablazat.ColCount:=meret.Value; //beállítjuk a sorok és oszlopok számát tablazat.RowCount:=meret.Value; //beállítjuk a StringGrid szélességét és magasságát tablazat.Width:=meret.Value*tablazat.DefaultColWidth+meret.Value; tablazat.Height:=meret.Value*tablazat.DefaultRowHeight+meret.Value; end; procedure Tablak.generalClick(Sender: TObject); begin //a cellákba 10-99 közötti véletlen számokat generálunk for i:=0 to tablazat.ColCount-1 do for j:=0 to tablazat.RowCount-1 do tablazat.Cells[i,j]:=' '+IntToStr(Random(90)+10); //így olyan mintha középre lenne igazítva rendez.Enabled:=True; //a rendezés gombot elérhetővé tesszük end; procedure Tablak.rendezClick(Sender: TObject); var //ez egy lokális deklaráció ei:byte; ej:byte; s:string; csere:boolean; begin //az alábbi sor kiadásával nem kell mindig megadnunk hogy pl. tablazat.Cells[i,j], //helyette elég a Cells[i,j] a with parancson belül with tablazat do repeat ei:=0; //előző cella sorindexe ej:=0; //előző cella oszlopindexe csere:=False; //azt jelzi, hogy volt-e csere (false=nem volt) for j:=0 to RowCount-1 do for i:=0 to ColCount-1 do begin //összehasonlítjuk az aktuális cellát az előzővel if StrToInt(Cells[i,j])<StrToInt(Cells[ei,ej]) then begin s:=Cells[i,j]; Cells[i,j]:=Cells[ei,ej]; Cells[ei,ej]:=s; csere:=true; end; ei:=i; //beállítjuk az előző cellát az aktuális cellára ej:=j; end; until not csere; //addig megyünk végig az egész StringGrid-en, amíg igaz nem lesz, hogy csere=false rendez.Enabled:=False; //már rendeztük, ezért már nem tudjuk end; end.
103
Timer használata unit objektumok16; {$mode objfpc}{$H+} interface uses Forms, Classes, StdCtrls, ExtCtrls, StrUtils; //ez a RightStr és LeftStr parancsokhoz kell type Tablak = class(TForm) Timer1: TTimer; uzenet: TLabel; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1280x800-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //ablak tulajdonságai: BorderStyle=bsSingle, Caption='Üzenetszalag', Color=clSilver, Width=620, Height=60, Position=poDesktopCenter //létrehozok egy címkét(Label), a címke neve legyen uzenet //uzenet tulajdonságai: Caption='Üdv! Ez egy példa a Timer komponens használatára.', Font.Size=20, Font.Color=clBlue, AutoSize=False, Width=620, Alignment=taCenter, Left=0, Top=11, Color=clYellow //létrehozok egy Timert, a Timer neve legyen Timer1 Timer1.Interval:=150; //várakozási idő milliszekundomban end;
procedure Tablak.Timer1Timer(Sender: TObject); begin uzenet.Caption:=RightStr(uzenet.Caption,Length(uzenet.Caption)-1)+ //a felírat jobb oldalából minden, csak az első karakter nem LeftStr(uzenet.Caption,1); //a felírat első karaktere end; end.
Image használata unit objektumok17; {$mode objfpc}{$H+} interface uses Forms, Classes, Graphics, ExtCtrls;
104
type Tablak = class(TForm) kep1: TImage; procedure FormCreate(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1280x800-as felbontáson tervezett //kell egy kep.png fájl begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //ablak tulajdonságai: BorderStyle=bsSingle, Caption='Image használata', Color=clSilver, Width=310, Height=160, Position=poDesktopCenter //létrehozok egy képet(Image), a kép neve legyen kep1 kep1.Width:=300; //kép szélessége kep1.Height:=150; //kép magassága kep1.Left:=5; kep1.Top:=5; kep1.Proportional:=True; //méretarányok megtartása kep1.Stretch:=True; //a képet pont beleilleszti kep1.Picture.LoadFromFile('kep.png'); //kép megnyitása //kep1.AutoSize:=True; //a kép igazódik a betöltött kép méretére //kep1.Center:=True; //a betöltött képet középre helyezi a képben kep1.Transparent:=True; //a képen található háttérszín átlátszóvá válik end; end.
Image használata 2. unit objektumok17_2; {$mode objfpc}{$H+} interface uses Forms, Classes, Graphics, ExtCtrls; type Tablak = class(TForm) kep1: TImage; procedure FormCreate(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; X:word; Y:word; szin:TColor; implementation {$R *.lfm}
105
procedure Tablak.FormCreate(Sender: TObject); //1280x800-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //ablak tulajdonságai: BorderStyle=bsSingle, Caption='Image használata', Color=clSilver, Width=310, Height=310, Position=poDesktopCenter //létrehozok egy képet(Image), a kép neve legyen kep1 //kép1 tulajdonságai: Width=300, Height=300, Left=5, Top=5 X:=40; //41. oszlop a pixeltáblában (0-val kezdődik) Y:=100; //101. sor szin:=clYellow; //ez egy szín típus kep1.Canvas.Pixels[X,Y]:=szin; //1 pixel színének megváltoztatása kep1.Canvas.Pen.Color:=clRed; //a rajzoló toll színe kep1.Canvas.MoveTo(0,0); //a tollat egy megadott pixel főlé vihetjük //vonalat húzzunk a bal felső sarokból a jobb alsó sarokba kep1.Canvas.LineTo(kep1.Width-1,kep1.Height-1); kep1.Canvas.Pen.Color:=clBlack; //a toll színe kep1.Canvas.Brush.Color:=clWhite; //a kitöltő festék színe //téglalap rajzolása X1,Y1,X2,Y2 koordináták alapján a beállított színekkel kep1.Canvas.Rectangle(0,0,kep1.Width-1,kep1.Height-1); //egy kitöltetlen téglalapot rajzol, ahol a színt a Brush határozza meg kep1.Canvas.Brush.Color:=clRed; kep1.Canvas.FrameRect(9,9,200,100); //egy kitöltött, de keret nélküli téglalap rajzolása kep1.Canvas.Brush.Color:=clBlue; kep1.Canvas.FillRect(0,0,kep1.Width,kep1.Height); //itt a jobb alsó sarok nem lesz beszinezve, ezért kell 1-el nagyobb //ellipszist rajzolni a képzeletbeli határoló téglalap segítségével tudunk kep1.Canvas.Pen.Color:=clRed; kep1.Canvas.Brush.Color:=clLime; kep1.Canvas.Ellipse(20,20,Width-20,Height-100); //az alakzat körvonalát rajzolja meg a pontok alapján kep1.Canvas.Pen.Color:=clRed; kep1.Canvas.Polyline([Point(10,10),Point(10,40),Point(70,40),Point(10,10)]); //Így tudunk sokszöget rajzolni, és ha zárt sokszög, akkor ki is tölti azt kep1.Canvas.Pen.Color:=clRed; kep1.Canvas.Brush.Color:=clYellow; kep1.Canvas.Polygon([Point(120,110),Point(160,110),Point(170,130), Point(160,150),Point(120,150),Point(110,130)]); end; end.
Image használata 3. unit objektumok17_3; {$mode objfpc}{$H+} interface uses Forms, Classes, Graphics, ExtCtrls, StdCtrls; type Tablak = class(TForm) bezar: TButton; torol: TButton; kep1: TImage; teglalap: TButton; ellipszis: TButton; haromszog: TButton; sokszog: TButton; betolt: TButton;
106
procedure betoltClick(Sender: TObject); procedure bezarClick(Sender: TObject); procedure ellipszisClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure haromszogClick(Sender: TObject); procedure sokszogClick(Sender: TObject); procedure teglalapClick(Sender: TObject); procedure torolClick(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; implementation {$R *.lfm} procedure Tablak.FormCreate(Sender: TObject); //1280x800-as felbontáson tervezett begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //ablak tulajdonságai: BorderStyle=bsSingle, Caption='Image használata', Color=clSilver, Width=450, Height=310, Position=poDesktopCenter //létrehozok egy képet(Image), a kép neve legyen kep1 //kép1 tulajdonságai: Width=300, Height=300, Left=5, Top=5 //létrehozok egy gombot(Button), a gomb neve legyen torol //torol tulajdonságai: Font.Size=16, Caption='Letöröl', Height=40, Width=130, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen teglalap //teglalap tulajdonságai: Font.Size=16, Caption='Téglalap', Height=40, Width=130, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen ellipszis //ellipszis tulajdonságai: Font.Size=16, Caption='Ellipszis', Height=40, Width=130, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen haromszog //haromszog tulajdonságai: Font.Size=16, Caption='Háromszög', Height=40, Width=130, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen sokszog //sokszog tulajdonságai: Font.Size=16, Caption='Sokszög', Height=40, Width=130, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen betolt //betolt tulajdonságai: Font.Size=16, Caption='Képet betölt', Height=40, Width=130, TabStop=False //létrehozok egy gombot(Button), a gomb neve legyen bezar //bezar tulajdonságai: Font.Size=16, Caption='Bezárás', Height=40, Width=130, TabStop=False torol.Click; end; procedure Tablak.torolClick(Sender: TObject); //kép törlése begin if kep1.Picture<>nil then //ha az Image-ben van egy kép begin; kep1.Picture.Clear;//azt ki kell törölnünk kep1.Proportional:=False; kep1.Stretch:=False; kep1.Width:=300;//majd a szélességet és a magasságot kep1.Height:=300;//az eredetire vissza kell állítanunk end; kep1.Canvas.Pen.Color:=clBlack; kep1.Canvas.Brush.Color:=clWhite; kep1.Canvas.Rectangle(1,1,299,299); end; procedure Tablak.teglalapClick(Sender: TObject); //téglalap rajzolása begin kep1.Canvas.Pen.Color:=clRed; kep1.Canvas.Rectangle(10,10,100,50); end;
107
procedure Tablak.ellipszisClick(Sender: TObject); //ellipszis rajzolása begin kep1.Canvas.Pen.Color:=clBlue; kep1.Canvas.Ellipse(45,35,135,85); end; procedure Tablak.haromszogClick(Sender: TObject); //háromszög rajzolása begin kep1.Canvas.Pen.Color:=clBlack; kep1.Canvas.Polyline([Point(10,40),Point(10,90),Point(110,90),Point(10,40)]); end; procedure Tablak.sokszogClick(Sender: TObject); //sokszög rajzolása begin kep1.Canvas.Pen.Color:=clGreen; kep1.Canvas.Polygon([Point(20,120),Point(40,40),Point(98,72),Point(65,34),Point(81,132)]); end; procedure Tablak.betoltClick(Sender: TObject); //kép betöltése begin kep1.Proportional:=True; kep1.Stretch:=True; kep1.Picture.LoadFromFile('kep.png'); end; procedure Tablak.bezarClick(Sender: TObject); //alkalmazás bezárása begin Application.Terminate; end; end.
Image használata 4. unit objektumok17_4; //képernyő kímélő készítése {$mode objfpc}{$H+} interface uses Forms, Classes, Controls, Graphics, ExtCtrls, Windows; //az egér poziciójának lekérésére type Tablak = class(TForm) leggomb: TImage; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Timer1Timer(Sender: TObject); private { private declarations } public { public declarations } end; var ablak: Tablak; egerpoz1: TPoint; egerpoz2: TPoint; elmozdulas: integer; implementation {$R *.lfm}
108
procedure Tablak.FormCreate(Sender: TObject); //1280x800-as felbontáson tervezett //szükséges egy fájl: leggomb.png begin //a form nevét megváltoztatom ablak-ra az Object Inspector Properties részében //ablak tulajdonságai: Caption='Képernyőkímélő', BorderStyle=bsNone //létrehozok egy képet(Image), a kép neve legyen leggomb //leggomb tulajdonságai: Width=112, Height=200, Picture=leggomb.png //létrehozok egy Timert, a Timer neve legyen Timer1 //Timer1 tulajdonságai: Interval=10 ablak.Left:=0; ablak.Top:=0; ablak.Width:=Screen.Width; ablak.Height:=Screen.Height; Randomize; leggomb.Top:=Random(Screen.Height-leggomb.Height); leggomb.Left:=Random(Screen.Width-leggomb.Width); ablak.Color:=clBlack; ablak.Cursor:=crNone; ablak.DoubleBuffered:=True; //a form-unk nem közvetlenül a képernyőn lesz átrajzolva, hanem egy bitmap segítségével a memóriában GetCursorPos(egerpoz1); //az egér helyét lekérve értéket adunk a kezdőpoziciónak end; procedure Tablak.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin //ha lenyomok egy gombot Application.Terminate; end; procedure Tablak.Timer1Timer(Sender: TObject); begin //a léggömb mozgatása leggomb.Left:=leggomb.Left+1; if leggomb.Left>ablak.Width then begin leggomb.Left:=-leggomb.Width; leggomb.Top:=Random(ablak.Height-leggomb.Height); end; //egér vizsgálata GetCursorPos(egerpoz2); //az egér aktuális helyének lekérése elmozdulas:=Round(sqrt(sqr(egerpoz1.x-egerpoz2.x)+sqr(egerpoz1.y-egerpoz2.y))); //pitagorasz tétel alkalmazása if elmozdulas>10 then //ha megmozditottuk az egeret Application.Terminate; //akkor kilép end; end.
109
Tovább
110
Tartalomjegyzék Típusok, operátorok, kifejezések, műveletek és precedencia Színjelöléseim Kiíratás Beolvasás Alapműveletek If…else… használata Case_of használata For ciklus While ciklus Repeat ciklus Egy dimenziós tömb használata Kilépés csak ENTER gombbal Összegzés, eldöntés és kiválasztás tétele Lineáris keresés, megszámlálás, kiválogatás, maximum-kiválasztás és minimum-kiválasztás tétele Metszetképzés és unióképzés tétele Minimum-kiválasztásos, maximum-kiválasztásos, buborék és beszúrásos rendezés Lineáris és logaritmikus keresések Az összefuttatás tétele Kétdimenziós tömb (mátrix) használata Rekord létrehozása és használata Formázott kiíratás Műveletek, függvények és eljárások Egyirányú láncolt lista használata Beszúrásos rendezés az egyirányú láncolt listában Törlés az egyirányú láncolt listából Kétirányú láncolt lista használata, beszúrás a listába, törlés a listából Öröknaptár készítése Prímszám meghatározása Átváltás 10-es számrendszerből 2-esbe Faktoriális számítása Pénzösszeg legegyszerűbb kifizetése Prímtényezős felbontás Segéd program programozáshoz 1. (35 db azonos objektum tulajdonságai állítása) Segéd program programozáshoz 2. (35 db azonos objektum tulajdonságai állítása) Felírat késleltetése 1. Felírat késleltetése 2.
1. 3. 3. 3. 4. 5. 6. 6. 7. 7. 8. 8. 10. 11. 13. 15. 18. 22. 26. 27. 28. 31. 36. 38. 41. 44. 49. 50. 52. 53. 55. 57. 58. 59. 60. 61. 111
Hang lejátszása 1. WinForm-os ablak Button és Label használata 1. Button és Label használata 2. Edit használata RadioButton használata CheckBox használata Üzenetablakok használata RadioGroup használata CheckGroup használata Memo használata ScrollBar használata SpinEdit használata ListBox használata ComboBox használata LabeledEdit használata MaskEdit használata StringGrid használata Timer használata Image használata Image használata 2. Image használata 3. Image használata 4. Tovább
63. 64. 66. 67. 68. 70. 72. 76. 78. 80. 82. 83. 85. 87. 89. 93. 95. 101. 104. 104. 105. 106. 108. 110.
112