ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Erro função para validar componente vazio?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Mai 10, 2017 11:51 am    Assunto: Erro função para validar componente vazio? Responder com Citação

O que ta errado nesta função que não consigo validar quando os campos estão todos preenchidos? Sempre diz que não estão preenchido.

Código:
function ValidaCamposVazios(Form: TCustomForm; Tag: Integer): Boolean;
var
  i: Integer;
  Foco: Boolean;
begin

  with Form do
  begin
    Result := False;
    Foco := False;

    for i := 0 to ComponentCount - 1 do
    begin
      // EDIT
      if Components[i].ClassType = TEdit then
        if (TEdit(Components[i]).Tag = Tag) and
          (TEdit(Components[i]).Text = EmptyStr) then
        begin
          Result := true;

          if Foco = False then
          Begin
            TEdit(Components[i]).SetFocus;
            Foco := true;
          End;
        end;
      // COMBO
      if Components[i].ClassType = TComboBox then
        if (TComboBox(Components[i]).Tag = Tag) and
          (TComboBox(Components[i]).Text = EmptyStr) then
        begin
          Result := true;

          if Foco = False then
          Begin
            TComboBox(Components[i]).SetFocus;
            Foco := true;
          End;
        end;
    end;
  end;
end;


Modo do uso
Código:
if ValidaCamposVazios(Self, 1) then
      Preenchido := False;


Sempre cai no False da variavel, independente se esta ou não preenchido os campos com tag 1
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qua Mai 10, 2017 12:02 pm    Assunto: Responder com Citação

a função deve retornar true quando o campo está vazio ou preenchido?

pela função atual, está retornando true quando o campo está vazio

outra coisa que você pode fazer é trocar
Citação:
ComponentCount

por
Citação:
Form.ComponentCount
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qua Mai 10, 2017 12:15 pm    Assunto: Responder com Citação

O nome do seu parâmetro Tag está sendo confundido pelo compilador com a propriedade Tag do form na função ValidaCamposVazios.

Faça um teste alterando o nome do parâmetro da função para pTag:

Código:
function ValidaCamposVazios(Form: TCustomForm; pTag: Integer): Boolean;
var
  i: Integer;
  Foco: Boolean;
begin
  with Form do
  begin
    Result := False;
    Foco := False;

    for i := 0 to ComponentCount - 1 do
    begin
      // EDIT
      if Components[i].ClassType = TEdit then
        if (TEdit(Components[i]).Tag = pTag) and
          (TEdit(Components[i]).Text = EmptyStr) then
        begin
          Result := true;

          if Foco = False then
          Begin
            TEdit(Components[i]).SetFocus;
            Foco := true;
          End;
        end;
      // COMBO
      if Components[i].ClassType = TComboBox then
        if (TComboBox(Components[i]).Tag = pTag) and
          (TComboBox(Components[i]).Text = EmptyStr) then
        begin
          Result := true;

          if Foco = False then
          Begin
            TComboBox(Components[i]).SetFocus;
            Foco := true;
          End;
        end;
    end;
  end;
end;

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Mai 10, 2017 2:22 pm    Assunto: Responder com Citação

Blz pessoal, fiz as mudanças, mais agora ta dando erro de focus mesmo preenchendo todos os campos

Cannot focus disable or invisible windows

Minha função esta assim agora
Código:
function ValidaCamposVazios(const Form: TCustomForm; pTag: Integer;
  out Mensagem: String): Boolean;
var
  i: Integer;
  Foco: Boolean;
begin

  with Form do
  begin
    Result := False;
    Foco := False;

    for i := 0 to Pred(ComponentCount) do
    begin
      // EDIT
      if Components[i].ClassType = TEdit then
      begin
        if (TEdit(Components[i]).Tag = pTag) and
          (TEdit(Components[i]).Text = EmptyStr) then
        begin
          Result := true;

          if not Foco then
          begin
            Mensagem := TEdit(Components[i]).Hint;
            TEdit(Components[i]).SetFocus;
            Foco := true;
          end;
        end;
      end;
      // COMBO
      if Components[i].ClassType = TComboBox then
      begin
        if (TComboBox(Components[i]).Tag = pTag) and
          (TComboBox(Components[i]).Text = EmptyStr) then
        begin
          Result := true;

          if not Foco then
          begin
            Mensagem := TComboBox(Components[i]).Hint;
            TComboBox(Components[i]).SetFocus;
            Foco := true;
          end;
        end;
      end;

      if Result then
        Mensagem := String(ShortString(Mensagem));
    end;

  end;
end;

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qua Mai 10, 2017 2:40 pm    Assunto: Responder com Citação

tenta fazer assim
Código:
if (TComboBox(Components[i]).CanFocus) then
TComboBox(Components[i]).SetFocus;


isso tanto para o ComboBox quanto para o Edit
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qua Mai 10, 2017 2:49 pm    Assunto: Responder com Citação

Você está tentando jogar o foco para algum campo que está desabilitado ou invisível.

Acontece também com campos que estão em abas que não estão ativas em PageControl.

Acrescente a validação CanFocus que o leo_cj sugeriu antes de dar o foco ao componente.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Mai 10, 2017 2:51 pm    Assunto: Responder com Citação

leo_cj escreveu:
tenta fazer assim
Código:
if (TComboBox(Components[i]).CanFocus) then
TComboBox(Components[i]).SetFocus;


isso tanto para o ComboBox quanto para o Edit
Valeu amigo. Muito obrigado
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
souzacruz001
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 11 de Junho de 2014
Mensagens: 273

MensagemEnviada: Qua Mai 10, 2017 4:27 pm    Assunto: Responder com Citação

Se me permite uma sugestão, deixe essa função como recursiva, pois poderá haver casos em que há componentes que são parentes dentro do componente que você passou por parâmetro, por exemplo:

Você passar um TForm por parâmetro, mas dentro deste TForm haver um TGroupBox, TPanel, TRadioGroup, etc. Se isso ocorrer, a sua validação será apenas dentros dos componentes que estão dentro do TForm e ele irá descartar os outros.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB