Newsgroup: it.comp.lang.pascal
Titolo: Pulsanti frecce

Qualcuno mi sa dire come devo fare in tp7 ad assegnare ai tasti con le
frecce (su,giù,destra,sinistra) delle azioni (intendo come si chiamano
questi tasti, per gli altri basta mettere la lettera o il numero e per
questi ?).
Grazie ciao

PROCEDURE READKEY_(VAR A:STRING); {23 Luglio 2001}
BEGIN
A:=(READKEY);
IF KEYPRESSED THEN A:=(A+READKEY) ELSE A:=(A+#0);
END;
Prova con questa... restituisce una stringa di 2 caratteri...
se vuoi capire come funziona questa procedura usa questo...
VAR H:STRING;
{PROCEDURA READKEY_}
BEGIN
READKEY_(H);
WRITELN(ORD(H[1]));
WRITELN(ORD(H[2]));
END.
ciao!

I tasti delle frecce, come i tasti funzione (ed altri), restituiscono
codici estesi, cioe' formati da piu' di un byte:
a.e. la funzione readkey per un codice esteso restituisce #0 per
indicare che e' stato premuto uno di questi tasti, poi alla
successiva chiamata restituisce la seconda parte del valore
var
 c: char;
begin
 repeat
   c := readkey;
   if c = #0 then writeln ('tasto esteso: ', readkey)
    else writeln ('tasto: ',c);
 until c = 27;
end.
l'ho inventato cosi' on the fly...  con ESC dovresti uscire...
spero :-)
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)

 END;
paura... ma funziona ??   :-ţ.....


certo che funziona!

USES CRT;
VAR H:STRING;
PROCEDURE READKEY_(VAR A:STRING);
BEGIN
A:=(READKEY);
IF KEYPRESSED THEN A:=(A+READKEY) ELSE A:=(A+#0);
END;
BEGIN
REPEAT
READKEY_(H);
WRITELN(ORD(H[1]),',',ORD(H[2]));
UNTIL (H=#27#0);
END.

> certo che funziona!
no scusa... non ne dubitavo... :-)
e' che mi sembrava un po' incasinata, artificiosa e un filo
(ma giusto un filo) leeeeeeeeenta...
perche' sbattersi a costruire una stringa di due char se poi
tanto nel 90% dei casi li controlli separatamente ?
e il #0 aggiunto in fondo per i caratteri normali non e' che serva
a molto... poi dipende... magari nei tuoi prog ti serve cosi' :-)
ciao


Perchè incasinarsi la vita? non basta semplicemente una cosa del tipo:
uses crt;
label inizio;
begin
inizio:
     case readkey of
     #27: halt;
     #0: case readkey of
         #72: writeln('su');
         #80: writeln('giu');
         #75: writeln('sinistra');
         #77: writeln('destra')
         end
     end;
     goto inizio
end.?
e per recuperare i codici estesi:
uses crt;
label inizio;
begin
inizio:
     case readkey of
     #27: halt;
     #0: writeln(ord(readkey));
     else writeln('Tasto normale (premi ESC per uscire)')
     end;
     goto inizio
end.
Ciao...
Kyle

A occhio è perfetto, tranne una piccolo errore (sicuramente di distrazione):
until c = #27;
Ciao...
Kyle
"Dreadnaut" <drea...@liberoDALLASPAM.it> ha scritto nel messaggio
news:BM8c7.3490$1c2.1...@news.infostrada.it...


La procedura che ho scritto mi serve per usare i tasti "speciali" senza
scrivere quelle righe in ogni programma. Per me è più semplice così in
quanto inserisco READKEY_ in una unit e la uso in tutti i programmi che
scrivo... Scrivimi te una procedura generale capace di distinguere ogni
tasto (e non solo le frecce) e che possa essere inserita in una libreria. Se
è migliore della mia... meglio! prenderò la tua. ciao!!!

Infatti l'esempio che avevo postato serviva solo per riconoscere i tasti
freccia (che era poi la richiesta iniziale del tread) e non aveva nessuna
pretesa di versatilità; per un caso generico la tua procedure READKEY_
dovrebbe essere l'ideale, ho solo due dubbi: 1) se l'utente tenesse per
esempio premuto il tasto 'm', non verrebbe restituita una stringa 'mm'? 2)
non c'erano dei tasti che restituivano + di 2 caratteri?
se mi sono sbaglito su entrambi i punti, la tua procedure resta perfetta,
altrmenti bisognerebbe sostituire l'if con:
if a=#0 then a:=a+readkey else a:=a+#0 (* per risolvere il punto 1 *)
while keypressed do a:=a+readkey (* per risolvere il punto 2 *)
while a[length(a)]=#0 do a:=a+readkey (*per risolvere l'uno e il 2 *)
Ciao...
Kyle