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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-10-2005
fdelamo fdelamo is offline
Miembro
 
Registrado: oct 2005
Ubicación: Sotoca de Tajo - Guadalajara (ESP)
Posts: 86
Poder: 19
fdelamo Va por buen camino
Post Cancelar ShortCut en un TButton

Hola,

Tengo un problema con las shortcuts en los botones, en un formulario tengo un TButton con una ShortCut, y un StringGrid, en el evento del KeyPress o KeyDown del grid tengo código para buscar el texto que voy pulsando.

El problema es que si pulso la tecla del ShortCut del Boton (aunque no tenga pulsado el Alt) se ejecuta, y precisamente eso es lo que quiero evitar, ya que el botón lo que hace es limpiar el grid.

No he encontrado la forma de evitar que se ejecute el código del botón sin tocar su código, ya que esto es lo que quiero evitar.

Gracias por adelantado
Responder Con Cita
  #2  
Antiguo 28-10-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Normalmente en las teclas de acceso rápido se usan combinaciones compuestas de ALT o CTRL para evitar esos comportamientos.

¿Qué combinación de teclas tienes asignada al botón?
¿Y qué código tienes programado en los eventos?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 28-10-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
El ShortCut del botón esta dado por la letra que sigue al simbolo & que esta en la propiedad Caption del botón. Simplemente elimina el &.
__________________
[Crandel]
Responder Con Cita
  #4  
Antiguo 28-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Crandel
Simplemente elimina el &.
Pero esto es un poco drástico ¿no? Tal como describe la situación, debería funcionar bien; si el foco no está en el botón, el shortcut debería generarse sólo mediante ALT.

// Saludos
Responder Con Cita
  #5  
Antiguo 31-10-2005
fdelamo fdelamo is offline
Miembro
 
Registrado: oct 2005
Ubicación: Sotoca de Tajo - Guadalajara (ESP)
Posts: 86
Poder: 19
fdelamo Va por buen camino
Hola Neftali,

siento no haber contestado antes he estado de puente y he llegado ahora

no tengo nada especial puesto en el código, lo puedes probar tú, pon un stringgrid, y en el código del keypress le dices que si pulsas la b le dices que muestre un mensaje,

y pon tambien un botón con caption &button1 (tecla de acceso rapido b) y en el código del onclick que te muestre otro mensaje.

Al seleccionar el grid y pulsar la b, te muestra los dos mensajes.

El tema que no debe ser por el grid, ya que si el foco está en otro botón (en realidad creo que pasa con cualquier control que no sea editable) también ocurre lo mismo.

Siento no poner el código, pero ahora mismo estoy con un ordenador que no tiene delphi instalado.

Muchas gracias por tu respuesta de todas formas.
Responder Con Cita
  #6  
Antiguo 31-10-2005
fdelamo fdelamo is offline
Miembro
 
Registrado: oct 2005
Ubicación: Sotoca de Tajo - Guadalajara (ESP)
Posts: 86
Poder: 19
fdelamo Va por buen camino
Cita:
Empezado por roman
Pero esto es un poco drástico ¿no? Tal como describe la situación, debería funcionar bien; si el foco no está en el botón, el shortcut debería generarse sólo mediante ALT.

// Saludos
Hola Roman, Crandel,

Como dice Roman esto sería muy drástico. Crandel, lo que sugieres me resultaría muy costoso, el control no es un stringgrid (es un grid derivado del TCustomGrid, aunque el stringgrid se comporta igual), y ese componente lo uso en, no se, quizá 200 pantallas del programa (y todos o casi todos los botaones tienen una tecla de acceso rápido). Lo que ocurre es que los usuarios han solicitado esta funcionalidad, ya que para buscar alguna fila en el grid así es mucho más cómodo que buscarla con los cursores o ratón (y tienen razón), y al tocar el componente, me he dado cuenta que ocurría esto.

Por esa razón no quiero tocar el código del programa para solucionar este problema, lo quisiera hacer desde el código del componente. He probado a asignar a la variable por referencia "Char" (creo que se llama así) un valor 0, pero da igual, se ejecuta el código del botón.

