Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Eliminar Pulsación tecla Supr

Hola a todos/as. Ya he planteado este asunto y he buscado en los foros pero no consigo solucionarlo. Se trata simplemente de eliminar la pulsación de la tecla Supr, ya que la utilizo en los maestros para eliminar registros. Tengo el siguiente código:
Código:
procedure TIndices.DBCtrlGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  inherited;
  //Pulsacion de Borrar Registro (Suprimir)
  if (Key=VK_DELETE) then
  begin
   //He probado con cualquiera de las tres:
    //1.- Key := 0;
    //2.- Key:=VK_OEM_CLEAR;
    //3.- DBCtrlGrid1.DoKey(gkNull);
    if not (DataSource1.State in [dsInsert,dsEdit]) and not (DataSource1.DataSet.Eof) then
      if (Application.MessageBox('¿Seguro que desea borrar el registro?',
      'Sistema de Gestión de Constructoras',mb_yesno+mb_IconInformation)=idyes) then
        DataSource1.DataSet.Delete;
    Exit;
  end;
Esto funciona bien, pero la tecla Supr continua activa y realiza su función, es decir, suprime.

Por favor, indicarme como conseguir que no surpima tras su captura. Gracias
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #2  
Antiguo 25-03-2004
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
Me parece que el problema está en la llamada a inherited. La haces antes de cualquier cosa y por tanto siempre hace lo que normalmente hace. Llama a inherited únicamente cuando la tecla no sea VK_DELETE.

// Saludos
Responder Con Cita
  #3  
Antiguo 25-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Gracias Roman. Voy a probarlo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #4  
Antiguo 25-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Hola Roman, ya lo he probado y he puesto lo siguiente:
Código:
procedure TIndices.DBCtrlGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  //Pulsacion de Borrar Registro (Suprimir)
  if (Key=VK_DELETE) then
  begin
    Key := 0;
    if not (DataSource1.State in [dsInsert,dsEdit]) and not (DataSource1.DataSet.Eof) then
      if (Application.MessageBox('¿Seguro que desea borrar el registro?',
      'Sistema de Gestión de Constructoras',mb_yesno+mb_IconInformation)=idyes) then
        DataSource1.DataSet.Delete;
    Exit;
  end
  else
    inherited;
  if (Key=VK_RETURN) then //Simulación de Tab (Enter)
  begin
.
.
.
Lo he trazado y no pasa por el inherited, como es lógico, pero continua con el comportamiento normal de la tecla Supr. ¿se te ocurre algo más?. Gracias
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #5  
Antiguo 25-03-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Has puesto KeyPreview a True en el formulario?

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #6  
Antiguo 25-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Sí Marcos, la verdad es que me está volvinedo loco el tema.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #7  
Antiguo 25-03-2004
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
Una pregunta:

Releyendo tu mensaje anterior al respecto hablas de tener programadas muchas teclas en OnKeyDown, entre ellas la tecla Supr. ¿Cómo es esta programación? Lo pregunto porque normalmente para borrar el registro se requiere Ctrl-Supr y no sólo Supr de manera que no sé si en alguna parte, quizá en el formulario ancestro, esté de alguna forma interfiriendo el código.

// Saludos
Responder Con Cita
  #8  
Antiguo 25-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Roman, utilizar solo la tecla Supr fué una imposición. Respecto a la programación en los ancestros, todos los maestros, heredan de un formulario que a parte de otras características estéticas tiene programado el evento OnKeyPress de la siguiente manera:
Código:
procedure TPapiFRM.FormKeyPress(Sender: TObject; var Key: Char);
begin
 begin
 //Pulsacion de ENTER
   if Key = #13 then
   begin
     if not (ActiveControl is TDBGrid) and
        not (ActiveControl is TButton) and
        not (ActiveControl is TdbMemo) and
        not (ActiveControl is TDBCtrlGrid) then
     begin       {si no es un DBGrid}
       Key := #0;{nos comemos la pulsación del enter}
       Perform(WM_NEXTDLGCTL, 0, 0);{movemos al siguiente}
     end
     else
     begin
      if (ActiveControl is TDBGrid) then
      begin
        with TDBGrid(ActiveControl) do
          if selectedindex < (fieldcount -1) then
            selectedindex := selectedindex +1
          else
            selectedindex := 0;
      end;
     end;
   end;
 end;
end;
En cuanto al formulario que contiene al DBCtrlGrid no tiene ninguna programación especial respecto al tratamiento de teclas, solo la heredada del código anterior.

Gracias.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #9  
Antiguo 25-03-2004
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
Volvamos al comienzo:

Cita:
Empezado por javiermorales
Esto funciona bien, pero la tecla Supr continua activa y realiza su función, es decir, suprime.
¿Qué es lo que suprime? Porque según describes la única instrucción Delete explícita está en un condicional y supongo que ya revisaste que no pasa por ahí, y el control DBCtrlGrid no suprime registros tan sólo con oprimir Supr sin Ctrl.

