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

mr.oculus

Setas do teclado, como usar?

Recommended Posts

mr.oculus

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

Share this post


Link to post
Share on other sites
Cypher

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

Share this post


Link to post
Share on other sites
mr.oculus

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

Share this post


Link to post
Share on other sites
Cypher

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

Share this post


Link to post
Share on other sites
joao_o grande

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

Share this post


Link to post
Share on other sites
thoga31

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

Edited by thoga31
  • Vote 1

Knowledge is free!

Share this post


Link to post
Share on other sites
joao_o grande

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

Share this post


Link to post
Share on other sites
passarito

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

Share this post


Link to post
Share on other sites
thoga31

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


Knowledge is free!

Share this post


Link to post
Share on other sites
passarito

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

Edited by passarito

Share this post


Link to post
Share on other sites
GRSa

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;  

Edited by GRSa

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.