Active Control - Erro do Delphi? Como Resolver?
Seguinte: para que você possa me ajudar, será preciso criar o exemplo com o mesmo código que fiz.
Minha intenção é não deixar o usuário sair de um Tedit sem que tenha digitado alguma coisa, exceto se quiser fechar o form.
Então vamos lá:
- Inicie um novo projeto;
- Coloque dois TEdits (name: edit1 e edit2) no form;
- Coloque o TBitBtn (name: BotVoltar);
- No envento OnClick do BotVoltar, coloque Close;
- TabOrder do Edit1 = 0;
- TabOrder do Edit2 = 1;
- TabOrder do BotVoltar = 2;
- No evento OnExit do Edit1, coloque:
if (trim(Edit1.text) = ´´) and (ActiveControl <> BotVoltar) //se não digitou nada e não clicou no BotVoltar
begin
ShowMessage(´o campo não pode ficar em branco´)
Edit1.setFocus;
end;
Muito bem, agora execute o projeto, deixe o edit1 sem nada e tente sair dele com o tab ou clicando no edit2. Em principio a rotina funciona a contento, ou seja, vc não conseguirá sair do edit1 sem q este tenha algum texto nele ou queira fechar o form (clicando no BotVoltar).
Agora o erro:
Coloque o cursor no edit1, deixe o texto desse edit em branco. Agora só pressione o botão esquerdo do mouse (sem soltar) no BotVoltar. Em seguida, arraste o mouse para uma área qualquer do form onde não tenha nenhum componente e em seguida solte o botão do mouse.
Percebeu? Agora você consegue acessar o edit2 sem ter nenhum texto no edit e sem fechar o form.
Será que tem alguma forma para resolver isso?
Obrigado
Minha intenção é não deixar o usuário sair de um Tedit sem que tenha digitado alguma coisa, exceto se quiser fechar o form.
Então vamos lá:
- Inicie um novo projeto;
- Coloque dois TEdits (name: edit1 e edit2) no form;
- Coloque o TBitBtn (name: BotVoltar);
- No envento OnClick do BotVoltar, coloque Close;
- TabOrder do Edit1 = 0;
- TabOrder do Edit2 = 1;
- TabOrder do BotVoltar = 2;
- No evento OnExit do Edit1, coloque:
if (trim(Edit1.text) = ´´) and (ActiveControl <> BotVoltar) //se não digitou nada e não clicou no BotVoltar
begin
ShowMessage(´o campo não pode ficar em branco´)
Edit1.setFocus;
end;
Muito bem, agora execute o projeto, deixe o edit1 sem nada e tente sair dele com o tab ou clicando no edit2. Em principio a rotina funciona a contento, ou seja, vc não conseguirá sair do edit1 sem q este tenha algum texto nele ou queira fechar o form (clicando no BotVoltar).
Agora o erro:
Coloque o cursor no edit1, deixe o texto desse edit em branco. Agora só pressione o botão esquerdo do mouse (sem soltar) no BotVoltar. Em seguida, arraste o mouse para uma área qualquer do form onde não tenha nenhum componente e em seguida solte o botão do mouse.
Percebeu? Agora você consegue acessar o edit2 sem ter nenhum texto no edit e sem fechar o form.
Será que tem alguma forma para resolver isso?
Obrigado
Valdirdill
Curtidas 0
Respostas
Adriano Santos
22/06/2006
Chama o evento onExit do componente novamente em outro componente. Por exemplo no onClick do Button1 e etc
GOSTEI 0
Rodc
22/06/2006
Talvês seja melhor usar um SpeedButton para fazer o botão de sair. O SpeedButton não recebe foco, daí você pode tirar a verificação (ActiveControl <> BotVoltar);
GOSTEI 0
Adriano Santos
22/06/2006
Talvês seja melhor usar um SpeedButton para fazer o botão de sair. O SpeedButton não recebe foco, daí você pode tirar a verificação (ActiveControl <> BotVoltar);
Pode crer, um SpeedButton sem a propriedade Flat ativa fica igualzinho.
GOSTEI 0
Marco Salles
22/06/2006
Minha opinião é que o erro esta na sua rotina .. Geralmente nesta situaçoes devemos tratar as exceçoes e não as regras
Quias são as exceçoes ??? as exceçoes são os componentes que podem receber o foco mesmo que o edit esteja Vazio
E quais são as regras ... Os componentes que não podem receber o foco , quando o edit estiver vazio
Veja que seu If voce esta tratando as regras
Porque isto e qual a diferença ?? Se voce tiver um form com muitos componentes , voce terar um if com muitos and , para evitar que o foco seje deslocado..
Bem , outro ponto no seu codigo e a instrução ActiveControl <> BotVoltar
No momento da execução do evento OnExit Do Edit o controle ativo ainda não é O BotVoltar... Mesmo que voce click nele.
Não precisa nen fazer o experimento de soltar e arrastar o mouse conforme voce sugeriu.. Basta clicar diretamente no BotVoltar para ver
que o edit perde o foco
E qual a saida ??: Entre outras que aparecer e utilizar a propriedade [b:997a717753]Focused[/b:997a717753] dos controles ...
Mas isto tb não é 100¬ ...Porque existem situações de componentes que [b:997a717753]não recebem o foco [/b:997a717753]e também quando se tem[b:997a717753] tecla de atalho [/b:997a717753]envolvidas..
Para esta ultima situções , voce deve forçar que o componente edit envolvido perca o foco , usando a intrução [b:997a717753]selectNext[/b:997a717753], ou [b:997a717753]atribuindo o foco [/b:997a717753]ao conjunto de instruçoes dos componetes.. Tipo isto
[b:997a717753]BotVolatr.setfocus[/b:997a717753];
Deve-se ainda usar uma [b:997a717753]variavel de controle [/b:997a717753]que impeça que codigos não sejam ser executados nestas situações
[b:997a717753]Colocando em pratica[/b:997a717753]
Quias são as exceçoes ??? as exceçoes são os componentes que podem receber o foco mesmo que o edit esteja Vazio
E quais são as regras ... Os componentes que não podem receber o foco , quando o edit estiver vazio
Veja que seu If voce esta tratando as regras
ActiveControl <> BotVoltar
Porque isto e qual a diferença ?? Se voce tiver um form com muitos componentes , voce terar um if com muitos and , para evitar que o foco seje deslocado..
Bem , outro ponto no seu codigo e a instrução ActiveControl <> BotVoltar
No momento da execução do evento OnExit Do Edit o controle ativo ainda não é O BotVoltar... Mesmo que voce click nele.
Não precisa nen fazer o experimento de soltar e arrastar o mouse conforme voce sugeriu.. Basta clicar diretamente no BotVoltar para ver
que o edit perde o foco
E qual a saida ??: Entre outras que aparecer e utilizar a propriedade [b:997a717753]Focused[/b:997a717753] dos controles ...
Mas isto tb não é 100¬ ...Porque existem situações de componentes que [b:997a717753]não recebem o foco [/b:997a717753]e também quando se tem[b:997a717753] tecla de atalho [/b:997a717753]envolvidas..
Para esta ultima situções , voce deve forçar que o componente edit envolvido perca o foco , usando a intrução [b:997a717753]selectNext[/b:997a717753], ou [b:997a717753]atribuindo o foco [/b:997a717753]ao conjunto de instruçoes dos componetes.. Tipo isto
[b:997a717753]BotVolatr.setfocus[/b:997a717753];
Deve-se ainda usar uma [b:997a717753]variavel de controle [/b:997a717753]que impeça que codigos não sejam ser executados nestas situações
[b:997a717753]Colocando em pratica[/b:997a717753]
Adicione um Botão BotFechar
Var
VariavelDeControle:Boolean;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
//para o caso se teclas de atalho e quando nção ha perda de foco
VariavelDeControle:=True;
//note que estamos tratando as exceçoes.. Pois Fechar pode
if (trim(Edit1.text) = ´´)and(not btFechar.Focused) then
//se não digitou nada e não clicou no BotVoltar
begin
VariavelDeControle:=False;
ShowMessage(´o campo não pode ficar em branco´);
Edit1.setFocus;
end;
procedure TForm1.BotVoltarClick(Sender: TObject);
begin
//Forcar sempre que o foco seje alterado... Componentes que não tem foco Usar a Instrução selectNext
BtVoltar.SetFocus;
//Impedir que se execute o conjunto de instruçoes antes de verificar o Evento OnExit
if VariavelDeControle then
begin
//conjunto de instruçoes
showmessage(´ola´);
end;
end;
procedure TForm1.BotFecharClick(Sender: TObject);
begin
//fechar sera sempre permitido...
close;
end;
GOSTEI 0