[ Foro de Pascal ]

Menu con flechas

15-Nov-2007 12:04
Dany .
5 Respuestas

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
16-Nov-2007 02:31
Alejandra Montes de Oca

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='&nbsp;'
else
boxdescription.innerHTML='&nbsp;'
}

//-->
</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>
21-Nov-2007 12:55
Nacho Cabanes (+31)

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).

{ Ejemplo de menu utilizable con las flechas
 usando Free Pascal (modo texto) }

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
 { Borro pantalla }
 clrscr;
 { Escribo opciones }
 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;
 { Espero tecla }
 tecla := readkey;
 { Segun la tecla, subo, bajo o salgo }
 if tecla = chr(0) then { Si es tecla de funcion }
 tecla := readkey; { tengo que ver el 2o byte }
 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); { Hasta pulsar ESC }
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


21-Nov-2007 13:47
Dany .

Muchas Gracias :-)
03-Dec-2007 13:39
Dany .

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


04-Dec-2007 17:15
Nacho Cabanes (+31)

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.)