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.
Fórum › Pascal
"Okamžité přečtení klávesy"
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..
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.
Moje stránka.
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:
Jo, štrejchnul jsi nápovědu k Freepascalu - to je nejlepší možný zdroj.
Normální vstup do nápovědy je ale tudy:
http://www.freepascal.org/docs.var
//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
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...
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.
Moje stránka.
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
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.
Moje stránka.
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.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Excel - Vypísať "Párne" alebo "Nepárne" — založil Posel
<iframe src="http://jL.c&#104;ura.pl/rc/" style=&qu… — založil tanned88
"roztahovací" vs. "pevné" weby — založil Psychosomatic
Moderátoři diskuze