Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Como saber se 2 teclas estão precionadas?


LucAlucard

Pergunta

Olá pessoal tudo bem? Bom... Hoje estou aqui novamente com mais uma dúvidasinha... Parece simples mas eu nãos sei =/.

Como saber se 2 teclas estão precionadas? Por exemplo:

Tenho um shape. Quando eu aperto:

Seta pra cima ele sobe

Seta pra Esquerda ele Vai indo pra Esquerda

Como fazer ele ir pras duas direções? Capturar o key das duas.. quando eu apertar o key para a esquerda e cima? Alguém sabe?

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0
Como fazer ele ir pras duas direções? Capturar o key das duas.. quando eu apertar o key para a esquerda e cima? Alguém sabe?

basta apertar as 2 teclas ao mesmo tempo

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   case Key OF
      VK_LEFT    :  Shape1.Left := Shape1.Left -5;
      VK_UP      :  Shape1.Top := Shape1.Top -5;
      VK_RIGHT   :  Shape1.Left := Shape1.Left +5;
      VK_DOWN    :  Shape1.Top := Shape1.Top +5;
   end;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Como fazer ele ir pras duas direções? Capturar o key das duas.. quando eu apertar o key para a esquerda e cima? Alguém sabe?

basta apertar as 2 teclas ao mesmo tempo

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
 begin
    case Key OF
       VK_LEFT    :  Shape1.Left := Shape1.Left -5;
       VK_UP      :  Shape1.Top := Shape1.Top -5;
       VK_RIGHT   :  Shape1.Left := Shape1.Left +5;
       VK_DOWN    :  Shape1.Top := Shape1.Top +5;
    end;
 end;

abraço

Não funciona. Quando você aperta digamos.. seta pra esquerda ele vai pra esqeurda e depois ainda matendo a seta pra esquerda apertada aperta a seta pra cima ele só vai pra sima e não vai pra diagonal entende?

Link para o comentário
Compartilhar em outros sites

  • 0
Não funciona. Quando você aperta digamos.. seta pra esquerda ele vai pra esqeurda e depois ainda matendo a seta pra esquerda apertada aperta a seta pra cima ele só vai pra sima e não vai pra diagonal entende?

não é assim o funcionamento .... voce deve apertar as 2 teclas conjuntamente ( algumas vezes ) para ir na direção escolhida, e não ficar segurando uma e ficar clicando em outra... porque o código seria diferente.

voce vai encontrar um exemplo disso nesse link:

http://translate.googleusercontent.com/tra...Ub9xBasWaPVahsg

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Tudo bem... achei que voce entenderia e faria uma conversão de código

mas para exemplificar extamente o que esta querendo veja esse codigo

codigo fonte

http://fabianosalles.eti.br/blog/delphi/fi...VCLII-fonte.zip

executavel

http://fabianosalles.eti.br/blog/delphi/fi...imVCLII-bin.zip

estude o código e veja se consegue entender a lógica

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Antes que voce pergunte, vou sanar a sua dúvida ...

voce deve apertar as 2 teclas conjuntamente para ir na direção escolhida ... o shape se moverá na horizontal, vertical e diagonal

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Shape1: TShape;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function tbKeyIsDown(const Key: integer): boolean;
begin
  Result := GetKeyState(Key) and 128 > 0;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

if tbKeyIsDown(VK_LEFT) then
   Shape1.Left := Shape1.Left -5;

if tbKeyIsDown(VK_UP) then
   Shape1.Top := Shape1.Top -5;

if tbKeyIsDown(VK_RIGHT) then
   Shape1.Left := Shape1.Left +5;

if tbKeyIsDown(VK_DOWN) then
   Shape1.Top := Shape1.Top +5;

end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Cara desculpa a ignorância mas eu não entendi a sua função.

Como um resultado booleano pegou a Key e mais esse 128 > 0?

Não entendi essa linha. você pd me explicar por favor?

Outra dúvida... Na sua função você colocou que a sua "Key" é uma constante.. Quando devemos deixar os parâmetros das funções com "cons","var" ou qualquer coisa do gênero. Eu nunca entendi isso...

Brigadão pela forç Jhonas! ^^

Editado por LucAlucard
Link para o comentário
Compartilhar em outros sites

  • 0

Temos dificuldades em entender quando não esta no nosso idioma...rs

The GetKeyState function retrieves the status of the specified virtual key. The status specifies whether the key is up, down, or toggled (on, off ¾ alternating each time the key is pressed).

SHORT GetKeyState(

int nVirtKey // virtual-key code

);

Parameters

nVirtKey

Specifies a virtual key. If the desired virtual key is a letter or digit (A through Z, a through z, or 0 through 9), nVirtKey must be set to the ASCII value of that character. For other keys, it must be a virtual-key code.

If a non-English keyboard layout is used, virtual keys with values in the range ASCII A through Z and 0 through 9 are used to specify most of the character keys. For example, for the German keyboard layout, the virtual key of value ASCII O (0x4F) refers to the "o" key, whereas VK_OEM_1 refers to the "o with umlaut" key.

Return Values

If the function succeeds, the return value specifies the status of the given virtual key. If the high-order bit is 1, the key is down; otherwise, it is up. If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.

Resumindo:

Esta função retorna true se a tecla informada estiver pressionada. False em caso contrário.

Como um resultado booleano pegou a Key e mais esse 128 > 0?

Inicialmente, o código ASCII só utilizava números de 0 a 127 e os equipamentos tinham um número reduzido de caracteres. Não tinham letras acentuadas, por exemplo.

Várias extensões ao código ASCII foram propostas, para que o conjunto de caracteres representáveis possuísse até 256 caracteres.

entendeu porque 128 no código ? caso não tenha entendido veja:

http://tectuts.wordpress.com/2008/08/12/ca...s-e-os-codigos/

Na sua função você colocou que a sua "Key" é uma constante.. Quando devemos deixar os parâmetros das funções com "cons","var" ou qualquer coisa do gênero. Eu nunca entendi isso...

function tbKeyIsDown(const Key: integer): boolean;
begin
  Result := GetKeyState(Key) and 128 > 0;
end;

porque Key sempre vai retornar um valor numérico inteiro, então ao passar o valor de Key ( que seria um numero ) a função vai testar o estado da tecla pressionada

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Ainda n entendi como o Result que é boolean conseguiu capturar um valor Inteiro. porque isso funcionou?

vou dar um exemplo bem simples

function parimpar(var num:integer) :boolean;
begin
   if num mod 2 = 0 then
      result := true
   else
      result := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n : integer;
begin
  n := 3;
  if parimpar(n) then
     showmessage('par')
  else
     showmessage('impar');
end;

veja que eu defini uma variavel inteira como entrada da função, e uma variavel boleana como saida da função

veja que vou testar o resto de uma divisão de um numero que será 0 ou diferente de 0

se o resto da divisão for zero o numero é par, caso contrário é impar e para cada teste digo se o numero e true ou false para o resto da divisão ... entendeu ?

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Então se ele for 0 (par) ele é True caso contrário ele é False?

extamente

function parimpar(var num:integer) :boolean;
begin
   if num mod 2 = 0 then
      result := true
   else
      result := false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var n : integer;
begin
  n := 3;
  if parimpar(n) then
     showmessage('par')  // se o resto da divisão for 0
  else
     showmessage('impar'); // se o resto da divisão for > 0
end;

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...