PDA

Ver la Versión Completa : Funcionamiento extraño tecla rapida y tbutton


calogero
12-05-2007, 03:14:35
Hola que tal compañeros !!!

Tengo una preguntita, a ver si saben la respuesta,

resulta que tengo un botón eliminar con la tecla de accesso rapido es decir asi (&Eliminar) se supone que si se presiona alt+E debe activarse este botón y asi lo hace, pero también se activa sin presionar la tecla Alt, resulta que al presionar solamente la tecla E, ya hice pruebas y no tengo codigo que interfiera, solo tengo ese botón y un dbgrid, y creo que son los dbgrid los que me provocan ese funcionamiento, en otros formularios del sistema sucede lo mismo, si alguien sabe la respuesta o algún comentarios de lo que crea que pueda ser bienvenido.

bueno gracias y hasta pronto.

cHackAll
12-05-2007, 22:01:37
Bueno, cuando un boton tiene el foco pues con solo apretar la tecla con "e" estando tu Caption con "&Eliminar" realizará el evento OnClick, te aconsejo revisar el orden de las propiedad de los objetos TabOrder, y tambien TabStop...

Ej. si tienes un TEdit (por ejemplo) que tiene el foco y pulsas "e" no pasará nada, si tienes otro boton y tiene el foco y haces lo mismo no pasara nada.

Suerte

dec
12-05-2007, 22:07:09
Hola,


Bueno, cuando un boton tiene el foco pues con solo apretar la tecla con "e" estando tu Caption con "&Eliminar" realizará el evento OnClic (...)


Por las pruebas que hize sucede incluso si el botón no tiene el foco. Y, por otro lado, independientemente del o los "DBGrid".

cHackAll
12-05-2007, 22:14:07
Estan seguros? tengo dudas! osea:

La ventana solo tiene un DBGrid y un Boton, el boton NO tiene el foco y pulsando la tecla realiza el OnClick???? si??????

dec
12-05-2007, 22:33:03
Hola,

Así parece, salvo que el foco del usuario esté en un control que admita caracteres, es decir, si está en un "TMemo", lógicamente cuando pulses la tecla "e" se escribirá en el "TMemo", pero, si hay dos botones, y uno de ellos tiene como tecla "aceleradora" la "e", y el foco del usuario está en el otro botón (por ejemplo), entonces se ejecuta el evento "OnClick" del botón de marras. :)

cHackAll
13-05-2007, 00:25:14
Ahhh tienes toda la razón!!! pero esta definitivamente relacionado (el problema) con el foco del objeto y la forma en que los botones reaccionan!
Realizado un pequeño análisis es un error de la VCL, pero bueno aca te dejo una forma de solucionar tu problema:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var Index, Pos: Cardinal; WinControl: TWinControl;
begin
Index := ControlCount;
while Index <> 0 do
begin
Dec(Index);
if (Controls[Index] is TButton) then
with Controls[Index] as TButton do
begin
Pos := System.Pos('&', Caption);
if (Pos > 0) and (Pos < Length(Caption)) and
((Key = $20) or (Key = (Byte(Caption[Pos + 1]) and $DF))) and
((ssAlt in Shift) or (ActiveControl.Name = Name)) then
OnMouseDown(nil, mbLeft, [], 0, 0);
end;
end;
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button <> mbLeft then Exit;
Application.MessageBox('Button 1', 'Pseudo OnClick');
end;

procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button <> mbLeft then Exit;
Application.MessageBox('Button 2', 'Pseudo OnClick');
end;

Espero te sirva!

fdelamo
16-05-2007, 10:04:41
Hola,

a mí me pasó lo mismo, creo que es un error de los controles de windows, no de la VCL, ya que hice una prueba con un formulario de Access y también pasaba.

Yo encontré una "solución", mira este post (http://www.clubdelphi.com/foros/showthread.php?t=26627) y eso sí, a ver si entre todos se puede mejorar ... que seguro se puede.

PD: En Win98 el programa daba un error ...

Un saludo
(http://www.clubdelphi.com/foros/showthread.php?t=26627)