Como fazer validação de todos os campos de uma vez
Galera, to tentando fazer um esquema aqui e não consigo.
Bom, quero fazer uma rotina de validação das minhas telas. A idéia é que o usuário vá preenchendo os campos e dando enter ou tab.
Quando o usuario passar por um campo obrigatório e não preenchê-lo, quero que o sistema nao deixe ir pra frente, até ai beleza, mas para tras ele pode ir...por exemplo
Nome: ________________________
Endereco: ________________________
CNPJ: ___________________________ [Obrigatório]
Estado: ________________________
Se o usuario não preencher CNPJ e de enter/tab o sistema diz que não é possivel, mas se ele der um SHIFT-TAB (volta ao campo endereco) ou com o mouse o sistema não diz nada. Ja vi um esquema testando o ActiveControl e o TabOrder, algo como:
Se o TabOrder do ActiveControl for menor que o TabOrder do campo atual (CNPJ por exemplo) ai ele nao da nada...etc...mas não consigo montar a logica porque só consigo saber o taborder do componente atual (CNPJ) do outro não. Tinha que ter algo como
Outra coisa, depois disso pronto queria testar todos os campos no meu botao OK para evitar que o cara pule o campo com o mouse. Neste caso, queria que a função me retornasse qual componente falta ser preenchido e focasse nele. Algo como:
valeu
Bom, quero fazer uma rotina de validação das minhas telas. A idéia é que o usuário vá preenchendo os campos e dando enter ou tab.
Quando o usuario passar por um campo obrigatório e não preenchê-lo, quero que o sistema nao deixe ir pra frente, até ai beleza, mas para tras ele pode ir...por exemplo
Nome: ________________________
Endereco: ________________________
CNPJ: ___________________________ [Obrigatório]
Estado: ________________________
Se o usuario não preencher CNPJ e de enter/tab o sistema diz que não é possivel, mas se ele der um SHIFT-TAB (volta ao campo endereco) ou com o mouse o sistema não diz nada. Ja vi um esquema testando o ActiveControl e o TabOrder, algo como:
Se o TabOrder do ActiveControl for menor que o TabOrder do campo atual (CNPJ por exemplo) ai ele nao da nada...etc...mas não consigo montar a logica porque só consigo saber o taborder do componente atual (CNPJ) do outro não. Tinha que ter algo como
if ActiveControl.TabOrder < CompAtual.TabOrder then exit;
Outra coisa, depois disso pronto queria testar todos os campos no meu botao OK para evitar que o cara pule o campo com o mouse. Neste caso, queria que a função me retornasse qual componente falta ser preenchido e focasse nele. Algo como:
if ValidaObrigatorios then //Grava a informação.
valeu
Adriano Santos
Curtidas 0
Respostas
Rjun
26/08/2005
Eu desenvolvi um componente em C#, mas ainda esta em fase de implementação. Nele crio uma lista com todos os controles do form que devem ser validados e o tipo de validação. Tenho um método que chamo para validar todos os campos. Pode ser um caminho pra você.
GOSTEI 0
Adriano Santos
26/08/2005
Entao [b:bc5af993ff]Rjun[/b:bc5af993ff], na verdade tinha isso onde eu trampava, mas não tinha sido eu o desenvolvedor do componente e como era muito corrido não tive muito tempo de parar e analisar o algoritimo do compoente, por isso tenho apenas +/- em mente como era feito.
Dei uma fuçada aqui e decobri um esquema, veja:
O acontece: Quando vc sai do Edit ou DBEdit enfim, o ActiveControl é mudado para o próximo controle, desta forma consigo saber qual o TabOrder ou qq outra propriedade do componente para onde o usuário foi. Meu problema era pegar o TabOrder do componente que o cara havia sapido, pois perco a referência devido a mudança do ActiveControl.
Como ´ainda´ estou dentro do evento onExit do componente atual, consigo pegar o TabOrder dele através de um simples typecast que fiz: TWinControl(Sender).
Agora estou pensando: precisaria desenvolver um TasEdit, TasDbEdit, TasMasEdit e etc...não sei se vai compensar.
Dei uma fuçada aqui e decobri um esquema, veja:
procedure TForm1.Edit2Exit(Sender: TObject); begin if not (ActiveControl.TabOrder < TWinControl(Sender).TabOrder) then Valida; end;
O acontece: Quando vc sai do Edit ou DBEdit enfim, o ActiveControl é mudado para o próximo controle, desta forma consigo saber qual o TabOrder ou qq outra propriedade do componente para onde o usuário foi. Meu problema era pegar o TabOrder do componente que o cara havia sapido, pois perco a referência devido a mudança do ActiveControl.
Como ´ainda´ estou dentro do evento onExit do componente atual, consigo pegar o TabOrder dele através de um simples typecast que fiz: TWinControl(Sender).
Agora estou pensando: precisaria desenvolver um TasEdit, TasDbEdit, TasMasEdit e etc...não sei se vai compensar.
GOSTEI 0
Rjun
26/08/2005
Mas todos herdam de TControl...você pode desviar o evento...embora eu goste muito do Delphi, em C# é muito mais facil você trabalham com herança de objetos.
GOSTEI 0
Adriano Santos
26/08/2005
Mas ai acho que perco algumas funcionalidades, algumas propriedades, não sei...preciso olhar direito a hierarquia e saber o que é herdado do TControl e do TCustomEdit, TCusmtomMaskEdit etc...
GOSTEI 0
Rjun
26/08/2005
Eu agora não sei se vc me entendeu...eu criei um compoente herdado de Component no C#, acho que no Delphi equivaleria a TComponent. Ele não é um componente visual. Ele tem uma propriedade que chamei de Regras. Regras é uma lista com as regras de validação. Ela tem várias propriedades entre elas uma que se chama ControlToValidate, que é um Control ou TControl, além das regras para validação, como valor máximo, valor mínimo, se o campo é obrigatório, entre outros. E tenho um evento que chamo para validar cada controle dessa lista. Eu ainda estou trabalhando nele e ainda tenho q colocar a validação para quando sair do campo, caso esteja validado para isso.
GOSTEI 0
Adriano Santos
26/08/2005
Eu agora não sei se vc me entendeu...eu criei um compoente herdado de Component no C#, acho que no Delphi equivaleria a TComponent. Ele não é um componente visual. Ele tem uma propriedade que chamei de Regras. Regras é uma lista com as regras de validação. Ela tem várias propriedades entre elas uma que se chama ControlToValidate, que é um Control ou TControl, além das regras para validação, como valor máximo, valor mínimo, se o campo é obrigatório, entre outros. E tenho um evento que chamo para validar cada controle dessa lista. Eu ainda estou trabalhando nele e ainda tenho q colocar a validação para quando sair do campo, caso esteja validado para isso.
Entendi +/- Rjun, vc criou um objeto não-visual que faz esse controle dos seus componentes/controles dentro do form?
A lista de regras eu podia criar uma propriedade TColection e uma TColectionItem. Poderia ter as propriedades:
Regras
Controle
Regras: seria a lista de validações
Controle: qual Edit, DbEdit e etc que precisa ser validado
Gostei da idéia, muito boa.
GOSTEI 0