PDA

Ver la Versión Completa : Simular un Shift+Tab (Control anterior)


sitrico
30-08-2005, 22:25:57
Tengo el siguiente código enel OnKeyPress de un dbGrid:


If (dbAsi.State <> dsBrowse) And Not(ssShift in Shift) Then
Begin
If (Key = VK_DOWN) Then
Key := VK_TAB
If (Key = VK_UP) Then
Begin
Shift := Shift + [ssShift];
Key := VK_TAB; // Shift Tab
DBGridAsiKeyDown(Sender,Key,Shift);
Key := 0;
End
End;


La intención es que cuando el usuario edite la base de datos (dbAsi.State <> dsBrowse) y pulse las teclas flecha arriba y abajo en lugar de salir del registro se cambie de una columna a otra.

VK_Up = Shift+Tab y VK_Down = Tab

Con Vk_Down funciona perfecto pero, ¿ como simulo un Shift+Tab ?

Trate con SelectNext pero me salta al siguiente control (sale del dbGrid).

Si pulso shift+tab recibo los valores que uso aqui (Shift = ssShift y Key = VK_TAB)

También quisiera que el Enter trabajara como tab

Siempre hablando que el ActiveControl es un DBGrid.

Gracias

delphi.com.ar
30-08-2005, 22:39:23
Trate con SelectNext pero me salta al siguiente control (sale del dbGrid).Pusiste el parámetro GoForward en False????

roman
30-08-2005, 22:52:52
La intención es que cuando el usuario [...] pulse las teclas flecha arriba y abajo en lugar de salir del registro se cambie de una columna a otra.


¿Usar las teclas de dirección vertical para movimiento horizontal?

Bueno, supongo que tú sabes por qué. Prueba esto:


if Key = VK_UP then
begin
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(VK_TAB, 0, 0, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

Key := 0;
end;




Pusiste el parámetro GoForward en False????


SelectNext, para adelante o para atrás me parece que no sirve aquí pues no se trata de cambiar el foco del dbgrid a otro control sino de moverse entre las celdas.

// Saludos

sitrico
31-08-2005, 20:31:57
Gracias a los dos, al final funcionó con un método similar al de Roman, buscando con Google encontré el procedimiento:


procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
{************************************************************
* Procedure PostKeyEx32
*
* Parameters:
* key : virtual keycode of the key to send. For printable
* keys this is simply the ANSI code (Ord(character)).
* shift : state of the modifier keys. This is a set, so you
* can set several of these keys (shift, control, alt,
* mouse buttons) in tandem. The TShiftState type is
* declared in the Classes Unit.
* specialkey: normally this should be False. Set it to True to
* specify a key on the numeric keypad, for example.
* Description:
* Uses keybd_event to manufacture a series of key events matching
* the passed parameters. The events go to the control with focus.
* Note that for characters key is always the upper-case version of
* the character. Sending without any modifier keys will result in
* a lower-case character, sending it with [ssShift] will result
* in an upper-case character!
// Code by P. Below
************************************************************}
type
TShiftKeyInfo = record
shift: Byte;
vkey: Byte;
end;
byteset = set of 0..7;
const
shiftkeys: array [1..3] of TShiftKeyInfo =
((shift: Ord(ssCtrl); vkey: VK_CONTROL),
(shift: Ord(ssShift); vkey: VK_SHIFT),
(shift: Ord(ssAlt); vkey: VK_MENU));
var
flag: DWORD;
bShift: ByteSet absolute shift;
i: Integer;
begin
for i := 1 to 3 do
begin
if shiftkeys[i].shift in bShift then
keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
end; { For }
if specialkey then
flag := KEYEVENTF_EXTENDEDKEY
else
flag := 0;

keybd_event(key, MapvirtualKey(key, 0), flag, 0);
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0);

for i := 3 downto 1 do
begin
if shiftkeys[i].shift in bShift then
keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
KEYEVENTF_KEYUP, 0);
end; { For }
end; { PostKeyEx32 }

Que simula la pulsación de cualquier tecla. Al final Quedo Asi:


If (dbAsi.State <> dsBrowse) And Not(ssShift in Shift) Then
Begin
If (Key = VK_DOWN) Then
Key := VK_TAB; // Down As TAB
If (Key = VK_UP) Then
Begin // UP As Shift+Tab
PostKeyEx32(Vk_Tab,[ssShift],False);
Key := 0;
End;

Sobre:

¿Usar las teclas de dirección vertical para movimiento horizontal?

"El cliente siempre tiene la razón"

Gracias nuevamente