Pascal/Turbo Pascal - Como hago movimientos del cursor con las flechas

 
Vista:

Como hago movimientos del cursor con las flechas

Publicado por Jeter (11 intervenciones) el 01/06/2005 15:58:44
holas pos kiero hacer movimiento de cursor utilixando las flechas,,

como hago, ke mientras mueva las flechas del teclado tambiem se mueva el curson, utlilizando el
GOTOXY(X,Y);

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Como hago movimientos del cursor con las flecha

Publicado por Hurricane (26 intervenciones) el 01/06/2005 17:41:39
Mediante el programa que está en http://www.lawebdelprogramador.com/news/mostrar_new.php?id=69&texto=Pascal/Turbo+Pascal&n1=286551&n2=1&n3=0&n4=0&n5=0&n6=0&n7=0&n8=0&n9=0&n0=0 averigua el código de las teclas. Luego, piedes hacer algo similar a ésto:

Program MueveCursor;
Uses
Crt;

Const
{Los valores de teclas deben ser averiguados con el programa que hice en }
{enlace que ya te indiqué y ponerlos donde corresponda}
KEY_LEFT = 10; {Código tecla izquierda}
KEY_UP=11; {Código tecla arriba}
KEY_DOWN=12; {Código tecla abajo}
KEY_RIGHT=13; {Código tecla derecha}
KEY_EXIT=27; {Este valor no debe alterarse, pues es el código de ESC}
{el que se va a utilizar para salir del programa de ejemplo}
CHAR_ON='X'; {Caracter que aparece en la posición del cursor}

Var
Key :Word;
X, Y :Byte;

Function wReadKey :Word;
Var
K :Word;
Begin
K := Ord(ReadKey);
If (K=0) then K := Ord(ReadKey)*256;
wReadKey := K;
End; {wReadKey}

Begin
X := 1;
Y := 1;
ClrScr;
Repeat
GotoXY(X, Y);
Write(CHAR_ON);
Repeat
Key := wReadKey;
Until (Key in [KEY_LEFT, KEY_UP, KEY_DOWN, KEY_RIGHT, KEY_EXIT]);
GotoXY(X, Y);
Write(' ');
Case Key of
KEY_LEFT : Dec(X);
KEY_UP: Dec(Y);
KEY_DOWN: Inc(Y);
KEY_RIGHT: Inc(X);
End; {Case}
If (Y=0) then Y := 23;
If (Y=24) then Y := 1;
If (X=0) then X := 79;
If (X=80) then X := 1;
Until (Key=KEY_EXIT);
ClrScr;
End. {MueveCursor}

Espero te sea de utilidad. Saludos ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por Diego Romero (786 intervenciones) el 01/06/2005 18:40:45
Hurricane.
Hay problemas con tu código, en la parte que devuelve el valor de la tecla presionada, en esta línea:

If (K=0) then K := Ord(ReadKey)*256;

¿Por qué multiplicas por 256?.
Por ejemplo si presiono la tecla flecha abajo resulta que ReadKey devuelva el valor 80, multiplicado por 256 me da 20480, el cual es un valor lícito para el tipo Word, pero en el cuerpo del programa, en esta línea:

Until (Key in [KEY_LEFT, KEY_UP, KEY_DOWN, KEY_RIGHT, KEY_EXIT]);

Se produce un error en tiempo de ejecución por valor fuera de rango, este error se debe a que el tipo conjunto solo puede almacenar 256 valores al mismo tiempo, 20480 es más que evidente que está fuera de ese rango.
La multiplicación de arriba es lo que me pareció sospechosa de tu programa, así que supuse que te aprovechabas del desbordamiento de la variable K para restar el valor de las teclas especiales y obtener alguno de los valores de las constantes declaradas, pero no funciona, aún deshabilitando el control de rangos en el compilador.

Entiendo la idea detrás de usar una formula para mover el valor devuelto por las teclas especiales, se trata de llevar ese valor a uno que no corresponda a ninguna tecla normal, me parece una idea brillante aunque esté mal implementada.
Entonces, para solucionar el problema hice algunos cambios.
Primero cambiar la formula para calcular el valor de la tecla por esta:
If (K=0) then K := Ord(ReadKey)-61;
Cambiar el tipo de las variables K y Key de Word a Byte para que estén contempladas dentro del conjunto ad-hoc en la condición del Until del cuerpo principal, también cambiar el tipo devuelto por la función wReadkey de Word a Byte.
Y cambiar los valores de las constantes para que se ajusten a los valores esperados en la formula, las cuales quedan así:
Const
KEY_LEFT = 14;
KEY_UP=11;
KEY_DOWN=19;
KEY_RIGHT=16;
Entonces sí me funciona sin problemas :).
¿Por qué resto 61?, porque el menor valor devuelto por las teclas de cursor es cursor arriba, 72. 72-61=11, y 11 no corresponde a ninguna tecla normal, así como tampoco 14, 16 y 19. De otra forma interferiría con otras teclas normales, por ejemplo si restara 71, al presionar la tecla cursor abajo devolvería 80, menos 71 igual 9, pero 9 es la tecla TAB que no es una tecla especial.
Espero haber sido claro en mi explicación y solución.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por Hurricane (26 intervenciones) el 01/06/2005 20:11:32
Amigo Diego:

