Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-09-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.096
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Cómo simular de "verdad" las teclas SHIFT+TAB?

Hola, me explico:

Tengo un simple TStringGrid, al iniciar está el foco en la primera celda, la fila 1, columna1, ya que la 0,0 es la del título y la de los datos del lado izquierdo.
Si se pulsa la tecla TAB, el foco pasa a la siguiente, fila 1, columna 2. Si se repite la pulsación de TAB pasamos a fila 1, columna 3.
Cuando se pulsa TAB en la última columan de la primera fila entonces el foco pasa a la primera celda de la segunda columna (2,1), y así sucesivamente hasta llegar a la última fila, columna.
Una vez allí, si pulsamos TAB, el foco vuelve al principio, a la celda 1,1. Hasta aquí no he dicho nada que todos sepáis.
Bien, si en lugar de pulsar TAB, decidimos pulsar SHIFT+TAB, el proceso es exactamente el mismo, pero al revés, marcha atrás, del final hacia el principio. Y siempre, en ambos casos, es una "rueda" sin fin.



Bien, lo complicamos un poco, tengo un array bidimensional con las mismas celdas que tiene el Grid, básicamente se ve así:

Código Delphi [-]
aCeldas : array of array of boolean;
(false,false,false,false,false,false,false,false,false,false),
(false,false,false,false,false,false,false,false,false,false),
(false,false,false,false,false,false,false,false,false,false),
(false,false,false,false,false,false,false,false,false,false)

Cada posición del array representa una celda del StringGrid anterior.


Código Delphi [-]
procedure TFprobando.grTSelectCell(Sender: TObject; ACol,  ARow: Integer; var CanSelect: Boolean);
begin
  inherited;
  if aCeldas[ARow-1,ACol] = false then  // si no es editable la celda, entonces pasamos a la siguiente editable
  begin
    keybd_event(VK_TAB, 0, 0, 0);
    keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
  end;
end;

¿Qué hace esto?, fácil, si nos movemos a una celda de StringGrid y en el array aCeldas esa posición está a 'false', simula la tecla TAB y pasa a la siguiente posición.

Todo este "invento" es para que sólo puedan ser editadas unas celdas y otras no, lo mismo existe otra forma mucho más cómoda de hacerlo, pero no se me ha ocurrido o, enfrascado en esto, se me olvidó.

Bien, sigo, cambiamos los valores del array para probarlo:

Código Delphi [-]
aCeldas : array of array of boolean;
(false,true,true,false,false,false,true,true,false,false),
(false,false,true,true,true,false,false,false,true,true),
(false,true,true,false,false,false,true,true,false,false),
 (false,false,true,true,true,false,false,false,true,true)

Perfecto, si nos movemos con la tecla TAB o con la tecla SHIFT+TAB, funciona perfecto, tanto hacia delante como hacia atrás, se salta las celdas que en el array están a false y sólo se posiciona en las que están a true.
Aunque cuando va hacia atrás no debería de funcionar, viendo el código del evento SelectCell se ve que debería de avanzar, no retroceder, cuando encuentre una posición con valor false , pero funciona perfecto.
Bien, continuo, lo que quiero es que pulsando las teclas de flechas IZQUIERDA y DERECHA funcione exactamente igual que con las teclas TAB y SHIFT+TAB.
He buscado por los foros y he encontrado diversas formas, pero ninguna de ellas funciona, eso me hace sospechar que no son de "verdad" simuladoras de la pulsación de esas teclas.
Ahora sí, ya termino:
¿Cómo puedo simular de verdad las teclas SHIFT+TAB, para que el resultado sea exactamente igual que pulsando esas teclas?.

¡Ale!, se acabó el rollo
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Detectar pulsación de teclas Ctrl, Alt y Shift y teclas virtuales (de función,...) rrf Varios 11 09-08-2017 13:24:21
El programa se queda "colgado" mientras copia y luego "despierta" NeWsP OOP 5 10-03-2010 22:05:40
Como hacer que se vea "Si" en vez de "TRUE" en un DBGrid lu9eui C++ Builder 2 07-08-2007 04:03:13
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53


La franja horaria es GMT +2. Ahora son las 18:56:40.


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
Copyright 1996-2007 Club Delphi