PDA

Ver la Versión Completa : Identificar que tecla he pulsado


Angel.Matilla
29-09-2020, 12:55:48
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:
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
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
La propiedad taborder de los componentes de edición.

Vale.
https://i.ibb.co/8B1PTJZ/Panel.jpg
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

...

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(TWMKey& msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CM_DIALOGKEY, TWMKey, CMDialogKey)
END_MESSAGE_MAP(TForm)
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};

...


.cpp

...

bool Valida = true;

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


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


Saludos :)

Angel.Matilla
30-09-2020, 18:53:05
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
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:

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

O sólo al edit en cuestión:

void __fastcall TForm1::CMDialogKey(TWMKey& msg)
{
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