Lo de multuplicar por 256 no es sólo una forma personal de hacer el cálculo, sino que es una norma propia del Sistema para darle un código a todas las teclas existentes. Como comprenderás, entre combinaciones de SHIFT, CTRL, etc... supera largamente las 256 psoibles (códigos ASCII 0 a 255). Lo que sucede es que el "Readkey trabaja así". Te devuelve un char que indica el ASCII del caracter, pero si devuelve #0, indica que se trata de un caracter extendido y que en el Buffer del teclado hay otro Char esperando para completar el código.

El primer Char (ch1) corresponde a la parte baja del Word y el segundo Char leído (ch2) corresponde a la parte superior del tipo Word, por lo tanto, el código final es: Ord(Ch1)+Ord(Ch2)*256. Como Ch1=#0 en los casos de tecals especiales, no lo tomo en cuenta a la hora de realizar el cálculo.

Lo que me imagino que sucede es lo del rango, y que la parte donde dice
Until (Key in [KEY_LEFT, KEY_UP, KEY_DOWN, KEY_RIGHT, KEY_EXIT]);

sólo soporta hasta un entero simple, por lo que se podría reemplazar por
Until ((Key=KEY_LEFT) or (Key=KEY_UP) or (Key=KEY_DOWN) or (Key=KEY_RIGHT, KEY_EXIT));

Saludos ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por Diego Romero (786 intervenciones) el 02/06/2005 03:13:40
Sí, entiendo lo que me dices pero aún así no funciona, ni puede funcionar nunca porque ReadKey devuelve solo un tipo byte y no puedes hacer desplazamientos de un byte en un byte sin provocar overflow.
Aún reemplazando la condición de Until que comentas el valor devuelto por wReadKey nunca coincidirá con ninguna de esas constantes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por Hurricane (26 intervenciones) el 03/06/2005 00:39:01
Parece que no me has entendido. Tú te guías por el código ASCII, que sólo abarca un número byte (0-255), en cambio yo estoy hablando del código de la TECLA. El código ASCII correspondiente a un caracter flecha, no tiene nada que ver con el código asignado a la tecla flecha. El Sistema de lectura del código de la tecla no lo inventé yo, sino que ya está establecido por el Sistema Operativo. Las constantes que yo había establecido no eran las correctas, y eso lo aclaré al comienzo, indicando que se debía averiguar el código de cada tecla. Ahora, probé un código en el Pascal, que no difiere mucho del que ya había corregido, y aquí va:
Program MoverCursor;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Uses
    Crt;
 
Const
     KEY_UP = 18432;
     KEY_DOWN = 20480;
     KEY_LEFT = 19200;
     KEY_RIGHT = 19712;
     KEY_EXIT = 27;
     CHAR_ON = 'X';
 
Var
   Key :Word;
   X, Y :Byte;
 
Function wReadKey :Word;
         Var
            Key :Word;
         Begin
              Key := Ord(ReadKey);
              If (Key=0) then Key := Ord(ReadKey)*256;
              wReadKey := Key;
         End; {wReadKey}
 
Begin
     X := 1;
     Y := 1;
     ClrScr;
     Repeat
           GotoXY(X, Y);
           Write(CHAR_ON);
           Repeat
                 Key := wReadKey;
           Until (Key=KEY_UP) or (Key=KEY_DOWN) or (Key=KEY_LEFT) or
                 (Key=KEY_RIGHT) or (Key=KEY_EXIT);
           GotoXY(X, Y);
           Write(' ');
           Case Key of
                KEY_UP   : Dec(Y);
                KEY_DOWN : Inc(Y);
                KEY_LEFT : Dec(X);
                KEY_RIGHT: Inc(X);
           End; {Case}
           If (X=0) then X := 80;
           If (X=81) then X := 1;
           If (Y=0) then Y := 23;
           If (Y=24) then Y := 1;
     Until (Key=KEY_EXIT);
     ClrScr;
