"Okamžité přečtení klávesy" – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

"Okamžité přečtení klávesy" – Pascal – Fórum – Programujte.com"Okamžité přečtení klávesy" – Pascal – Fórum – Programujte.com

 

Jeyekomon0
Stálý člen
9. 11. 2009   #1
-
0
-

Omlouvám se za trochu neohrabaný titulek, ale nevím, jak ten problém přesně pojmenovat.

Když si v mých dosavadních prográmcích vytvořím menu (A., B., C., ..), tak je jeho ovládání realizováno stylem "Zvolte písmeno: ", uživatel stiskne požadované písmeno (A, B, C), ono se vypíše za výše zmiňovanou hlášku na obrazovce a program čeká na uživatelovo potvrzení Enterem.
To všechno je sice fajn a funkční, ale přijde mi to nesmírně neohrabané.
Viděl jsem, že se nějakým způsobem dá s programem komunikovat "interaktivně", tedy okamžitě. Člověk jen zmáčkne klávesu a žádný potvrzovací Enter už není zapotřebí.
Mohli byste poradit, jak na to? Rád bych své prográmky pozvedl na trochu vyšší úroveň. :)

A hned mě napadlo, že by se na tom mohla založit spousta her. Třeba takový Had (ale to je ještě úroveň výš :) ) se určitě s omocí něčeho takového dělá..

Díky za pomoc.

Nahlásit jako SPAM
IP: 195.113.26.–
jjk
KIIV
~ Moderátor
+43
God of flame
9. 11. 2009   #2
-
0
-

knihovna crt a jeji funkce readkey

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jeyekomon0
Stálý člen
10. 11. 2009   #3
-
0
-

KIIV napsal:
knihovna crt a jeji funkce readkey


Ooo, s knihovnami jsem sice ještě nepracoval, ale to se poddá. :)
Aspoň už vím, co googlit. :)
Díky.

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
Jeyekomon0
Stálý člen
10. 11. 2009   #4
-
0
-

Jeyekomon napsal:Aspoň už vím, co googlit. :)


Tak jsem strávil něco přes hodinu na googlu a jsem tady zpět pro další radu.
Sanžil jsem se najít seznam těch defaultních knihoven (crt, system, math, dos, ..) a jejich funkcí. Pokud bych nechtěl příliš, tak ještě popis těch funkcí nebo příklad jejich použití. Prostě takovou referenční příručku.
Ale ne, že bych toho našel málo. Nenašel jsem totiž nic.
Prosím tedy o rozřešení mé frustrace - jde jen na mě ospalost a nebo je opravdu takový problém něco podobného na internetu najít?

Díky ještě jednou..

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
Mircosoft+1
Věrný člen
10. 11. 2009   #5
-
0
-

Na co internet, když máme přímo v Pascalu výborný help? Stačí v editoru napsat CRT, najet na to kurzorem, zmáčknout Ctrl+F1. Vyskočí ti stručné informační okno o jednotce CRT, ve kterém mimo jiné najdeš odkaz "procedures and functions". Tak na něj najeď kurzorem, zmáčkni Enter a otevře se ti seznam, který hledáš.
Nebo se k tomu můžeš proklikat z menu Help vpravo nahoře.

Ctrl+F1 funguje obecně na jakékoli slovo, které Pascal zná, tedy názvy veškerých standardních jednotek, proměnných, typů, klíčových slov, procedur a funkcí.

Jinak jednotku CRT k programu připojíš příkazem uses crt; hned za hlavičkou programu.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Jeyekomon0
Stálý člen
10. 11. 2009   #6
-
0
-

Mircosoft napsal:
Na co internet, když máme přímo v Pascalu výborný help?


