PDA

Ver la Versión Completa : focus de los componentes de un ventana


odiseeus
04-01-2013, 21:06:29
Buen día,

tengo una duda respecto al focus, como se hace para saber cual es el orden y cual es el componente que tiene el foco y cual es el que le sigue.... por ejemplo si tengo cierta cantidad de Edit's en una ventana pero dependiendo de lo digitado en el primero los siguientes o solo algunos se desabilitan... como se le dice a la ventana que vaya al siguiente componente que puede tener el foco, sin utilizar la tabulación... ademas como hago para cambiar el comportamiento de cambio de foco para que no sea con tabulacion si no con otra tecla?.. por ejemplo enter... y desabilitar la tabulacion como cambio de foco entre los componentes.... Muchas gracias.

yo sé que los componentes y su orden de tomar el foco se guian por una propiedad llamada TabOrder que es un numero, entonces la ventana activa debe mantener ese numero en algún lado... como hago para decirle a la aplicacion tome el componente con el taborder 6 por ejemplo... gracias y espero haberme explicado...

TOPX
04-01-2013, 22:01:26
Saludos,

cual es el orden y cual es el componente que tiene el foco y cual es el que le sigue....

Por favor revise el método GetTabOrderList (http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.Controls.TWinControl.GetTabOrderList) de la forma (si desciende de TWinControl).

ademas como hago para cambiar el comportamiento de cambio de foco para que no sea con tabulacion si no con otra tecla?.. por ejemplo enter... y desabilitar la tabulacion como cambio de foco entre los componentes

En el evento OnKeyPress, si aplica para su TEdit, puede capturar la tecla "Enter" (vk_return) pulsada y llamar al método SelectNext (http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.Controls.TWinControl.SelectNext) de la forma (si desciende de TWinControl).

Y en el evento OnKeyUp/OnKeyDown, puede capturar la tecla "Tab" (vk_tab) pulsada y hacer lo propio. Aunque, si no me equivoco, podría optar mejor por capturar el mensaje de Windows cm_dialogkey, para la forma completa.

-

odiseeus
07-01-2013, 03:57:54
gracias, :) .... me sirvió de guía pero me encantaría saber un poco mas exacto como puedo anular el tab como cambio de foco entre los componentes.. gracias.

ecfisa
08-01-2013, 03:13:48
gracias, :) .... me sirvió de guía pero me encantaría saber un poco mas exacto como puedo anular el tab como cambio de foco entre los componentes.. gracias.
Hola.

En este ejemplo, anulo la tecla Tab como generadora del cambio de foco y le doy esta función a la tecla F2.

Unit1.h:

...
private:
TMessageEvent OldMessageEvent;
void __fastcall ApplicationMessage(tagMSG &msg, bool &handled);
...


Unit1.cpp:

...
void __fastcall TForm1::ApplicationMessage(tagMSG &msg, bool &handled)
{
if (msg.message == WM_KEYDOWN)
switch (msg.wParam) {
case VK_TAB : handled = true; break; // TAB
case VK_F2: msg.wParam = VK_TAB; break; // F2 = TAB
}
}


void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldMessageEvent = Application->OnMessage;
Application->OnMessage = ApplicationMessage;
}

//...

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Application->OnMessage = OldMessageEvent;
}
...

Podes asignar el comportamiento a otra tecla, o a ninguna como en este código:

void __fastcall TForm1::ApplicationMessage(tagMSG &msg, bool &handled)
{
if (msg.message == WM_KEYDOWN && msg.wParam == VK_TAB)
handled = true;
}


Saludos.

odiseeus
08-01-2013, 18:45:14
Muchas gracias ecfisa... siempre tan explicito... :) ... gracias... completamente entendido, lo probaré... gracias :D