PDA

Ver la Versión Completa : Hacer evento Tab en TEdit


JELIRM
03-04-2006, 16:35:16
Hola foro,
Despues de no haber tenido agua que beber del conocimiento del manantial de Gran Club Delphi vengo con Sed!!! je, je

Bueno después de este pequeño parentesis, Como puedo hacer para que cuando presione la tecla Tab estando mi foco en en un TEdit me ejecute una accion en particular..



--Las Caidas te hacen aprender a caminar--

Neftali [Germán.Estévez]
03-04-2006, 16:48:21
Despues de no haber tenido agua que beber del conocimiento del manantial de Gran Club Delphi vengo con Sed!

...qué filosófico.

...como puedo hacer para que cuando presione la tecla Tab estando mi foco en en un TEdit me ejecute una accion en particular.

¿Has probado con los eventos?
Para eso están; En el Keydown puedes poner lo siguiente:


if (key = VK_TAB) then begin
MessageDlg('Quiero hacer algo...', mtInformation, [mbOK], 0);
end;

JELIRM
03-04-2006, 17:21:29
Gracias Neftali por tu pronta respuesta, pero fijate que no me funciona no me da error ni nada simplemente que cuando presiono la tecla Tab no hace nada
hice lo siguiente:
En la pestaña Events de el Object Inspector de mi objeto Edit1 eleji el objeto OnKeyDown dandole doble click y ahi le puse el codigo que tu me dijistes

if (key = VK_TAB) then begin
MessageDlg('Quiero hacer algo...', mtInformation, [mbOK], 0);
end;

Intente ponerle este codigo al Eveno OnKeyPress pero me da error por que la variable Key no es del tipo en que ha sido declarada en el procedimiento.
Aprovechado vuestra cooperacion, tambien me puedes dar una idea de como ponerle una mascara a mi TEdit
Gracias..

vtdeleon
03-04-2006, 17:39:13
Saludos

Chequa este enlace (http://delphi.about.com/cs/adptips2002/a/bltip0702_5.htm)

Sobre la mascara, puedes usar TMaskEdit.;)

