Como saber Qual o controle detem o foco???
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
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
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
Assim eu terei que fazer um [b:13b6cfd967]teste unico[/b:13b6cfd967]
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
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
Curtidas 0
Melhor post
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.
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
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...
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
14/11/2004
No aguardo de Uma Idéia :wink:
GOSTEI 0
Marco Salles
14/11/2004
Sera que so eu que tenho este tipo de problema :cry: :cry: :cry:
GOSTEI 0