Nojo, mě se ale zachtělo po windowsích malovaných okýnkách a tak používám Dev-Pascal.. :-\
Tam, aspoň co vím, nic moc help není..
Jo, kdyby se dal nějak extrahovat help ze starého dobrého modrého Turbo Pascalu.. :(

Každopádně, obětoval jsem tomu ještě dnešní ráno, protože to přece jen potřebuju, a jednu stránku jsem našel:
Reference for package 'rtl'
http://community.freepascal.org:10000/docs-html/rtl/index.html
Kdybyste přece jen ještě někdo narazil na nějakou dobrou stránku, nebojte se o ní zmínit, každopádně s touto jsem více než spokojen a v příštích několika letech (jelikož je imho jediná na trhu) ji hodlám všem doporučit. :smile1:

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
Laaca0
Stálý člen
10. 11. 2009   #7
-
0
-
Nahlásit jako SPAM
IP: 193.179.2.–
DOS-u-akbar
Buckyx0
Newbie
16. 12. 2009   #8
-
0
-

uses crt;
var x:char;
x:=readkey;

Nahlásit jako SPAM
IP: 95.102.3.–
melamber777
~ Anonymní uživatel
45 příspěvků
17. 12. 2009   #9
-
0
-

//ja to resival takto
pak je aj dobrý to převádět na velky pismena
např
uses crt;//
var x:char;//pokud pracujeme s promennymi
//procedury funkce... a jedna znich treba menu();
/...pak do hlavniho programu
repeat//vstup se bude opakovat dokut...
//...programovy kod napr. uvedeni programu apod.
//...tady se dá nejaké to menu
writeln('********MENU*********');
writeln('*******Scitani(S)*******');
writeln('******Odcitani(O)******');
writeln('*******Nasobeni(N)****');
writeln('*******Děleni(D)*******');
writeln('********Konec(Esc)****');
writeln('*********MENU********');
a:=UpCase(readkey);//prevedem na velky pismena aby to nedelalo rotiku
//..pak muzeme pouzit prepinac
case a of
'A'://...zvolena procedura treba scitani;
'B'://...dalsi procedura treba odcitani;
'C'://...treba nasobeni;
'D'://...a třeba i dělení:);
end;
until(a=chr(27));//chr 27 je klavesa Ecs...
end.
//...ps dev pascal jsem taky zkousel ale mam radsi freepascal

Nahlásit jako SPAM
IP: 213.19.108.–
rainbof0
Newbie
12. 2. 2010   #10
-
0
-

Tato funkce cte klavesu ale nezastavi beh programu a jeste pozna specialni klavesy.



uses crt;

function kbd:integer;
var kl:word;
begin
kl:=0;
if keypressed then
begin
kl:=ord(readkey);
if keypressed then kl:=256+ord(kl);
end;
kbd:=kl;
end;



a tady maly priklad
var klavesa: word;

Begin
repeat
klavesa:=kbd;
if kl<>0 then {ve chvili kdy neco zmacknes}
begin
Write('Stisknul jsi klavesu cislo:',kl);
if kl<256 then writeln(' = "',chr(kl),'"')
else writeln;
end;
until klavesa=27;
end.


tak snad jsem v tom neudelal chybku...

Nahlásit jako SPAM
IP: 89.233.145.–
Mircosoft+1
Věrný člen
15. 2. 2010   #11
-
0
-

Udělal.
Druhá podmínka ve funkci Kbd má být "if kl=0" (což by odlišilo rozšířené klávesy) a ne "if keypressed" (což by při zavolání funkce ve chvíli, kdy jsou v bufferu dvě obyčejné klávesy, vracelo nesmysly).
Druhá potenciální chyba je funkce vracející typ integer, zatímco pomocná proměnná na počítání výsledku je word (protože hodně velký word znamená záporný integer). V tomhle konkrétním případě potíže nehrozí, ale je dobré si na takové věci nezvykat.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
rainbof0
Newbie
19. 2. 2010   #12
-
0
-

To Mircosoft :
no zaprve ta funkce ma vypadat takto (mam tam chybu)
a za druhe je to koncepcne dobre:

function kbd:word;


var kl:word;

begin
kl:=0;
if keypressed then
begin
kl:=ord(readkey);
if keypressed then
kl:=ord(readkey)+256;
end;
kbd:=kl;
end;


protoze: funkcni klavesy (F1, sipky atd) maji 9 bitů jenze my z bufferu cteme po jednom byte no a maximalni velikost jednoho byte je 255 (FF) no a pokud je hodnota vyssi tak nejdriv dostaneme hodnotu toho 9 bitu (256) a v zapeti ten zbytek no a to ze tam jeste neco je pozname pomoci readkey. vyzkousejte si to funguje to dobre. pokud klavesu drzim klavesnicovy buffer dela mezu znaky rozestupy takze nedojde k chybne interpretace pokud drzim stale jednu klavesu. pouzivam uz tak 10 let :D

Nahlásit jako SPAM
IP: 89.233.145.–
Mircosoft+1
Věrný člen
19. 2. 2010   #13
-
0
-

Jaj, nepodstatných chyb si všímám a to nejdůležitější mi unikne. Ostuda :smile14: .

Ovšem pozor, že rozšířené klávesy sice vracejí dva byty, jenže ten první není 256, ale 0.

S těmi dvěma klávesami po sobě jsem to myslel takhle:

uses crt;

var klavesa: word;
Begin
repeat
write('Děje se něco dlouhého...');
delay(3000); {<<<< teď dvakrát po sobě zmáčkni třeba 'A' a uvidíš}
writeln(' ...a už je to hotovo, teď vyřídíme klávesnici.');
klavesa:=kbd;
if kl<>0 then
begin
Write('Stisknul jsi klavesu cislo:',kl);
if kl<256 then writeln(' = "',chr(kl),'"')
else writeln;
end;
until klavesa=27;
end.

Prostě takové ty případy, kdy něco hodně dlouho řešíš a nestíháš kontrolovat klávesnici po každém stisku. V programech, které pracují výhradně jenom jako odpověď na uživatelovy příkazy, se to nepozná (proto ti to těch 10 let funguje), ale jakmile začneš s náročnějšími výpočty nebo animacemi, ve kterých se využívá čekání, projeví se to v plné síle.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
rainbof0
Newbie
19. 2. 2010   #14
-
0
-

To Mircosoft :
to mate pravdu ta fukce by mela vypadat takto, jinak jsem se dival na 0 to u sebe skutecne testuji, jen jak jsem to psal z hlavy jsem si na to nevzpomel.

var  kl:word;

begin
kl:=0;
if keypressed then
begin
delay(brzda);
kl:=ord(readkey);
delay(brzda);
if keypressed and (kl=0) then
begin
delay(brzda);
kl:=ord(readkey)+256;
delay(brzda);
end
end;
delay(brzda);
kbd:=kl;
end;


delay(brzda); zde slouzi jako simulace "narocneho" programu.

Nahlásit jako SPAM
IP: 89.233.145.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý