PDA

Ver la Versión Completa : Controlar Tab en DBCtrlGrid


javiermorales
30-05-2003, 09:02:34
Buenos Días, ¿alguien sabe como controlar la tabulación de un DBCtrlGrid?.

Me explico, por razones del cliente, no quiere que se navege entre los registros utilizando el DBNavigator. Por lo tanto utilizo los eventos OnKeyPress del Form y OnKeyDown de los DBCrlGrid, para simular todos los botones del DBNavigator. Todo funciona bien, salvo en el caso de moverse entre los controles de un DBCtrlGrid utilizando el ENTER y de cambiar de DBCtrlGrid utilizando otra tecla.

Lo que he llegado a conseguir es que al pulsar ENTER, anulo la pulsación y la sustituyo por TAB.

En resumen, necesito controlar que con una determianda pulsación, se mueva entre los controles de un DBCtrlGrid y con otra, cambie de DBCtrlGrid, quedando seleccionado el primer control en el orden de tabulación del DBCtrlGrid, ya que por ahora lo que pasa es que al cambiar de DBCtrlGrid se me selecciona el DBCtrlGrid y no el primer control de dicho contenedor.

Muchas Gracias.

javiermorales
03-06-2003, 14:32:55
¿A nadie se le ocurre nada?.

Solo necesito saber como controlar el manejador interno de tabulación del DBCtrlGrid.

Gracias.

marcoszorrilla
03-06-2003, 15:37:46
procedure TForm1.DBCtrlGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = vk_Return then
begin
//Si pulsan enter bajamos al siguiente control
DBCtrlGrid1.DoKey(GkDown);
end;
end;


Estos son los códigos:

gkNull Do nothing.
gkEditMode Toggle the EditMode property.
gkPriorTab Move to the previous panel.
gkNextTab Move to the next panel.
gkLeft Move one panel to the left.
gkRight Move one panel to the right.
gkUp Move one panel up.
gkDown Move one panel down.
gkScrollUp Move one panel up.
gkScrollDown Move one panel down.
gkPageUp Move ColCount * RowCount records up in the dataset.
gkPageDown Move ColCount * RowCount records down in the dataset.
gkHome Move to the first record in the dataset.
gkEnd Move to the last record in the dataset.
gkInsert Insert a new record prior to the current record in the dataset and set EditMode to True.
gkAppend Insert a new record at the end of the dataset and set EditMode to True.
gkDelete Delete the current record from the dataset and set EditMode to False.
gkCancel Cancel any edits not written to the dataset and set EditMode to False.


Un Saludo.

javiermorales
04-06-2003, 08:26:49
Muchas Gracias Marcos, le había echado un vistazo a esos códigos, pero pensaba que el "gkDown", realizaba un movimiento al siguiente DBCtrlGrid (una estupidez, suponiendo que lo normal es que exista un solo DBCtrlGrid).

Gracias de nuevo, voy a probarlo.

javiermorales
06-06-2003, 09:49:22
Hola Marcos, ya lo he probado. La utilización de:

"DBCtrlGrid1.DoKey(GkDown);"

provoca que el foco se desplace al mismo control en el que nos encontramos, pero del siguiente registro.

Si se te ocurre cualquier otra cosa, se agradecerá. Un saludo.

marcoszorrilla
06-06-2003, 15:30:15
Javier, no veo exactamente que es lo que quieres hacer, explícate un poco más a ver si encuentro respuesta a lo que pides.

Un Saludo.

javiermorales
09-06-2003, 14:47:07
Se trata de al pulsar "Enter", pasar al siguiente control del DBCtrlGrid.

Si se utiliza el "KeyPress" o el "KeyDown" del Form, controla cualquier control, menos el DBCtrlGrid, que utiliza su propio handler de tabulación. La pregunta es: ¿Como puedo controlar el paso al siguiente control del DBCtrlGrid?.

Gracias.

marcoszorrilla
09-06-2003, 19:12:53
Creo que no me has entendido bien o al reves, en cualquier caso yo no me refiero al evento del Form sino del DbCtrGrid.

Es decir el evento KeyDown del DbrCrtGrid es donde debes de colocar el código que te indique.

Si ya lo has hecho así no te entendido bien y en ese caso, si te pido que me expliques mas a fondo el asunto.

Un Saludo.

javiermorales
10-06-2003, 08:53:11
Hola Marcos, sí que utilizo el "KeyDown" del DBCtrlGrid. Te adjunto el código que utilizo. en fichero adjunto.

procedure TPartyDesc.DBCtrlGrid2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
......
if (Key=VK_RETURN) then //Simulación de Tab (Enter)
begin
Key:=VK_TAB;
DBCtrlGrid2.DoKey(gkNull);
Exit;
end;
......
end;

Como ves, cuando se presiona Enter, lo sustituyo por Tab y funciona, pero no puedo controlar su respuesta, ya que si utilizo "DBCtrlGrid1.DoKey(GkDown)", el foco pasa al mismo control, pero del siguiente registro.

La pregunta está en como controlar el paso al siguiente control del DBCtrlGrid, de una forma similar a como se hace en los forms (Perform (WM_NEXTDLGCTL,0,0)) o en los DBgrids (TDBGrid(ActiveControl).selectedindex).

Gracias.

marcoszorrilla
10-06-2003, 18:08:30
Pues a mí me funciona, si pongo dos campos en el DbCtrGrid, entonces hay dos controles:
Supongamos: nombre , apellidos
al pulsar enter, me pasa de nombre a apellidos y su pulso enter de nuevo me pasa a la siguiente celdilla del DbCtrlGrid campo nombre y después apellidos

??????

Un Saludo.