Problemas ao trocar Tab por Enter

Delphi

24/04/2006

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.


Mrmarcelojr

Mrmarcelojr

Curtidas 0

Respostas

Titanius

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


GOSTEI 0
Mrmarcelojr

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

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


GOSTEI 0
Mrmarcelojr

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

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:
[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

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

[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

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

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
POSTAR