Problemas ao trocar Tab por Enter
Estou utilizando o seguinte comando:
...
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.
...
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
Curtidas 0
Respostas
Titanius
24/04/2006
Também estou a procura disso... :D
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
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
Mrmarcelojr
24/04/2006
Se o foco estiver num ComboBox, por exemplo, ele pula 2 focos.. ou seja, ele poe o foco pra dois componentes depois dele...
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
Ricardoif
24/04/2006
coloque no form principal da sua aplicaçao o componente ApplicationEvents da paleta Additional, e no evento OnMessage coloque o seguinte codigo:
------------------------------------------
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
------------------------------------------
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
Mrmarcelojr
24/04/2006
"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
Mrmarcelojr
24/04/2006
Bem, garimpando pela net encontrei um exemplo que me serviu. Não é bem o que eu queria, mas fiz algumas modificações e deu pra querbrar o galho.
Seguinte, no seu formulario principal faça a seguinte procedure:
E no evento OnCreate do formulario principal coloque
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.
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
Ricardoif
24/04/2006
TApplication.OnMessage
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
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
Mrmarcelojr
24/04/2006
´Faça testes usando atribuindo true e false a HANDLED´
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
Steve_narancic
24/04/2006
O problema de 2 focos eu resolvi substituindo o perform por
keybd_event(VK_TAB, 0, KEYEVENTF_EXTENDEDKEY or 0, 0);
GOSTEI 0