Bicho
03-04-2006, 17:48:31
Hola puedes pasarte por aquí (http://www.clubdelphi.com/foros/showthread.php?t=13995) donde nuestro amigo Neftali ya lo arregló y ahora mismo no debía acordarse.


Saludos

JELIRM
03-04-2006, 23:16:29
Gracias Bicho y Vtdeleon por sus respuestas en cuanto al enlace que me puso Bicho no lo he logrado hacer esta un poco confuso,
En cuanto al enlace de Vtdeleon el problema es que con cualquier TEdit dentro de esa form hiciera lo mismo, lo que se me ocurrio es hacer una validacion mas a esa condicion con respecto al foco actual de el Tedit; pero no se como validarlo(el foco)
el codigo original es:
begin
if (ActiveControl is TEdit) and
(Msg.Charcode = VK_TAB) then
begin
ShowMessage('TAB key pressed?') ;
end;
inherited;
end;

lo que yo he intentado pero me da error dice que es un valor boleano pero intento Edit1.Setfocus= True e igual

begin
if (ActiveControl is TEdit) and (Edit1.SetFocus) and
(Msg.Charcode = VK_TAB) then
begin
ShowMessage('TAB key pressed?') ;
end;
inherited;
end;

No se si me explique bien, y gracias por sus respuestas.:o

egostar
03-04-2006, 23:36:44
Usa este evento en el objeto Edit.


procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 9 then begin // La tecla TAB tiene el código ASCII 9
ShowMessage('Tecla TAB presionada!!!');
end;
end;



Saludos

JELIRM
04-04-2006, 00:34:41
GRACIAS,
Fijate que funciona pero solo con un TEdit si pongo dos no me funciona en el primero sino que en el segundo TEdit.

egostar
04-04-2006, 01:45:19
GRACIAS,
Fijate que funciona pero solo con un TEdit si pongo dos no me funciona en el primero sino que en el segundo TEdit.

No habia visto el enlace que puso vtdeleon, ahi esta la respuesta a tu problema, lo que creo es que no supiste como hacerlo.

http://delphi.about.com/cs/adptips2002/a/bltip0702_5.htm

Aqui esta el codigo completo con dos Tedit.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
private
{ Private declarations }
procedure CMDialogKey(Var Msg: TWMKey) ;
message CM_DIALOGKEY;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.CMDialogKey(Var Msg: TWMKEY) ;
begin
if (ActiveControl is TEdit) and
(Msg.Charcode = VK_TAB) then begin
ShowMessage('TAB key pressed?') ;
end;
inherited;
end;

end.


Si quieres usar otros objetos, pues tendras que modificar el codigo a tus necesidades.

Saludos

JELIRM
04-04-2006, 16:00:10
Gracias de nuevo por la cooperacion,
fijate que eso ya lo hice el problema es que la accion es para todos los TEdit que tenga la Form y yo quiero una en particular para cada TEdit asi:
////
Si presiono Tab en TEdit1
que aga algo
fin
Si presiono Tab en Tedit2
que haga otra cosa.
/////

A mi se me ocurria ponerle una condicion y es con respecto al foco del objeto asi:
Si presiono Tab en TEdit y el foco esta en TEdit1
efectua alguna accion
fin.
El problema es que no se como identificar en que foco esta yo he hecho lo siguiente pero me da error.

procedure TForma.CMDialogKey(Var Msg: TWMKEY) ;
begin
if (ActiveControl is TEdit) and (Edit1.SetFocus) and
(Msg.Charcode = VK_TAB) then
begin
ShowMessage('TAB key pressed?') ;
end;
inherited;
end;

De Antemano gracias por vuestra Ayuda

Lepe
04-04-2006, 16:13:56
Otra solución más siguiendo el ejemplo de egostar


procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 9 then begin // La tecla TAB tiene el código ASCII 9
if Tedit(Sender).Name = Edit1.Name then
// pos es el uno
else if Tedit(Sender).Name = Edit2.Name then
// pos eso.
end;
end;


LLegados a este punto, ahora en los demás TEdits, en su evento KeyUp elige el Edit1Keyup, por tanto todos los Tedits compartiran el mismo evento.

Si estas en el edit1, el parámetro Sender será el Edit1, si estas en el Edit32 pues el Sender será el Edit32 ... vamos... el objeto que desencadena el evento.

Saludos

egostar
04-04-2006, 16:53:51
Yo veo otras dos soluciones a este problema.

La primera es utilizar el evento OnKeyUp de cada Edit y usar el código que quieras para cada uno.

La otra es usar el siguiente código.


procedure TForm1.CMDialogKey(Var Msg: TWMKEY) ;
begin
if Msg.CharCode = VK_TAB then begin
if ActiveControl.Name = 'Edit1' then begin
ShowMessage('TAB Presionado en TEdit1');
end;
if ActiveControl.Name = 'Edit2' then begin
ShowMessage('TAB Presionado en TEdit2');
end;
end;
inherited;
end;



Espero ayude y si alguien sabe de otra solución mas elegante será bienvenida.

Saludos

JELIRM
04-04-2006, 17:18:10
Hola,
Gracias Egostar mira que casualidad que algo asi hice para solucionar el problema lo unico que lo hice con el foco, como lo plantee anteriormente que queria saber como capturar en objeto se encontraba mi foco y inventando lo encontre!!!!!!!! el codigo es el siguiente:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;

procedure FormCreate(Sender: TObject);
private
procedure CMDialogKey(Var Msg: TWMKey) ;
message CM_DIALOGKEY;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
procedure TForm1.CMDialogKey(Var Msg: TWMKEY) ;
begin
if (ActiveControl is TEdit) and (Edit1.Focused) and
(Msg.Charcode = VK_TAB) then begin
ShowMessage('La Tecla TAB en Edit 1 esta Presionada?') ;
inherited;
end
else
if (ActiveControl is TEdit) and (Edit2.Focused) and
(Msg.Charcode = VK_TAB) then begin
ShowMessage('La Tecla TAB en Edit 2 esta Presionada?') ;
inherited;
end;

end;

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.

El unico problema que le veo a este forma de resolverlo es que si yo quiero que el comportamiento con la tecla Tab para otros Tedit que yo no quiera que hagan ninguna accion sino que sean normales como un TEdit sin alteracion, no se puede tendria que ponerle oblligatoriamente una accion a cada uno.
Tu mencionabas dos Soluciones mas una que es similar a la que estoy exponiendo aqui y la otra como seria?????, Es de evaluar talvez me convenga mas la otra.

Gracias.. FORO
---Las Caidas te Hacen Aprender a Caminar--

egostar
04-04-2006, 17:37:56
Tu mencionabas dos Soluciones mas una que es similar a la que estoy exponiendo aqui y la otra como seria?????, Es de evaluar talvez me convenga mas la otra.

Bueno, hasta aqui hemos visto el uso de presionar la tecla TAB dentro de la forma, la otra opción que te dije es que a cada TEdit le coloques su propia rutina, es decir:


procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 9 then begin // La tecla TAB tiene el código ASCII 9
ShowMessage('Tecla TAB presionada!!!');
end;
end;

procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 13 then begin // La tecla ENTER tiene el código ASCII 13
ShowMessage('Tecla ENTER presionada!!!');
end;
end;


Saludos

Neftali [Germán.Estévez]
04-04-2006, 17:39:36
JELIRM, creo que con 72 mensajes en el foro ya no eres un novato y deberías utilizar los TAGs de DELPHI cuando añadas código a los mensajes. Que esto lo hagan los nuevos pase, pero los veteranos...

JELIRM
04-04-2006, 23:04:21
gracias por el regañito, pues fijate que nunca lo he hecho pero te prometo que a la proxima lo haré!!!!!

GaaK
19-06-2008, 18:07:37
Hola todos, he retomado este antiguo debate porque no logro entender...

Sea un Form que contiene varios Edits (u otros componentes que puedan enfocarse vía TAB).

La idea: En Edit1 quiero mostrar el código de la tecla presionada, para ello tengo los dos procedures de dicho Edit así:

KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Edit1.Text := 'Scancode: ' + IntToStr(Key) + ' $' + IntToHex(Key,3);
end;

KeyPress(Sender: TObject; var Key: Char);
begin
{ KeyPress isn't called if F1..F12 }
case Key of
{ 48..57, 96..105 }
'0'..'9' : Edit1.Text := Key; //esta línea es para otros propósitos...
end;
end;... mis rutinas funcionan bien y reconocen todas las teclas EXCEPTO la tecla TAB.
Intento reconocerla vía KeyDown (VK_TAB) o en KeyPress(#9) y siempre por siempre se enfoca el siguiente componente (Edit2 por ejemplo).

Lo que quiero: Es que me reconozca la pulsación de TAB y me muestre en Edit1 su código (9) y que termine, así como ocurre al presionar un número por ejemplo.

He intentado lo mencionado arriba (CMDialogKey) y me muestra el mensaje al presionar TAB, pero mi foco sigue moviéndose, quiero que se quede quieto.


Espero sus sabios comentarios :D

Gracias

- Gaak -

GaaK
19-06-2008, 19:06:34
Antes que me regañen, ya conseguí la solución:

private
{ Private declarations }
procedure CMDialogKey(Var Msg: TWMKey); message CM_DIALOGKEY;

{ ... }

procedure TFormProp.CMDialogKey(var Msg: TWMKEY) ;
begin
if (ActiveControl.Name='Edit1') then
case Msg.Charcode of
VK_TAB: { NOP };
end
else inherited; { normal for other keys }
end;
... ahora, al lado de VK_TAB intenté colocarle VK_LWIN o VK_CAPITAL y no funciona para ellos :mad: ... en fin ya conseguí lo que quería, pero si alguien puede explicar como detener (así como TAB) las teclas como CAPS, INICIO u otros, bienvenido sea.

Gracias de todas maneras.

- Gaak -