Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Identificar que tecla he pulsado (https://www.clubdelphi.com/foros/showthread.php?t=94894)

Angel.Matilla 29-09-2020 12:55:48

Identificar que tecla he pulsado
 
En concreto estoy tratando de saber si se ha pulsado Shift + Tab para volver al campo de edición anterior. Tengo puesto este código en el evento OnKeyDown:
Código:

if (Key == VK_TAB && Shift.Contains(ssShift))
    Edit1->OnExit = NULL;

pero sólo me reconoce la pulsación de Tab.

Casimiro Notevi 29-09-2020 19:53:29

¿Eso no lo hace de forma predeterminada?

Angel.Matilla 30-09-2020 11:29:16

No. Sólo me reconoce haber pulsado el TAB.

fjcg02 30-09-2020 12:34:59

Revisa wl orden de tabulación de las cajas de edición.

Esto lo hace el SO de forma automática.

Saludos

Angel.Matilla 30-09-2020 12:54:25

Cita:

Empezado por fjcg02 (Mensaje 538647)
Revisa wl orden de tabulación de las cajas de edición.

Esto lo hace el SO de forma automática.

Saludos

No entiendo que quieres decir.

Casimiro Notevi 30-09-2020 13:07:06

La propiedad taborder de los componentes de edición.

Angel.Matilla 30-09-2020 13:16:18

Cita:

Empezado por Casimiro Notevi (Mensaje 538649)
La propiedad taborder de los componentes de edición.

Vale.

En este panel el TabOrder es 0 a 3 desde la izquierda. Si estoy en el último campo (Censo) y no he puesto ninguna cantidad pero tengo que volver hacia atrás, al salir de ese Edit se hace una validación para que no se ponga un valor nulo o incorrecto y no se me ocurre como evitar esa validación; por eso estaba intentando hacerlo en el OnKeyDown.

ecfisa 30-09-2020 16:33:16

Hola.

Intenta de este modo:

.h
Código PHP:

...

class 
TForm1 : public TForm
{
__published:    // IDE-managed Components
  
TEdit *Edit1;
  
TEdit *Edit2;
  
TEdit *Edit3;
  
TEdit *edCenso;
  
void __fastcall edCensoExit(TObject *Sender);
private:    
// User declarations
  
void __fastcall CMDialogKey(TWMKeymsg);
  
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER
(CM_DIALOGKEYTWMKeyCMDialogKey)
  
END_MESSAGE_MAP(TForm)
public:        
// User declarations
  
__fastcall TForm1(TComponentOwner);
};

... 

.cpp
Código PHP:

...

bool Valida true

void __fastcall TForm1::edCensoExit(TObject *Sender)
{
  if (
Valida)
    
ShowMessage("SE VALIDA");
  else
    
ShowMessage("NO SE VALIDA");
}


void __fastcall TForm1::CMDialogKey(TWMKeymsg)
{
  
Valida = !(msg.CharCode == VK_TAB && GetKeyState(VK_SHIFT) < 0);
  
TForm::Dispatch(&msg);


Saludos :)

Angel.Matilla 30-09-2020 18:53:05

Cita:

Empezado por ecfisa (Mensaje 538651)
Hola.

Intenta de este modo:
Saludos :)

Gracias por la ayuda. Funciona pero al entrar en OnExit me da un error Stack Overflow, y es que sigue yendo a validar las teclas pulsadas.

ecfisa 30-09-2020 22:09:24

1 Archivos Adjunto(s)
Hola de nuevo.

Tal vez haya algún evento mas en juego en tu código. En mi prueba, que realiza la validación en el evento OnExit, no dá error en absoluto.

Te adjunto la prueba para que cotejes, espero que te sirva.

Saludos :)

ecfisa 30-09-2020 23:04:42

Hola.

También puedes limitar la comprobación a los edits:
Código PHP:

void __fastcall TForm1::CMDialogKey(TWMKeymsg)
{
  if (
ActiveControl->ClassNameIs("TEdit"))
    
Valida = !(msg.CharCode == VK_TAB && GetKeyState(VK_SHIFT) < 0);
  
TForm::Dispatch(&msg);


O sólo al edit en cuestión:
Código PHP:

void __fastcall TForm1::CMDialogKey(TWMKeymsg)
{
  if (
ActiveControl->Name == "edCenso" )
    
Valida = !(msg.CharCode == VK_TAB && GetKeyState(VK_SHIFT) < 0);
  
TForm::Dispatch(&msg);


Saludos :)

Angel.Matilla 01-10-2020 10:53:36

Gracias ecfisa. El ejemplo que me has mandado funciona perfectamente. Tengo que ver que estoy haciendo mal para que a mi no me funcione.

Angel.Matilla 01-10-2020 11:01:35

Ya encontré que estaba haciendo mal. Estaba definiendo mal esa variable Valida y por eso no hacía bien el proceso. Gracias a todos.

ElKurgan 01-10-2020 12:01:41

Gracias a ti, por compartir la solución

Un saludo


La franja horaria es GMT +2. Ahora son las 17:00:10.

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