Como fazer validação de todos os campos de uma vez

Delphi

26/08/2005

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

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

Adriano Santos

Curtidas 0

Respostas

Rjun

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

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:

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

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

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

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

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
POSTAR