Por otra parte, ¿qué pasa si pones la propiedad AllowDelete del DBCtrlGrid en false?

// Saludos
Responder Con Cita
  #10  
Antiguo 25-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Dentro del DBCtrlGrid existen, entre otros, componentes DBEdit. Si el usuario està posicionado en uno de ellos, cuando se teclea la tecla Supr, a parte del comportamiento programado, aplica la tecla suprimir al texto de ese componente, poniendo el registro en modo edición al verse modificado.

Si se dice "sí" al mensaje de borrado, una vez que ha borrado, afecta al registro anterior (si existe) y si se dice "no" al borrado, afecta al registro actual.

Un saludo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #11  
Antiguo 25-03-2004
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
Pero entonces ¡está claro! ¿no?. Tu estás inhibiendo la tecla para el DbCtrlGrid pero no para el DbEdit.

// Saludos
Responder Con Cita
  #12  
Antiguo 25-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Pero si el DBCtrlGrid es el contenedor del DBEdit y es el que tiene programado el tratamiento de la tecla, ¿no se debería poder eliminar la pulsación de la tecla tras tratarla el DBCtrlGrid, para que no le afecte a ningún componente mas?.

En caso de no poder eliminarse la pulsación, ¿que habría que programar todos los componentes susceptibles de verse modificados por la tecla Supr, para que la ignorasen?. Si es así, será un trabajo muy largo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #13  
Antiguo 25-03-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Si seleccionas todos los controles en los que quieres ese comportamiento a la vez y pulsas en su evento OnKeyDown y los vinculas con el mismo evento del DbCtrlGrid con esta operación lo arreglas todo.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #14  
Antiguo 25-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Gracias Roman y Marcos, lo he probado y funciona, solo ocurre que realiza dos veces el tratamiento de la tecla (una en el DBCtrlGrid y otra en el DBEdit), pero lo solucionaré con una bandera o apuntando a un procedimiento global que ignore la tecla Supr en esos componentes.

De todas maneras, ¿no os resulta curioso que no sea posible decirle al sistema que se olvide de la pulsación de una tecla de forma genérica?.

Gracias de nuevo a ambos. Un saludo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #15  
Antiguo 25-03-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
De forma genérica lo haría para todo el formulario entonces solamente habría que tratar el evento OnKeyDown del formulario no del DbCtrlGrid.


Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #16  
Antiguo 25-03-2004
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
Creo haber encontrado una posible solución:

Como ya sabemos, el código

Código:
procedure TForm1.DBCtrlGrid1KeyDown(...);
begin
  if (Key = VK_DELETE)  then
    begin
      Key := 0;
    end;
end;
no inhibe el evento OnKeyDown de un DBEdit contenido.

Intenta esto:

Código:
procedure TForm1.DBCtrlGrid1KeyDown(...);
begin
  if (Key = VK_DELETE)  then
    begin
      Key := 0;
      abort;
    end;
end;
abort interrumpe cualquier procesamiento posterior. Ya lo probé y sí funciona. No obstante desconozco si pueda generar algún efecto secundario.

// Saludos
Responder Con Cita
  #17  
Antiguo 25-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Otra posible solución, si hacemos lo comentado por Marcos de informar el mismo método OnKeyDown para todos los controles, sería el controlar el parámetro Sender

Código:
  if Sender.ClassType = TDbEdit then
    // control que se quiera hacer con los TDbEdits
Responder Con Cita
  #18  
Antiguo 26-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Gracias a todos, voy a probar ambos métodos y os comentaré.

Por fin y con vuestros consejos, le veo resolución efectiva.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #19  
Antiguo 26-03-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 22
marto Va por buen camino
Wop!


Este método lo acabo de comprobar y funciona. De todas maneras, es una manera más de hacer lo mismo.
Sabemos que podemos programar el onKeyDown/Up del Form y poniendo KeyPreview = true, podemos controlar la pulsación de la tecla en cualquier control. Lo que sucede es que solamente queremos controlar el evento en aquellos controles que estén dentro del CtrlGrid.
Bien, cuando creamos un control dentro de un TDBCrtlGrid, su Parent apunta a una istancia de la clase TDBCtrlPanel, en consecuancia podríamos aplicar la siguiente tecnica:

Código:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
  if (ActiveControl.Parent is TDBCtrlPanel) and (Key = VK_DELETE) then
  begin
	//tomamos las acciones que queramos
	Key := 0;
	Abort;
  end;
end;
__________________
E pur si muove
Responder Con Cita
  #20  
Antiguo 26-03-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Estupendo, funciona perfectamente.

Muchas gracias de nuevo a todos.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
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 05:15:20.


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