Como cancelar a passagem do foco para outro componente?

Delphi

23/05/2005

Bom dia amigos, fiz funções para validar CNPJ e CPF, em que o usuário digita, pressiona enter e a função elimina os caracteres e devolve o Doc formatado e validado. Como faço para que lá na função, ao verificar o documento errado ele cancele a passagem para o próximo componente.

Uma boa semana a todos

Mario


Aldus

Aldus

Curtidas 0

Respostas

Massuda

Massuda

23/05/2005

Não testei, mas pelo que me lembro você pode chamar a procedure Abort da unit SysUtils no caso da sua validação falhar; isso impedirá a mudança do foco de entrada.


GOSTEI 0
Aldus

Aldus

23/05/2005

Usei assim e nada aconteceu:

   if NumeroInvalido then
      begin
         MessageDlg(NomeRep+´ inválido!´, mtConfirmation,[mbOk],0);
         Result:=Numero;
         Abort;
      end;


O que mais posso tentar?

Mario


GOSTEI 0
Marco Salles

Marco Salles

23/05/2005

Nesta mesma rotina , ao verificar que o documento esta errado , porque que voce não devolve ao component em questão o Foco

Por exemplo:

   if NumeroInvalido then 
      begin 
         MessageDlg(NomeRep+´ inválido!´, mtConfirmation,[mbOk],0); 
         Result:=Numero; 
         FNomeFormulario.NomeComponente.SetFocus;
      end;


Isto não funciona :?: :?: :?:


GOSTEI 0
Aldus

Aldus

23/05/2005

Olá Marco.

A função de validação está em uma unit genérica que utilizarei em todo o sistema, não só no form em questão.


GOSTEI 0
Marco Salles

Marco Salles

23/05/2005

A função de validação está em uma unit genérica que utilizarei em todo o sistema, não só no form em questão.


Não tem problema , Acrescente mais um parametro a esta função

na hora de chamar

NomeFunção(NomeDoEdit,Outros paramentros )

e na função

function NomeDaFunção(Editor : TEdit ; Outros paramentros):Retorno
begin
bla bla...
  if NumeroInvalido then 
      begin 
         MessageDlg(NomeRep+´ inválido!´, mtConfirmation,[mbOk],0); 
         Result:=Numero; 
         Editor.SetFocus; 
      end;
bal bla...
end



GOSTEI 0
Aldus

Aldus

23/05/2005

Marcos, para evitar a passagem de outro parâmetro, tem como descobrir o nome do componente com foco e passar um setfocus.

Pesquisei algo sobre, mas as dicas que encontrei são com o uso de ActiveControl, mas me dá erro que não foi declarado. Será que é porque não estou nos eventos ´onkey´.


GOSTEI 0
Marco Salles

Marco Salles

23/05/2005

tem como descobrir o nome do componente com foco e passar um setfocus.


[b:937cf55573] Jeito Tem[/b:937cf55573] , mas o problema é que este método que voce esta executando é nun evento OnExit , e o Foco ja foi para o OutroCOmponente .. Para contornar este problema sera necessário , muito mais digitação , do que acrescentar um novo parametro na sua função.

Pesquisei algo sobre, mas as dicas que encontrei são com o uso de ActiveControl,



mas me dá erro que não foi declarado. Será que é porque não estou nos eventos ´onkey´.

Não tem nada a ver ...


GOSTEI 0
Aldus

Aldus

23/05/2005

Olá Marco, seguindo novamente instrução, procurei por algo que voltasse ao componente anterior e resolvi com o seguinte código:

   if NumeroInvalido then
      begin
         wRequest(NomeRep+´ inválido!´,1);
         Result:=Numero;
         Screen.ActiveForm.Perform(WM_NEXTDLGCTL,1,0);
      end;


Obrigado pela ajuda

Até


GOSTEI 0
Kotho

Kotho

23/05/2005

Não se esqueça que, com o mouse, eu posso passar de um controle para outro do formulário, sem que esteja em alguma ordem... Vai disparar o OnExit, mas não irá retornar para o controle certo...

Acho que a melhor saida seria passar o controle como parmâmetro mesmo...


GOSTEI 0
Marco Salles

Marco Salles

23/05/2005

Screen.ActiveForm.Perform(WM_NEXTDLGCTL,1,0);


:arrow: :arrow: eu não sabia que isto retornava ao Ultimo controle

Não se esqueça que, com o mouse, eu posso passar de um controle para outro do formulário, sem que esteja em alguma ordem... Vai disparar o OnExit, mas não irá retornar para o controle certo... Acho que a melhor saida seria passar o controle como parmâmetro mesmo...


Afinal esta instrução retorna ou não para o ultimo controle :?: :?: :?:


GOSTEI 0
Aldus

Aldus

23/05/2005

Realmente, coloquei o nome do objeto como parâmetro e agora está OK.

Até


GOSTEI 0
POSTAR