End. {MueveCursor}
Cualquier comentario, estoy dispuesto a escuchar (o leer, en este caso). Saludos ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por Diego Romero (786 intervenciones) el 03/06/2005 16:45:26
Hurricane, yo también estoy hablando del código de la tecla. Pero el tema es que el buffer del teclado es de un byte, no de un word, y las teclas especiales devuelven dos códigos de rastreo, uno detrás del otro, y Readkey toma uno a la vez, y devuelve un byte, y es obvio que cualquier valor almacenado en un byte si lo multiplicas por 265 no te dará un valor capaz de ser almacenado en un byte.
Anyway, creo que el tema está zangado.
Espero que el resto de los foristas hayan aprendido algo nuevo de esto :P.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por Hurricane (26 intervenciones) el 03/06/2005 18:05:34
Parece que tú no entiendes. El ReadKey te devuelve 1 byte normalmente, pero cuando es una tecla especial, el primer byte es 0, indicándote que a continuación viene un segundo byte de la misma tecla.

Dime si te funciona el último programa que puse. Saludos ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por Diego Romero (786 intervenciones) el 04/06/2005 01:18:08
Y tú no entiendes que sí entiendo, hace 15 años que programo en Turbo Pascal, sé cómo funciona ReadKey y sé cómo funciona el buffer de teclado.
La nueva versión funciona bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por Hurricane (26 intervenciones) el 04/06/2005 02:17:01
OK. Yo llevo 18 años y nos damos de narices por una tontera... Bueno, calmemos los ánimos y enfoquémonos a ayudar :-)

Saludos ;-)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por O. Alejandro (104 intervenciones) el 06/06/2005 15:23:17
Qué si hemos aprendido algo, al menos yo sí. Toda una cátedra de como funciona la función ReadKey; .

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por welimp (11 intervenciones) el 06/06/2005 18:55:37
pos me taba dando cuenta pero ifn al cabo entendi un pokito..
y yo solo llemos semanas aprendiendo a programar pascal,, asi ke muchas gracias a todos lo ke escribieron algo,,
y es de mucha ayuda esto,, ya ke me gusta mucho la programacion y soy un buen estudiante :D

pero mi sueño es programar juegos :D

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos...

Publicado por Diego Romero (786 intervenciones) el 07/06/2005 00:49:54
Pues dale pa'lante welimp :).
Pregunta lo que quieras que si no lo sabemos lo aprendemos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos...

Publicado por Ace (1 intervención) el 27/06/2007 23:00:52
Llevo dos mese programando y me pusieron esa tarea,
gracias a Dios que ustedes existen, ahora me sacare un 10!!
Gracias por ese codigo y suerte a to2,

Salu2!
From Costa Rica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por patagas (1 intervención) el 21/08/2009 09:56:55
Hola bueno esto es medio viejito pero por ahi sirbe.

Bueno a mi me parecio que multiplicar el numero que debuelve el teclado por 256 no tenia mucho sentido asique cambie las constantes por el valor que me da el teclado y no es necesario hacer una cuenta para saber un valor , bueno aca esta ojala les ayuda y perdon por modificar el codigo

XD un abrazo a todos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Uses Crt;
 
  Const
	KEY_UP = #72;
	KEY_DOWN = #80;
	KEY_LEFT = #75;
	KEY_RIGHT = #77;
	KEY_EXIT = #27;
	CHAR_ON = 'X';
 
  Var
	Key :char;
	X, Y :Byte;
 
Begin
   X := 1;
   Y := 1;
  ClrScr;
 Repeat
    GotoXY(X, Y);
    Write(CHAR_ON);
 
 Repeat
    Key := ReadKey;
 
    Until (Key=KEY_UP) or (Key=KEY_DOWN) or (Key=KEY_LEFT) or
    (Key=KEY_RIGHT) or (Key=KEY_EXIT);
 
    GotoXY(X, Y);
 
    Write(' ');
 
   Case Key of
 
	KEY_UP : Dec(Y);
	KEY_DOWN : Inc(Y);
	KEY_LEFT : Dec(X);
	KEY_RIGHT: Inc(X);
 
    End; {Case}
	If (X=0) then X := 80;
	If (X=81) then X := 1;
	If (Y=0) then Y := 23;
	If (Y=24) then Y := 1;
  Until (Key=KEY_EXIT);
ClrScr;
End. {MueveCursor}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

RE:Como hago movimientos del cursor con las flecha

Publicado por francisco manzanares (1 intervención) el 13/07/2016 22:38:35
bueno a mi me sastifase mucho esta cuenta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar