Fórum Verificar campos iguais #376763

01/05/2010

0

Olá amigos, como verificar se os campos e iguais com este meu código abaixo de exemplo, no caso quero ver se em todos os edits de um formulario tem algum repitido, aguardo retorno obrigado desde já.

begin
  for a := 1 to 10 do
    begin
     for b := 1 to 10 do
       begin
         if (TEdit(Formulario.Components[a]).Text) = (TEdit(Formulario.Components[b]).Text) then
            begin
            label1.caption := 'Há campos iguais em ' + a + ' e ' + b;
         end;
     end;
   end;
 end;

Carlos

Carlos

Responder

Posts

01/05/2010

Emerson Nascimento

tente algo como:

var
  a, b: integer;
  compa, compb: TComponent;
  iguais: TStringList;
  s: string;
begin
  iguais := TStringList.Create;
  iguais.Sorted := True;
  s := '';

  for a := 0 to Formulario.ComponentCount-1 do
  begin
    compa := Formulario.Components[a];
    for b := 0 to Formulario.ComponentCount-1 do
    begin
      compb := Formulario.Components[b];

      if (compa is TEdit) and (compb is TEdit) and (compa <> compb)
      and (TEdit(compa).Text = TEdit(compb).Text)
      and ((iguais.IndexOf(compa.Name) < 0) or (iguais.IndexOf(compb.Name) < 0)) then
      begin
        if s <> '' then s := s + '; ';
        s := s + compa.Name + ' e ' + compb.Name;
        iguais.Add(compa.Name);
        iguais.Add(compb.Name);
      end;
    end;
  end;

  if s <> '' then
    label1.caption := 'Há valores iguais em ' + s
  else
    label1.caption := 'Não há valores iguais.';

end
Responder

Gostei + 0

03/05/2010

Wilson Junior

Também pode ser feito assim

var
  x, y: integer;
  ValorIgual: string;
begin
  ValorIgual := '';

  for x := 0 to Formulario.ComponentCount do
  begin
    if  ValorIgual <> '' then
        Break
    ;

    if  Formulario.Components[x] is TEdit then
      begin
        for y := x + 1 to Formulario.ComponentCount - 1 do
        begin
          if  Formulario.Components[y] is TEdit then
            begin
              if  TEdit(Formulario.Components[x]).Text = TEdit(Formulario.Components[y]).Text then
                begin
                  ValorIgual := TEdit(Formulario.Components[x]).Text;
                  Break;
                end
              ;
            end
          ;
        end;
      end
    ;
  end;

  if  ValorIgual = '' then
      label1.caption := 'Não há valores iguais'
  else
      label1.caption := 'Há valores iguais em ' + ValorIgual
  ;
end;


Espero ter colaborado.
Responder

Gostei + 0

06/05/2010

Carlos

Cada edit do formulario está com o nome de edit1 até edit10, está retornando o erro de "List index out of bounds(0)" testei com os dois codigos o mesmo erro.

Oque estou tetanto e verificar se tem campos iguais nos campos contidos em painel com o nome de formulario.

Obrigado pela ajuda, aguardo retorno.
Responder

Gostei + 0

06/05/2010

Wilson Junior

Mas são componentes TEdit?
Em que momento ocorre este erro?

Aguardo retorno.
Responder

Gostei + 0

06/05/2010

Wilson Junior

Substitua a linha do primeiro for do post que lhe passei
  for x := 0 to 
Formulario.ComponentCount - 1 do


Espero ter colaborado.
Responder

Gostei + 0

06/05/2010

Carlos

Mudei a linha e o erro que estava saiu, só que agora mesmo com nomes repetidos nos campos ele não mostra erro que tem nomes repetidos veja a imagem da tela para entendimento.

  http://img708.imageshack.us/img708/6923/janela.jpg

Obrigado aguardo retorno.
Responder

Gostei + 0

06/05/2010

Wilson Junior

Coloque o seu código e informe como você está testando para analisarmos o q está errado.

Aguardo retorno.
Responder

Gostei + 0

06/05/2010

Carlos

Baixe o codigo no link abaixo para verificar, obrogado novamente pela ajuda.

http://uploaddearquivos.com.br/download/Verifica-campos.rar

Aguardo retorno.
Responder

Gostei + 0

06/05/2010

Emerson Nascimento

a rotina funciona (as duas funcionam)!

procedure Tfrm_verificar.Button1Click(Sender: TObject);
var
  a, b: integer;
  compa, compb: TComponent;
  iguais: TStringList;
  s: string;
begin
  iguais := TStringList.Create;
  iguais.Sorted := True;
  s := '';

  for a := 0 to ComponentCount-1 do
  begin
    compa := Components[a];
    for b := 0 to ComponentCount-1 do
    begin
      compb := Components[b];

      if (compa is TEdit) and (compb is TEdit) and (compa <> compb)
      and (TEdit(compa).Text = TEdit(compb).Text)
      and ((iguais.IndexOf(compa.Name) < 0) or (iguais.IndexOf(compb.Name) < 0)) then
      begin
        if s <> '' then s := s + '; ';
        s := s + compa.Name + ' e ' + compb.Name;
        iguais.Add(compa.Name);
        iguais.Add(compb.Name);
      end;
    end;
  end;

  if s <> '' then
    MessageBox(0, PChar('Há valores iguais em ' + s), 'Campos iguais!', 0)
  else
    MessageBox(0, 'Não há valores iguais.', 'Campos iguais!', 0);

end;


você precisa tirar a referência à Formulario.
Formulario é um painel; apesar dos edits estarem dentro do painel, eles pertencem ao formulário Tfrm_verificar, portanto se quiser referenciar algo, referencie o próprio formulário.


Responder

Gostei + 0

06/05/2010

Carlos

Mais se tiver mais edits alem alem dos 10 que quero quero verificar, eles vão ser incluidos ao codigo ele vai verificar também né, teria como evitar isso?
Responder

Gostei + 0

06/05/2010

Carlos

Teria como verificar somente os edits de formulario que é painel ou verificar so os campos que quero, já me responderam a duvida principal do codigo obrigado a todos que me ajudaram resolveu meu problema, se puder me tirar somente está duvida.
Responder

Gostei + 0

06/05/2010

Marco Salles

Teria como verificar somente os edits de formulario que é painel ou verificar so os campos que quero, já me responderam a duvida principal do codigo obrigado a todos que me ajudaram resolveu meu problema, se puder me tirar somente está duvida.
Bem duas soluções entre outras possiveis 1) usar a propriedade tag dos compontes que sofrerão essa comparaçoes.. Assim por exemplo , todo edit que tem tag igual a um sera proecessado pelo método passado..   Claro que no metodo tem um If que verifica o Valor do Tag   Método simples , não implementei so lhe dei o Anzol   2)Prefiro este o primeiro não é Orientado a Objetos   Crie uma classe que tem a função de verificar o campo , porém esta função tem um parametro que sera uma lista de edits.. Aonde vc fara a Varredura...Em fez de ser no formulario ou em um container avarredura sera nesta Lista   ps) se ninguem fornecer outras idéias eu implemento caso vc não consiga esta segunda dica ... 
Responder

Gostei + 0

06/05/2010

Carlos

Seria possivel me passar um exemplo com o codigo acima usando .tag nos edits?
Responder

Gostei + 0

07/05/2010

Marco Salles

Seria possivel me passar um exemplo com o codigo acima usando .tag nos edits?
então é simples. No panel (container dos edits ) altere o tag dos componentes edits que vc que fazer a validação para 1 (um)    os demais edits do container (panel) vc deixa o valor padrão   ps) eu estou uzando1 ( mas pode ser qq integer)   Altere o  codigo para   procedure Tform1.Verifica(controle:TWinControl);
var
  a, b: integer;
  compa, compb: TComponent;
  iguais: TStringList;
  s: string;
begin
  iguais := TStringList.Create;
  iguais.Sorted := True;
   s := '';   for a := 0 to Controle.ControlCount  -1 do
    begin
      if (controle.Controls[a] is TEdit)and(controle.Controls[a].Tag=1) then
         compa := controle.Controls[a];
    for b := 0 to  controle.ControlCount-1 do
    begin
      if (controle.Controls[b] is TEdit)and(controle.Controls[b].Tag=1) then
        begin
          compb := controle.Controls[b];
         if  (compa <> compb)
           and (TEdit(compa).Text = TEdit(compb).Text)
           and ((iguais.IndexOf(compa.Name) < 0) or (iguais.IndexOf(compb.Name) < 0)) then
              begin
               if s <> '' then s := s + '; ';
                   s := s + compa.Name + ' e ' + compb.Name;
               iguais.Add(compa.Name);
               iguais.Add(compb.Name);
              end;
      end;
    end;
  end;   if s <> '' then
    MessageBox(0, PChar('Há valores iguais em ' + s), 'Campos iguais!', 0)
  else
    MessageBox(0, 'Não há valores iguais.', 'Campos iguais!', 0);
end;
para chamar faça   procedure TForm1.Button1Click(Sender: TObject);
begin
Verifica(panel1); // Seu panel ,,, no caso o seu container
end;     ps) eu prefiro mil vezes a classe mas vc tem direito a um so pedido ..rsssssss
Responder

Gostei + 0

07/05/2010

Marco Salles

Fiz Aqui um exemplo rapidinho com classe     TVerificarEdit = class
  class procedure Comparar(Colecao:Array of TEdit);
end;
class procedure TVerificarEdit.Comparar(Colecao: array of TEdit);
var
i,j:integer;
iguais: TStringList;
edta,edtb:TEdit;
s: string;
begin
  iguais := TStringList.Create;
  try
    iguais.Sorted := True;
     s := '';
     for i := 0 to High(Colecao) do
        begin
           edta := Colecao[i];
           for j := 0 to High(Colecao) do
             begin
               edtb:=Colecao[j];
                 if  (edtA <> Edtb)
                    and (EdtA.Text = EdtB.Text)
                    and ((iguais.IndexOf(EdtA.Name) < 0) or (iguais.IndexOf(EdtB.Name) < 0)) then
                         begin
                           if s <> '' then s := s + '; ';
                               s := s + EdtA.Name + ' e ' + EdtB.Name;
                          iguais.Add(EdtA.Name);
                         iguais.Add(EdtB.Name);
                    end;
             end;
          end;
         if s <> '' then
           MessageBox(0, PChar('Há valores iguais em ' + s), 'Campos iguais!', 0)
        else
           MessageBox(0, 'Não há valores iguais.', 'Campos iguais!', 0);
  finally
       iguais.Free;
  end;   para chamar   procedure TForm1.Button1Click(Sender: TObject);
begin
TVerificarEdit.Comparar([edit3,edit4,edit6,edit7]);  // onde esses edits são os que eu quero que sofra comparações
end;     TVerificarEdit = class
  class procedure Comparar(Colecao:Array of TEdit);
end;
Responder

Gostei + 0

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

Aceitar