Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-07-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
KeyDown

Bueno, esta vez si me tranqué de verdad...

La calculadora ya funciona de forma correcta en lo que tiene que ver con hacer operaciones, pero ahora quiero poder ingresar los números por teclado también, y entiendo que tengo que manejar el evento KeyDown, pero no hay caso, no lo puedo hacer funcionar.

Vi algunos ejemplos en internet e intenté replicarlos pero no hubo caso. Lo que tengo es lo siguiente:

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

begin
if key = 49 then
begin
btn1.Click;
end;
end;
Es el evento KeyDown del Form1 (¿tendría que hacerlo en el TEdit en vez del Form?, yo elegí el form porque es lo que siempre tiene el foco, pero lo cierto es que no tengo claro el manejo de eventos), y la idea es que dispare el evento click del botón correspondiente. En ese código lo que quise hacer es que la tecla 1 ejecute el evento click del botón 1 de la calculadora.

Variantes probé varias, probé if key = #49, if (key = #49), if key in [49], if key in [#49] y varias más que ahora no recuerdo, algunas dieron error y otras compilaron bien pero ninguna funcionó. Claramente estoy haciendo algo mal.

Gracias por su ayuda.

P.D.: Por si a alguien le interesa, acá el link del ejecutable actual de la calculadora drive.google.com/open?id=0B2s4ogym-XemRUNPbzhtaWcxbEE
Responder Con Cita
  #2  
Antiguo 23-07-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Proba seteando la propiedad KeyPreview del Form a True
Responder Con Cita
  #3  
Antiguo 23-07-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
Gracias

Pero la p... que fácil que era.

Me funciona con el botón de arriba a la izquierda, abajo del F1, y no con el numérico que está a la derecha, pero supongo que es una cuestión de cambiarle el número, en lugar de 49 tendré que usar otro.

Muchas gracias, me destrancaste, jeje.

EDITO:

¿Cuáles son los números ascii de las teclas numéricas de la derecha?, ¿o cómo puedo capturar para saber qué código son usando el evento?. Recién puse un ShowMessage() y se disparó al apretar el 1 del teclado numérico, pero, ¿cómo almaceno eso para saber qué código tengo que poner en el IF?.

Gracias.
Responder Con Cita
  #4  
Antiguo 23-07-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Podes usar las constantes VK_NUMPADX, donde X es un numero entre 0-9. Estas estan definidas en la unidad Winapi.Windows

Te recomiendo que uses estas constantes en lugar de, como suele llamarseles, "valores magicos", porque el 13 es el enter, y el 27 el escape, pero es mas practico leer VK_ESCAPE, VK_RETURN, etc
Responder Con Cita
  #5  
Antiguo 23-07-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
Error: Identifier not found "VK_MULTIPLY"

Gracias, no encontré la unidad Winapi.windows (asumo que es un archivo) ni windows.pas como leí un comentario tuyo en otro hilo que también podría aparecer, pero si encontré el archivo LCLType.pp.

En dicho archivo me figura lo siguiente:

VK_NUMPAD0 = 96; // $60
VK_NUMPAD1 = 97;
VK_NUMPAD2 = 98;
VK_NUMPAD3 = 99;
VK_NUMPAD4 = 100;
VK_NUMPAD5 = 101;
VK_NUMPAD6 = 102;
VK_NUMPAD7 = 103;
VK_NUMPAD8 = 104;
VK_NUMPAD9 = 105;
VK_MULTIPLY = 106; // VK_MULTIPLY up to VK_DIVIDE are usually in the numeric keypad in PC keyboards
VK_ADD = 107;
VK_SEPARATOR = 108;
VK_SUBTRACT = 109;
VK_DECIMAL = 110;
VK_DIVIDE = 111;

Y por lo que probé en el evento KeyDown funciona con el valor numérico, no con el texto. Si pongo VK_MULTIPLY (por ejemplo) al compilar me aparece el error del asunto (Error: Identifier not found "VK_MULTIPLY"), pero usando el valor numérico (106 en el caso de MULTIPLY) si funciona.

Por otro lado con el evento KeyPress no me funciona de ninguna de las dos maneras, ni con valor numérico ni con el texto. Si pongo números el error pasa a ser:

Error: Incompatible types: got "Char" expected "Int64"

Pero bueno, uso el evento KeyDown únicamente y listo, yo había hecho una especie de división entre botones que utilicen keydown y botones que utilicen keypress porque si tu abres la calculadora de Windows y dejas un número apretado se irá escribiendo varias veces, pero al mismo tiempo un signo de operación no tiene que repetirse, se aprieta una vez sola hasta que haya otro número ingresado, por eso quise hacer de la siguiente manera:

Cita:
{___________________________________________________________________________________________________ _________________________________________________________

--- EVENTO KEYDOWN ---
____________________________________________________________________________________________________ _________________________________________________________}

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

begin

{BOTÓN 0}

if key = 96 then
begin
btn0.Click;
end;

{BOTÓN 1}

if key = 97 then
begin
btn1.Click;
end;

{BOTÓN 2}

if key = 98 then
begin
btn2.Click;
end;

{BOTÓN 3}

if key = 99 then
begin
btn3.Click;
end;

{BOTÓN 4}

if key = 100 then
begin
btn4.Click;
end;

{BOTÓN 5}

if key = 101 then
begin
btn5.Click;
end;

{BOTÓN 6}

if key = 102 then
begin
btn6.Click;
end;

{BOTÓN 7}

if key = 103 then
begin
btn7.Click;
end;

{BOTÓN 8}

if key = 104 then
begin
btn8.Click;
end;

{BOTÓN 9}

if key = 105 then
begin
btn9.Click;
end;

{BOTÓN <}

if key = 08 then
begin
btnBS.Click;
end;

end;

{___________________________________________________________________________________________________ _________________________________________________________

--- EVENTO KEYPRESS ---
____________________________________________________________________________________________________ _________________________________________________________}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin

{VK_MULTIPLY}

if key = 106 then
begin
btnMultiplicacion.Click;
end;

{VK_ADD}

if key = 107 then
begin
btnSuma.Click;
end;

{VK_SUBTRACT}

if key = 109 then
begin
btnResta.Click;
end;

{VK_DECIMAL}

if key = 110 then
begin
btnComa.Click;
end;

{VK_DIVIDE}

if key = 111 then
begin
btnDivision.Click;
end;

end;
Como puedes ver ahí tengo bajo el evento keydown los números y el botón de borrar (<) y bajo el evento keypress los signos de operación (+, -, X, /, punto, etc). Pero bueno, si abres la calculadora de Windows y dejas presionado una tecla de operación el botón responde al evento keypress, simplemente no escribe nada, pero responde. Así que utilizo keydown para todos y controlo por código que no se escriba si ya está escrito y esperando otro número y no otra operación. De hecho con el evento keypress si bien cambia el comportamiento del botón también tendría que controlar que no se ingresase más de una vez, así que por ese lado no cambia.

Volviendo al tema de usar el identificador VK o el número, ¿sabes de qué manera podría usar el texto en vez del número?, porque coincido contigo que visualmente es mejor a la hora de leer. Por el momento como puedes ver más arriba le agregué un comentario.

Una vez más, gracias por tu ayuda.
Responder Con Cita
  #6  
Antiguo 23-07-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
No me percate de que estabamos hablando de Lazarus

Acabo de hacer esta sencilla prueba y me funciona bien:

Código Delphi [-]
uses
  LCLType;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_NUMPAD0 then
     ShowMessage('VK_NUMPAD0');

  if Key = VK_MULTIPLY then
     ShowMessage('VK_MULTIPLY');
end;

Obvio que es necesario tener KeyPreview a True
Responder Con Cita
  #7  
Antiguo 23-07-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
Si si, Lazarus, jeje.

Cita:
Empezado por AgustinOrtu Ver Mensaje
No me percate de que estabamos hablando de Lazarus
En un momento me imaginé que venía por ese lado el tema.

Cita:
Empezado por AgustinOrtu Ver Mensaje

Acabo de hacer esta sencilla prueba y me funciona bien:

Código Delphi [-]
uses
  LCLType;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_NUMPAD0 then
     ShowMessage('VK_NUMPAD0');

  if Key = VK_MULTIPLY then
     ShowMessage('VK_MULTIPLY');
end;

Obvio que es necesario tener KeyPreview a True
¿Dónde iría el "uses LCLType;"?, porque lo puse inmediatamente antes del procedure tal cual lo tienes ahí y cuando compilo me pone:

"Fatal: Syntax error, "BEGIN" expected but "USES" found"

Actualmente el código está así:

Código Delphi [-]
{___________________________________________________________________________________________________  _________________________________________________________

--- EVENTO KEYDOWN ---
____________________________________________________________________________________________________  _________________________________________________________}

uses LCLType;

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

begin

 {BOTÓN 0}

  if key = 96 then
  begin
    btn0.Click;
  end;

 {BOTÓN 1}

  if key = 97 then
  begin
    btn1.Click;
  end;

 {BOTÓN 2}

  if key = 98 then
  begin
    btn2.Click;
  end;

 {BOTÓN 3}

  if key = 99 then
  begin
    btn3.Click;
  end;

 {BOTÓN 4}

  if key = 100 then
  begin
    btn4.Click;
  end;

 {BOTÓN 5}

  if key = 101 then
  begin
    btn5.Click;
  end;

 {BOTÓN 6}

  if key = 102 then
  begin
    btn6.Click;
  end;

 {BOTÓN 7}

  if key = 103 then
  begin
    btn7.Click;
  end;

 {BOTÓN 8}

  if key = 104 then
  begin
    btn8.Click;
  end;

 {BOTÓN 9}

  if key = 105 then
  begin
    btn9.Click;
  end;

 {BOTÓN <}

  if key = 08 then
   begin
     btnBS.Click;
   end;

  {VK_MULTIPLY}

    if key = 106 then
   begin
     btnMultiplicacion.Click;
   end;

  {VK_ADD}

  if key = 107 then
   begin
     btnSuma.Click;
   end;

  {VK_SUBTRACT}

  if key = 109 then
   begin
     btnResta.Click;
   end;

  {VK_DECIMAL}

  if key = 110 then
   begin
     btnComa.Click;
   end;

  {VK_DIVIDE}

  if key = 111 then
   begin
     btnDivision.Click;
   end;

  {VK_RETURN}

  if key = 13 then
   begin
     btnIgual.Click;
   end;

end;

Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Opinión sobre la estabilidad actual de Lazarus/Free Pascal Toni Lazarus, FreePascal, Kylix, etc. 34 06-02-2016 01:04:45
Soy desarrollador de Delphi ¿Que necesito saber para usar Lazarus? Godzuki Linux 7 23-02-2012 23:54:34
Lazarus, Nemesis Pascal rmendoza83 Varios 1 08-01-2009 17:41:08
Indy soporta Free Pascal/Lazarus Delfino Noticias 6 15-01-2006 10:55:55
Free Pascal y Lazarus Magician^ Noticias 7 31-03-2004 19:12:04


La franja horaria es GMT +2. Ahora son las 22:43:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi