GARANTIR DESCONTO

Fórum Active Control - Erro do Delphi? Como Resolver? #324038

22/06/2006

0

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


Valdirdill

Valdirdill

Responder

Posts

22/06/2006

Adriano Santos

Chama o evento onExit do componente novamente em outro componente. Por exemplo no onClick do Button1 e etc


Responder

Gostei + 0

22/06/2006

Rodc

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);


Responder

Gostei + 0

22/06/2006

Adriano Santos

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.


Responder

Gostei + 0

23/06/2006

Marco Salles

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

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;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar