[ Foro de Pascal ]
Menu con flechas
Hola, me gustaría saber como podría hacer un menu sencillo (a ser posible un ejemplo) que sombreara la opcion resaltada y se pudiera seleccionar otras mediante los cursores del teclado. Gracias
Hola Daniel!, Mirá te pongo un ejemplo fácil que está hecho de tablas. También lo podrías hacer en CSS, o en Flash, etc..Pero este es el que tenía más a mano. espero que te sirva. Saludos.
<-----------HEAD------->
<style type="text/css">
<!--
.menu {font-family:Arial; font-weight:bold}
.menu a{
text-decoration:none;
color:black;
}
-->
</style>
<script language="javascript">
<!--
/*
Cool Table Menu
By Clarence Eldefors (http://www.freebox.com/cereweb) with modifications from javascriptkit.com
Visit http://javascriptkit.com for this and over 400+ other scripts
*/
function movein(which,html){
which.style.background='coral'
if (document.getElementById)
document.getElementById("boxdescription").innerHTML=html
else
boxdescription.innerHTML=html
}
function moveout(which){
which.style.background='bisque'
if (document.getElementById)
document.getElementById("boxdescription").innerHTML=' '
else
boxdescription.innerHTML=' '
}
//-->
</script>
<-----------BODY----------------->
<table bgcolor="black" border="1" bordercolor="ivory" cellpadding="2" cellspacing="0">
<tr>
<td class="menu" bordercolor="black" id="choice1" style="background-color:bisque; cursor:hand" onmouseover="movein(this,'Coleccion de Javascript')" onmouseout="moveout(this)"">
<a href="http://www.mundojavascript.com" target="_blank">Mundo JavaScript</a></td></tr>
<td class="menu" bordercolor="black" id="choice2" style="background-color:bisque; cursor:hand" onmouseover="movein(this,'Intercambio Ratio 10:9')" onmouseout="moveout(this)">
<a href="http://cambiabanners.com">Cambiabanners.com</a></td></tr>
<td class="menu" bordercolor="black" id="choice3" style="background-color:bisque; cursor:hand" onmouseover="movein(this,'Recursos para webmasters')" onmouseout="moveout(this)"><a href="http://www.iaupa.com">iaupa.com</a></td></tr>
<td class="menu" bordercolor="black" id="choice4" style="background-color:bisque; cursor:hand" onmouseover="movein(this,'Moviles GRATIS')" onmouseout="moveout(this)"><a href="http://www.precios10.com">Precios10.com</a></td></tr>
<tr>
<td bordercolor="black" bgcolor="ivory" height="18"><font id="boxdescription" face="Verdana" size="0"></font></td></tr>
</table>
La idea es sencilla: guardas una variable que sea la posición "actual" del menú. Cada vez que se pulse la flecha abajo aumentas esa posición actual (si no estás ya en el final), y cada vez que se pulse la flecha arriba disminuyes la posición actual (si no estabas en la primera).
Tras cada pasada vuelves a dibujar el menú, y destacas de alguna forma la posición actual (cambiando el color, escribiendo una flecha, etc).
La única dificultad (creo) es saber cómo ver si se ha pulsado una flecha. En Pascal para Dos/Windows, la función "readkey" te devolverá 0 cuando se pulse alguna tecla de función, y una nueva llamada a "readkey" te devolverá el "scancode" de la tecla (es fácil localizar una lista de scancodes en Internet).
No dices qué versión de Pascal usas, así que te incluyo una hecha con Free Pascal en modo texto (debería funcionar perfectamente también en Turbo Pascal).
program menu;
uses crt;
const NUMOPCIONES = 5;
var opciones: array [1..NUMOPCIONES] of string =
('Primera opcion',
'Segunda opcion',
'Tercera opcion',
'Cuarta opcion',
'Quinta opcion');
var
actual: byte;
i: byte;
tecla: char;
begin
actual := 1;
repeat
clrscr;
for i := 1 to NUMOPCIONES do
begin
gotoxy(10, 5 + i*2);
if i = actual then
textcolor(14)
else
textcolor(7);
write(opciones[i]);
end;
tecla := readkey;
if tecla = chr(0) then tecla := readkey; if (tecla = chr(72)) and (actual > 1) then
actual := actual - 1;
if (tecla = chr(80)) and (actual < NUMOPCIONES) then
actual := actual + 1;
until tecla = chr(27); end.
Si quieres verlo con la sintaxis en colores y sangrado correctamente, te lo he dejado disponible aquí:
http://www.nachocabanes.com/fuentes/menupascal.php
Muchas Gracias :-)
Hay alguna forma de esconder el cursor mientras se ejecuta el menu?, intente situandolo fuera de la ventana con gotoxy(a,b) pero me realiza una especie de bucle y siempre se ve en pantalla
Hazte a la idea de que no hay forma "fiable", así que tendrás que desplazar el cursor cerca de una esquina de la pantalla (no fuera: no te hará caso).
Siendo estrictos, sí existía una forma que consistía en cambiar la línea de comienzo y de final del cursor, pero esa forma no es "portable": era exclusiva de Turbo Pascal para MsDos en ordenadores con ciertas tarjetas gráficas (VGA, por ejemplo).
Si lo quieres usar aun sabiendo que lo que hagas quizá no sirva para nada, o lo que es peor, que quizá funcione en tu ordenador pero no funcione en los ordenadores de la gente que tenga que usar tu programa, la idea era ésta:
procedure OcultarCursor ;
var tamano : word ;
begin
asm mov AH,03h ;
mov BH,0 ;
int 10h ;
mov tamano,CX ;
mov AH,01h ;
mov BH,0 ;
mov CX,2000h ;
int 10h
end ;
tamanoCursor := tamano
end;
Tienes que guardar el tamaño original del cursor (en una variable global, que yo he llamado "tamanoCursor") para poderlo mostrar más adelante:
procedure MostrarCursor ;
var tamano : word ;
begin
tamano := tamanoCursor ;
asm mov ah,01h ;
mov bh,0 ;
mov cx,tamano ;
int 10h
end ;
end ;
(el fuente no es mío, pero si no se hacía justo así... desde luego era parecido... ;-) )
(No se puede continuar esta discusión
porque tiene más de dos meses de antigüedad.
Si tienes dudas parecidas, abre un nuevo hilo.)