Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cachar Tabulador (https://www.clubdelphi.com/foros/showthread.php?t=14225)

AGAG4 14-09-2004 03:16:42

Cachar Tabulador
 
Como cachar el Tabulador al momento de presionarlo, en un Edit, bdEdit, MaskEdit y dbGrid????

Ya había lanzado esta pregunta, pero en donde me explicaron tengo que crear un Componente Nuevo por cada uno de los que necesito, aparte cuando lo instalo no me explican como cacharlo, solo me explican donde se cachan al momento de heredar los controles de un Edit y enviar un mensaje, por lo que ya le busque en que propiedad pudiera cacharlo pero no lo encuentro.
Cualquier ayuda se los agradezco mucho.

Neftali [Germán.Estévez] 14-09-2004 10:24:11

Cita:

Empezado por AGAG4
Como cachar el Tabulador al momento de presionarlo, en un Edit, bdEdit, MaskEdit y dbGrid????

Hagamos borrón y cuenta nueva...;)

A ver si ésto te sirve mejor.
En el form donde tienes los controles, define en la parte privada ésto:
Código Delphi [-]
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;

Y en la implementación ésto:

Código Delphi [-]
procedure TForm1.CMDialogKey(var Message: TCMDialogKey);
begin
  // Comprobar estado
  if GetKeyState(VK_MENU) >= 0 then begin
    with Message do begin
      // Segun la tecla
      case CharCode of
        VK_TAB:
          // Hacer lo que quieres
          ....
          MessageDlg('Tecla TAB, Control activo: '+  ActiveControl.Name, mtInformation, [mbOK], 0);
      end; // end..case
    end; // end..with
  end; // end..if
  // Método padre para que salte al siguiente control,...
  inherited;
end;

AGAG4 14-09-2004 16:27:04

oki
 
Voy hacer pruebas Sr. Neftali.. Gracias....!!!!

AGAG4 14-09-2004 18:21:42

oki
 
Sr. Neftali, si me funcionó, pero, como mando llamar un Evento dentro del procedimiento para cachar el TAB????, ó bien llamar sólo el evento ONKEYDOWN al presionar el TAB dentro del mismo Procedimiento.

Neftali [Germán.Estévez] 15-09-2004 09:51:58

La rutina de un evento no deja de ser un procedimiento más, así que puedes llamarlo como cualquier otro (nombre del evento y parámetros).
¿Es eso a lo que te refieres? o tal vez no he entendido la pregunta.

Código Delphi [-]
  // ejemplillos...
  Edit1.EditClick(Self);
  Form1.FormShow(Self);

El ejemplo concreto para llamar al KeyDown sería así:

Código Delphi [-]
var
  _key: Word;
begin
  _key := VK_TAB;
  Self.OnKeyDown(Self, _key, []);

AGAG4 15-09-2004 16:13:50

oki
 
Ya lo probe Sr. Neftali, llamó al evento asi como me comenta arriba, y me marca un error al pasar por esta línea>
Código:

Self.OnKeyDown(Self, _key, []);
El Error:
"Project PFAC.exe raised exception class EAccessViolation with message 'Acess Violation at adress 0000' "

AGAG4 15-09-2004 16:25:29

oki
 
Ya me funciono, lo que paso es que no le puse bien el nombre del OnkeyDown y aparte daba doble salto cuando presionaba el TAB, por lo que le quite esta instrucción > inherited; y me funcionó perfectamente, una última pregunta cual es la función de esa instrucción????

Neftali [Germán.Estévez] 15-09-2004 17:14:59

Cita:

Empezado por AGAG4
...y aparte daba doble salto cuando presionaba el TAB

Es normal, un salto te lo hace el inherited, y otro salto te lo hace el llamar al evento OnKeyDown con el TAB :) .

Cita:

Empezado por AGAG4
...por lo que le quite esta instrucción > inherited; y me funcionó perfectamente

Creo que deberías quitar la otra en lugar de la del inherited.

Cita:

Empezado por AGAG4
una última pregunta cual es la función de esa instrucción????

Para entender la función de ésta instrucción hay que entender primero lo que hemos hecho.
Al redefinir el método CMDialogKey lo que hacemos es decirle a Delphi que ejecute "nuestro código" en lugar del código que tenía programado. Eso es peligroso, porque el componente deja de hacer cosas que tenía programadas. Lo correcto es que podamos decirle que antes o después de lo que el componente tenía programado se ejecute lo nuestro. Para ello utilizamos la instrucción inherited.

Cuando ponemos:
Código Delphi [-]
inherited;
// nuestro código
...

le estamos diciendo que primero haga lo que ya hacía antes y luego haga lo que nosotros queremos. La otra opción es hacerlo en orden contrario o intercalado entre nuestro código:

Código Delphi [-]
// parte de nuestro código
...
inherited;
// sigue nuestro código
...

Es importante que no quitemos el inherited a no ser que estemos seguros de que lo que hacía el componente antes no nos interesa en otro caso no se debe eliminar.

Espero haberme explicado decentemente :)

AGAG4 15-09-2004 19:49:40

Gracias
 
Muchas Gracias Sr. Neftali, le debo otra, me funcionó Perfectamente.


La franja horaria es GMT +2. Ahora son las 09:36:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi