Como saber Qual o controle detem o foco???

Delphi

14/11/2004

Boa Noite

eu tenho um formulário com varios dbedits

Um DbEdits Esta Vinculado a um campo Data De Uma Tabela Paradox

Toda Vez que um usuário digitar uma Data Neste DbEdit ela e testada atraves do Evento OnSetText Do Field

[b:13b6cfd967]O Problema e que em algumas situações o usuário digita uma data errada, ou deixa este campo Vazio e quer cancelar a operação...[/b:13b6cfd967]

Mas , o evento [b:13b6cfd967]onsetText[/b:13b6cfd967] e gerado e acusa o [b:13b6cfd967]erro [/b:13b6cfd967]do campo.. mesmo o Usuário Ter a nitida [b:13b6cfd967]vontade[/b:13b6cfd967] de cancelar o procedimento. E uma situação um pouco [b:13b6cfd967]Desconfortável[/b:13b6cfd967]

:idea: Então tive uma idéia de colocar um [b:13b6cfd967]Teste[/b:13b6cfd967] antes do evento OnSetText :arrow: Fiz o Seguinte
TModulo.Confirmardata(Sender: TField;
  const Text: String);
if BotaoCancelar.Focused Then *********Faço o teste aqui*********
  exit
else
  begin
    try
       Sender.AsDateTime:= StrToDate(Text);procedure begin
       MensagemDeErro := False;
    Except
      on E:EconvertError do
          Begin
            beep;
            MensagemDeErro := True;
            Showmessage(´ERROR : A Data ´+TEXT+´ Não é Uma Data 
                                  Válida . Favor ´Corrigir´);
            Sender.clear;
            Sender.FocusControl;
          end;
    end;
  end;
end;
end;


O Resultado disso e [b:13b6cfd967]Satisfatório[/b:13b6cfd967]. o Problema e o seguinte:
[b:13b6cfd967]Este método de Verificar data e Usado Por muitos campos Do Tipo Data[/b:13b6cfd967]..
E essse campos Estão Espalhados em muitos Formularios.. Em cada um deles eu tenho um [b:13b6cfd967]BotaoCancelar[/b:13b6cfd967].. So que como estão em formulários diferentes tem [b:13b6cfd967]nomes diferentes[/b:13b6cfd967]... Então para o método Acima funcionar, eu deveria preenche-los com Todos Botoes cancelar de todos os forms :cry: :cry: :cry: :cry:

Mais ou menos isto
TModulo.Confirmardata(Sender: TField;
  const Text: String);
if (Form1.BotaoCancelar.Focused)or(Form2.BotaoCancelar.Focused)or
   (Form3.BotaoCancelar.Focused)or(Form4.BotaoCancelar.Focused)or
   .............................................)or(FormN.BotaoCancelar.Focused) Then
  exit
else
  Faca o que tem que fazer etc...


Então eu pensei :idea: Funciona , mas nao ta legau. nao ta de acordo com a [b:13b6cfd967]P.O.O[/b:13b6cfd967]. Pode ser que com a ajuda de um voces eu melhore este código

A minha idéia :idea: e ter um [b:13b6cfd967]controle:TWinControl;[/b:13b6cfd967] visto em todo o projeto... e sempre que o botão cancelar de qualquer formulario receber o foco , este controle o representará..

Por exemplo

 Controle:=ActiveControl;


Assim eu terei que fazer um [b:13b6cfd967]teste unico[/b:13b6cfd967]
TModulo.Confirmardata(Sender: TField;
  const Text: String);
if Controle.focused Then
  exit
else
  Faca o que tem que fazer etc...


Mas o problema esta [b:13b6cfd967]ai[/b:13b6cfd967] :cry: :cry: ..Aonde eu :?: , em que lugar :?: , como posso fazer esta instrução [b:13b6cfd967]Controle:=ActiveControl;[/b:13b6cfd967], acontecer antes que o Evento [b:13b6cfd967]OnSetText [/b:13b6cfd967] seje disparado :cry: :cry:

Sem mais meus agradecimentos.. Qualquer ajuda e de muita valia :P :P :P


Marco Salles

Marco Salles

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

15/11/2004

crie, na seção [b:1856e2c2cf]public[/b:1856e2c2cf] do seu form, uma procedure como esta:
procedure ControlChange(Sender: TObject);

e, no código da procedure, coloque:
procedure TForm.ControlChange(Sender: TObject);
begin
    Controle := ActiveControl;
end;

depois no OnCreate ou OnActivate, faça:
Screen.OnActiveControlChange := ControlChange;

e não esqueça de colocar no OnClose ou OnDeActivate (conforme o caso) o código para ´desligar´ o procedimento:
Screen.OnActiveControlChange := nil;

agora você poderá utilizar a variável Controle para saber em qual componente está o foco.


GOSTEI 1

Mais Respostas

Marco Salles

Marco Salles

14/11/2004

Muito Bom. Mas eo estou encontrando uma dificuldade, E que este evento [b:333de91be5]nao[/b:333de91be5] esta ocorrendo [b:333de91be5]antes[/b:333de91be5] que o evento [b:333de91be5]OnSetText.[/b:333de91be5]
Em termos práticos , isto significa que se o usuário digitar uma data inválida e Clicar no Botao Onde se Permite Cancelar a Operação, o sistema informa que a data esta errada (Devido ao Metodo OnStText), ao invez de puro e simplesmente Cancelar a Operação.
Ora , se o usuário esta querendo cancelar a operação , pouco importa , se a data esta ou nao certa.
E Isto que estou querendo evitar. Mensagem de Eventuais erros quando o Botaocancelar Receber o click do Usuário. :wink: :wink:

Muito obrigado...


GOSTEI 0
Marco Salles

Marco Salles

14/11/2004

No aguardo de Uma Idéia :wink:


GOSTEI 0
Marco Salles

Marco Salles

14/11/2004

Sera que so eu que tenho este tipo de problema :cry: :cry: :cry:


GOSTEI 0
POSTAR