Si se os ocurre algo ya me contaréis, de todas formas gracias por vuestra atención, y yo seguiré investigando, a ver si descubro algo.

Un saludo
Responder Con Cita
  #7  
Antiguo 11-11-2005
fdelamo fdelamo is offline
Miembro
 
Registrado: oct 2005
Ubicación: Sotoca de Tajo - Guadalajara (ESP)
Posts: 86
Poder: 19
fdelamo Va por buen camino
¿Solución encontrada?

Hola a todos,

Creo que he encontardo una solución, aunque seguramente no sea la mejor, ya que lo he hecho por medio de hooks.

Lo que hago es crear un hook de teclado, para capturar las teclas pulsadas.

Os explico con el código:

Variables que me hacen falta, yo las he puesto globales en la unidad
Código Delphi [-]
var
  HookKbd: HHook; //Identificador del Hook creado
  EsSegundaVez: Boolean; //Para solo procesarlo una vez, el caso es que para
                         //cade tecla lo captura dos veces ¿el Down y el Up?

En la parte del Create del componente:
Código Delphi [-]
  HookKbd := 0; //Inicializamos
  //Con el IDE da un error y cierra el programa y el IDE ¿por que?
  if not((FindWindow('TAppBuilder',nil) > 0) and
     (FindWindow('TPropertyInspector',nil) > 0) and
     (FindWindow('TAlignPalette',nil) > 0)) then
  begin
    //Comprobamos la version de windows (en 98 no tira)
    Version.dwOSVersionInfoSize:=SizeOf(Version);
    GetVersionex(Version);
    if Version.dwPlatformId <> VER_PLATFORM_WIN32_WINDOWS then
    begin
      //Creamos el Hook
      HookKbd := SetWindowsHookEx(WH_KEYBOARD, @KbdHook, HInstance, 0);
      EsSegundaVez := False; //Inicializacion
    end;
  end;

En el destroy del componente:

Código Delphi [-]
 
  //Liberamos el Hook
  if HookKbd <> 0 then UnhookWindowsHookEx(HookKbd);

y la función KbdHook:

Código Delphi [-]
 
function KbdHook(Code: Integer; WParam, LParam: DWORD): HHook;
var
  tmpClase: array[0..30] of Char; //Aqui guardaremos el nombre de la clase 
                                  //del control que tiene el foco
begin
  //Averiguamos el nombre de la clase del control que tiene el foco
  GetClassName(GetFocus, tmpClase, 30);

  //Controlamos que no esté pulsado el ALT o CONTROL
  //Que el foco esté en un control de la clase del Grid ('TMiGrid')
  //Y que se pulse un caracter alfanumérico
  if ((HiWord(GetKeyState(VK_MENU)) = 0) and
     (HiWord(GetKeyState(VK_CONTROL)) = 0) and
     (tmpClase = 'TMiGrid') and
     (Chr(WParam) in ['A'..'Z', '0'..'9', 'Ñ', 'ñ'])) then
  begin
    //No se exactamente por qué, pero cada caracter lo capta dos veces
    if EsSegundaVez then
    begin
      EsSegundaVez := False;
      Result := 1; //Si ponemos 0, sigue ejecutando el siguiente hook (por lo menos el del shortcut del botón)
      Exit;
    end;
    EsSegundaVez := True;
    //Mandamos el mensaje del KeyDown al control que tiene el foco
    //Este ya no lo captura el shortcut del boton
    SendMessage(GetFocus, WM_KEYDOWN, WParam, LParam);
    Result := 1; //Si ponemos 0, sigue ejecutando el siguiente hook (por lo menos el del shortcut del botón)
  end
  else
  begin
    //Llamamos al siguiente Hook, es decir no hacemos nada
    Result := CallNextHookEx(HookKbd, Code, wParam, lParam);
  end;
end;

Y eso es todo, seguramente el código se puede mejorar (por ejemplo solo crear un Hook independientemente de los controles que haya), pero es un primer intento.

Por mi parte nada más, sólo que si tenéis alguna sugerencia, duda o comentario aquí estoy.

Un saludo,

Kiko
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 18:24:38.


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