Fórum Problemas ao trocar Tab por Enter #319826
24/04/2006
0
...
Screen.ActiveForm.Perform(WM_NEXTDLGCTL,0,0);
...
Quando eu utlizo as teclas direcionais funciona normal, o problema está justamente com o enter, pois quando dou um ENTER da um sinal de som do windows. Como eu faço para tirar este som.
Mrmarcelojr
Curtir tópico
+ 0Posts
24/04/2006
Titanius
E acrescentando mais um ´problema´, que talvez o amigo acima ainda nao tenha percebido:
Se o foco estiver num ComboBox, por exemplo, ele pula 2 focos.. ou seja, ele poe o foco pra dois componentes depois dele...
Não achei até o momento nenhuma soluão pra nenhuma dos dois problemas.
[]s
Gostei + 0
24/04/2006
Mrmarcelojr
Esse problema eu não encontrei.
Mas quanto ao som, percebi que se o comando estiver no evendo OnKeyPress, ele não ocorre:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key:=0; Perform(WM_NEXTDLGCTL, 0, 0); end; end;
pois o comando [b:4664f5b486]Key:=0;[/b:4664f5b486] elinima o som. Mas tenho que fazer isso no envento OnKeyDown, que ao invés de ascii devo usar os Vk´s:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = VK_RETURN then begin Perform(WM_NEXTDLGCTL, 0, 0); end; end;
E se vc for ver na unit windows (que é onde se encontra esses VK´s), não existe nenhum correspondente ao #0.
É caro colega, estamos lascados....... :lol:
Gostei + 0
24/04/2006
Ricardoif
------------------------------------------
if (Msg.wParam=VK_RETURN) then
begin
if Screen.ActiveControl is TDBGrid then
// se for uma grid
with TDBGrid(Screen.ActiveControl) do
begin
// verifica se está na última coluna
if SelectedIndex=Columns.Count-1 then
begin
// muda de linha e coloca na primeira coluna
SelectedIndex:=0;
Datasource.DataSet.Next;
end
else
// coloca na próxima coluna
SelectedIndex:=SelectedIndex+1;
end
else
// próximo controle
Screen.ActiveForm.Perform(WM_NEXTDLGCTL, 0, 0);
Handled:=True;
end
else if (Msg.wParam=VK_F2) then
showmessage(´hello world´);
------------------------------------------
O handled define se vai ocorrer o sinal sonoro
Gostei + 0
24/04/2006
Mrmarcelojr
"coloque no form principal da sua aplicaçao o componente ApplicationEvents da paleta Additional, e no evento OnMessage coloque o seguinte codigo:..."
Acontece que eu estou criando os componentes Edit, DBEdit, ComboBox e DBCombobox, por isso o código deve pertir diretamente do KeyDown dos componentes.
Gostei + 0
24/04/2006
Mrmarcelojr
Seguinte, no seu formulario principal faça a seguinte procedure:
[color=black][/color] procedure TFormularioPrincipal.ProcessaMsg(Var Msg:TMsg;Var handled:Boolean); begin if Msg.message=WM_KEYDOWN then begin if (Msg.wParam=VK_RETURN) and (not(ActiveControl is TButton)) and (not(ActiveControl is TBitBtn)) and (not(ActiveControl is TCustomMemo)) then Msg.wParam:=VK_TAB; end; end;
E no evento OnCreate do formulario principal coloque
[color=black][/color] Application.OnMessage:=ProcessaMsg;
Na verdade eu gostaria de colocar isto nos componentes, mas por enquando me serve. Por favor, se alguem conseguir fazer isso individualmente para cada componente, por favor, me mandem pelo e-mail marcelo@adminfo.com.br.
Gostei + 0
24/04/2006
Ricardoif
The TMessageEvent type is the type of the OnMessage event. The Msg parameter identifies the Windows message, and the Handled parameter indicates whether the event handler responded to the message. Set Handled to True if the message has been completely handled, to prevent subsequent processing of the message.
Faça testes usando atribuindo true e false a HANDLED
[color=black][/color] procedure TFormularioPrincipal.ProcessaMsg(Var Msg:TMsg;Var handled:Boolean); begin if Msg.message=WM_KEYDOWN then begin if (Msg.wParam=VK_RETURN) and (not(ActiveControl is TButton)) and (not(ActiveControl is TBitBtn)) and (not(ActiveControl is TCustomMemo)) then Msg.wParam:=VK_TAB; end; end;
Gostei + 0
25/04/2006
Mrmarcelojr
Fora o handled desta procedure que eu passei, não encontrei nenhum handled. C vc tem algum exemplo ai, favor me passe, pois já detectei alguns probleminhas em estar utilizando este método. Quando eu abro um messagebox e dou um enter no botão focado, ele passa o foco para o outro botão, eles ficam navegando.
Gostei + 0
10/04/2008
Steve_narancic
keybd_event(VK_TAB, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)