• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

itzme

[Ajuda] Menu

4 mensagens neste tópico

Boas. Visto andar a aprender a programar em c++ eu tinha como objectivo a criação de um menu "interactivo" num visual normal. Isto e, com as setas movimentar as opções.

Foi a isto que eu cheguei:

#include <iostream>
#include <conio.h>

using namespace std;
int Option1();
int Option2();
int Option3();
int Option4();

void updateScreen( int option )
{
     system("cls");
     
            switch(option)
            {
            case 1:
                 cout <<"\n    Option 1\nOption2\nOption3\nOption4";
                 break;
            case 2:
                 cout <<"\nOption1\n     Option2\nOption3\nOption4";
                 break;
            case 3:
                 cout <<"\nOption1\nOption2\n     Option3\nOption4";
                 break;
            case 4:
                 cout <<"\nOption1\nOption2\nOption3\n     Option4";
                 break;
            default:
                    cout<<"\nError!";
                    break;
                    }
     
}
            



int main()
{
      int key = 0 ;
      updateScreen( 1 );
      while( key != 27 ) 
            { 
              if (kbhit())  
                 {
                  key = getch();  
                 }
             int option = 1;
             switch ( key ) 
             {
                    case 80:
                         option = option+1;
                         break;
                    case 72:
                         option = option-1;
                         break;
                    default:
                            break;
                            
             }  

             
             if( key == 13 ) 
             {
                 switch ( option ) 
                 {
                        case 1:
                             Option1();
                             break;
                        case 2:
                             Option2();
                             break;
                        case 3:
                             Option3();
                             break;
                        case 4:
                             Option4();
                             break;
                        default:
                                cout<< "ERROR!";
                                break;
                 }
                 
           }
          updateScreen( option );
     }
}

int Option1()
{
    cout<<"\nThis is option1";
    cin.get();
}

int Option2()
{
    cout<<"\nThis is option2";
    cin.get();
}

int Option3()
{
    cout<<"\nThis is option3";
    cin.get();
}

int Option4()
{
    cout<<"\nThis is option4";
    cin.get();
}



No entanto, caso possam compilar verão o efeito que tem. Ao carregar na seta para baixo ele baixa a opção, apos isso não baixa mais, mal se carrega para cima mostra a mensagem error!... Etc... Está muito defeituoso mesmo. Mesmo que se esteja na segunda opção e carregue enter ele mostra: This is option1. Obrigadao pela futura ajuda!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, tens a certeza que a variável key irá receber um inteiro? :S

Há e tu queres ler uma extended key...é "diferente" a leitura.

Já li aqui no P@P algo parecido com o teu caso, tenta pesquisar :cheesygrin:

ou aqui também explica como ler extendeds keys

http://support.microsoft.com/kb/57888

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou a ver vário problemas aí.

O mais grave: estás a declarar a variável option dentro do while, o que faz com que o seu valor seja sempre o mesmo em cada iteração. Tens que passar a declaração para antes do while.

Com isto vais notar outro problema: mal carregas na tecla para baixo, a selecção nunca mais pára e vai por aí abaixo. Remove o if (kbhit()).

Last but not least, se nas funções Option# não vais devolver nenhum valor, declara-as como void em vez de int.

Boas, tens a certeza que a variável key irá receber um inteiro? :S

A função getch() (_getch() em ISO C++) devolve um inteiro. Não vejo hipótese de a variável receber outra coisa.

Há e tu queres ler uma extended key...é "diferente" a leitura.

Já li aqui no P@P algo parecido com o teu caso, tenta pesquisar :cheesygrin:

ou aqui também explica como ler extendeds keys

http://support.microsoft.com/kb/57888

É uma boa questão, embora neste caso não importe muito porque o ciclo vai ignorar a 1ª metade dos códigos estendidos (o valor 0).

Podes deixar os links normalmente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desde já muito obrigado pelas respostas! Agora funciona optimamente!  :cheesygrin: . Nunca pensei que fosse ficar táo fluido ate :cheesygrin:. Ah e ja agora peço desculpa por ter criado o topico na secção errada :/

Aqui está o codigo final:

#include <iostream>
#include <conio.h>

using namespace std;
void Option1();
void Option2();
void Option3();
void Option4();

void updateScreen( int option );
            



int main()
{
      int key = 0 ;
      updateScreen( 1 );
      int option = 1;
      while( key != 27 ) 
            { 

            key = getch();  
             switch ( key ) 
             {
                    case 80:
                         option = option+1;
                         break;
                    case 72:
                         option = option-1;
                         break;
                    default:
                            break;
                            
             }  
             
             if( option == 5 )
             {
                 option = 1;
             }
             else if( option == 0 )
             {
                  option = 4 ;
             }
             
             if( key == 13 ) 
             {
                 switch ( option ) 
                 {
                        case 1:
                             Option1();
                             break;
                        case 2:
                             Option2();
                             break;
                        case 3:
                             Option3();
                             break;
                        case 4:
                             Option4();
                             break;
                        default:
                                cout<< "ERROR!";
                                break;
                 }
                 
           }
          updateScreen( option );
     }
}

void Option1()
{
     system("cls");
    cout<<"\nThis is option1";
    cin.get();
}

void Option2()
{
     system("cls");
    cout<<"\nThis is option2";
    cin.get();
}

void Option3()
{
     system("cls");
    cout<<"\nThis is option3";
    cin.get();
}

void Option4()
{
     system("cls");
    cout<<"\nThis is option4";
    cin.get();
}

void updateScreen( int option )
{
     system("cls");
     
            switch(option)
            {
            case 1:
                 cout <<"\n    Option 1\nOption2\nOption3\nOption4";
                 break;
            case 2:
                 cout <<"\nOption1\n     Option2\nOption3\nOption4";
                 break;
            case 3:
                 cout <<"\nOption1\nOption2\n     Option3\nOption4";
                 break;
            case 4:
                 cout <<"\nOption1\nOption2\nOption3\n     Option4";
                 break;
            default:
                    cout<<"\nError!";
                    break;
                    }
     
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora