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

mr.oculus

Setas do teclado, como usar?

13 mensagens neste tópico

Olá galera, estou aki novamente, e minha dúvida é para melhorar o uso do programa, se alguém souber por favor informem como q uso as teclas do teclado. Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas...

tens aqui um exmplo

tens os caracteres correspondentes... 80 para baixo etc..

um pequeno excerto de codigo....

  repeat
    tecla:=readkey;
    tecla:=upcase(tecla);
    case tecla of
      #80 :down;
      #72 :up;
      #77 :right;
      #75 :left;
    end;
  until tecla=#27;

cumps... qualquer duvida diz...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

faz sentido o código mas não funciona... se vc puder me explicar como inseri-lo em qualquer programa seria de grande utilidade

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não ha problema...

Program cypher;
uses crt;
var tec:char;
    x,y:integer;
Procedure ecran;
begin
  textbackground(7);
  Clrscr;

end;
Procedure Again;
begin
  textbackground(7);
  textcolor(15);
  gotoxy(7,3);
  write('Outra Vez ');

end;

Procedure Who;
begin
  gotoxy(7,5);
  write('Cr‚ditos');

end;
Procedure Out;
begin
  gotoxy(7,7);
  write('Sair ');

end;
procedure principal;
Begin

end;
begin
  ecran;
  textcolor(15);
  textbackground(9);
  gotoxy(7,3);
  write(' Outra Vez ');
  textbackground(7);
  gotoxy(7,5);
  write(' Cr‚ditos ');
  gotoxy(7,7);
  write(' Sair ');
  x:=3;
  y:=10;
  repeat
    if y=10 then
    begin
      textcolor(15);
      textbackground(9);
      gotoxy(7,3);
      write(' Outra Vez ');
      textbackground(7);
      gotoxy(7,5);
      write(' Cr‚ditos ');
      gotoxy(7,7);
      write(' Sair ');
    end;

    if y=11 then
    begin
      textcolor(15);
      textbackground(9);
      gotoxy(7,5);
      write(' Cr‚ditos ');
      textbackground(7);
      gotoxy(7,7);
      write(' Sair ');
      gotoxy(7,3);
      write(' Outra Vez ');
    end;
    if y=12 then
    begin
      textcolor(15);
      textbackground(9);
      gotoxy(7,7);
      write(' Sair ');
      textbackground(7);
      gotoxy(7,5);
      write(' Cr‚ditos ');
      gotoxy(7,3);
      write(' Outra Vez ');
    end;
    tec:=readkey;
    case tec of
      #72: y:=y-1;
      #80: y:=y+1;
    end;
    if y=13 then
      y:=10;
    if y=9 then
      y:=12;
  until tec=#32;

end.

Aqui neste exeplo so é utilizado as setas para cima e para baixo...

mas a ideia é exactamente a mesma ...

Qualquer duvida diz...

cumps...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque é que na tabela ASCII #72 é "H" e aí o programa aceita como a seta para o lado?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na realidade, as setas geram dois caracteres. Como o ciclo apenas tem um readkey, acontece que o primeiro caracter é lido e, como não é #80, #72, #77 nem #75, é ignorado. O segundo caracter já é um deles!

O primeiro caracter é sempre #0.

A forma correcta de distinguir um 'H' de uma seta é usando dois readkeys encadeados:

repeat
  key1 := UpCase(ReadKey);

  if (key1 = #0) then begin  // É uma função especial, não um caracter simples!
     key2 := UpCase(ReadKey);
     case key2 of
        #80 : {down};
        #72 : {up};
        #77 : {right};
        #75 : {left};
     end;
  end;
until (key1 = #27);

Editado por thoga31
1

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em vez de usares key1 e key2 podias usar por exemplo var1 e var2? ou isso é uma opalavra reservada?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

São nomes de variáveis. Podias utilizar pao e queijo, se assim o quisesses.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu até costumo usar a mesma variável para todo o processo, assim evito o bugzito que tem o código.

repeat
  key1 := UpCase(ReadKey);
  if (key1 = #0) then begin  // É uma função especial, não um caracter simples!
  key1 := UpCase(ReadKey);
  case key1 of
	 #80 : {down};
	 #72 : {up};
	 #77 : {right};
	 #75 : {left};
  end;
  end;
until (key1 = #27);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso poderá não funcionar bem se, por algum motivo e como exemplo, quisermos que a tecla de saída seja o 'H' - clicas na seta para cima e o ciclo termina.

Digo isto porque coloquei este processo numa função generalista que aceita qualquer caracter de saída. Para evitar este género de conflitos, uso duas variáveis - sei lá o dia em que vou precisar de usar como caracter de saída o #72, #77, #77 ou #80 -, daí o meu "vício" em usar duas variáveis.

Já tive bugs chatos nos meus projectos maiores por causa de coisas destas. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Percebo-te Thoga31.

Nunca necessitei de nada como dizes, mas assim rapidamente a solução poderia passar por fazeres o reset à variável antes da saída do if

repeat
 key1 := UpCase(ReadKey);
 if (key1 = #0) then begin  // É uma função especial, não um caracter simples!
key1 := UpCase(ReadKey);
case key1 of
  #80 : {down};
  #72 : {up};
  #77 : {right};
  #75 : {left};
end;
key1 := #0;  // isto evita que teclas com segundo código coincidam com a tecla de saída
 end;
until (key1 = #27);

Editado por passarito
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Depois de me deparar com tantos problemas relacionados a captura de teclas desenvolvi esta função que facilita tudo.

Function ObtemTeclaPressionada : string;
{RETORNA A REFERENCIA À TECLA PRESSIONADA}
Const
  COMANDO_ACENTUACAO_1 = #26;
  COMANDO_ACENTUACAO_2 = #40;
Var
  refA, refB : char;
  tecla, auxA, auxB : string;
Begin
  if (keypressed) then
  begin
    refA := readkey;
    case upcase(refA) of
       #0 : begin
               refB := readkey;
               if (refB <> COMANDO_ACENTUACAO_1) and
                  (refB <> COMANDO_ACENTUACAO_2) then
               begin
                  str(ord(refA), auxA);
                  str(ord(refB), auxB);
                  tecla := concat(auxA, auxB);
               end else
                  tecla := NULL;
             end;
       else begin
          str(ord(refA), auxA);
          tecla := auxA;
       end;
    end;
 end else
 begin
   tecla := NULL;
 end;
 ObtemTeclaPressionada := tecla;
End;

A função retorna valores como:

NULL = '\NULL';
TECLA_UP = '072';
TECLA_DOWN = '080';
TECLA_RIGHT = '077';
TECLA_LEFT = '075';
TECLA_DELETE = '083';
TECLA_ENTER = '13';
TECLA_ESC = '27';
TECLA_BACKSPACE = '8';
TECLA_TAB = '9';
TECLA_SPACE = '32';
TECLA_F1 = '059';
TECLA_F2 = '060';
TECLA_F3 = '061'; TECLA_F4 = '062';
TECLA_F5 = '063'; TECLA_F6 = '064';
TECLA_F7 = '065'; TECLA_F8 = '066';
TECLA_F9 = '067'; TECLA_F10 = '068';
TECLA_F11 = '0133'; TECLA_F12 = '0134';
TECLA_0 = '48'; TECLA_1 = '49';
TECLA_2 = '50'; TECLA_3 = '51';
TECLA_4 = '52'; TECLA_5 = '53';
TECLA_6 = '54'; TECLA_7 = '55';
TECLA_8 = '56'; TECLA_9 = '57';
TECLA_CTRL_UP = '0141';
TECLA_CTRL_DOWN = '0145';
TECLA_CTRL_RIGHT = '0116';
TECLA_CTRL_LEFT = '0115';
TECLA_CTRL_ALT_UP = '0152';
TECLA_CTRL_ALT_DOWN = '0160';
TECLA_CTRL_ALT_RIGHT = '0157';
TECLA_CTRL_ALT_LEFT = '0155';
TECLA_CTRL_E = '5';
TECLA_CTRL_Z = '26';
TECLA_CTRL_R = '18';
TECLA_CTRL_T = '20';
TECLA_CTRL_V = '22';
TECLA_CTRL_L = '12';
TECLA_CTRL_B = '2';
TECLA_CTRL_ALT_B = '048';
TECLA_CTRL_A = '1';
TECLA_ALT_V = '047';
TECLA_CTRL_ENTER = '10';
TECLA_CTRL_ALT_ENTER = '0166';

while (true) do
  begin
     teclaPressionada := ObtemTeclaPressionada();
     if teclaPressionada <> NULL then
     begin

        if teclaPressionada = TECLA_ENTER then
        begin
           writeln('Tecla enter');
        end else
        if teclaPressionada = TECLA_ESC then
        begin
           writeln('Tecla esc');
           break;
        end;


     end;

  end;  

Editado por GRSa
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Talvez as combinações mudem dependendo do SO.

Editado por GRSa
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