Verificar campos iguais

Delphi

01/05/2010

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

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

01/05/2010

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
GOSTEI 0
Wilson Junior

Wilson Junior

01/05/2010

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.
GOSTEI 0
Carlos

Carlos

01/05/2010

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.
GOSTEI 0
Wilson Junior

Wilson Junior

01/05/2010

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

Aguardo retorno.
GOSTEI 0
Wilson Junior

Wilson Junior

01/05/2010

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


Espero ter colaborado.
GOSTEI 0
Carlos

Carlos

01/05/2010

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.
GOSTEI 0
Wilson Junior

Wilson Junior

01/05/2010

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

Aguardo retorno.
GOSTEI 0
Carlos

Carlos

01/05/2010

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

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

Aguardo retorno.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/05/2010

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.


GOSTEI 0
Carlos

Carlos

01/05/2010

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?
GOSTEI 0
Carlos

Carlos

01/05/2010

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.
GOSTEI 0
Marco Salles

Marco Salles

01/05/2010

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 ... 
GOSTEI 0
Carlos

Carlos

01/05/2010

Seria possivel me passar um exemplo com o codigo acima usando .tag nos edits?
GOSTEI 0
Marco Salles

Marco Salles

01/05/2010

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
GOSTEI 0
Marco Salles

Marco Salles

01/05/2010

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;
GOSTEI 0
Carlos

Carlos

01/05/2010

Marco obrigado deu certinho. não entendo muito de classe no delphi utilizei o primeiro codigo mais vou estudar para ver como usar classe, obrigado a todos que me responderam.
GOSTEI 0
Marco Salles

Marco Salles

01/05/2010

Marco obrigado deu certinho. não entendo muito de classe no delphi utilizei o primeiro codigo mais vou estudar para ver como usar classe, obrigado a todos que me responderam.
GOSTEI 0
Marco Salles

Marco Salles

01/05/2010

Ate hj não sei como editar a Resposta... Pois ela saiu incompleta no Umtimo Post O que quero dizer é o seguinte como vc pode notar peguei a lógica do Emerson Porém a rotina que lhe foi postada , com certeza o Emerson por descuido esqueceu de Destruir a Variavel iguais: TStringList; e eu qnd vi ja tinha postado , tanto é que no segundo codigo , eu a instanciei dentro do bloco try finally Com isto vc evita Memory Leaks na sua aplicação Veja como colocar procedure Tform1.Verifica(controle:TWinControl);
var
  a, b: integer;
  compa, compb: TComponent;
  iguais: TList; //declare usando a classe base
  s: string;
begin
  iguais := TStringList.Create;   try      //Aqui vai o codigo   finally    iguais.Free;
 
GOSTEI 0
POSTAR