Verificar campos iguais
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;
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
Curtidas 0
Respostas
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
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
01/05/2010
Também pode ser feito assim
Espero ter colaborado.
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
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.
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
01/05/2010
Mas são componentes TEdit?
Em que momento ocorre este erro?
Aguardo retorno.
Em que momento ocorre este erro?
Aguardo retorno.
GOSTEI 0
Wilson Junior
01/05/2010
Substitua a linha do primeiro for do post que lhe passei
Espero ter colaborado.
for x := 0 to Formulario.ComponentCount - 1 do
Espero ter colaborado.
GOSTEI 0
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.
http://img708.imageshack.us/img708/6923/janela.jpg
Obrigado aguardo retorno.
GOSTEI 0
Wilson Junior
01/05/2010
Coloque o seu código e informe como você está testando para analisarmos o q está errado.
Aguardo retorno.
Aguardo retorno.
GOSTEI 0
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.
http://uploaddearquivos.com.br/download/Verifica-campos.rar
Aguardo retorno.
GOSTEI 0
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.
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
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
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
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
01/05/2010
Seria possivel me passar um exemplo com o codigo acima usando .tag nos edits?
GOSTEI 0
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
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;
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
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
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
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;
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