Ver la Versión Completa : Comparacion y validacion en Delphi
donpedro
18-02-2019, 17:01:49
Hola, bendiciones para todos.
En la universidad me pusieron hacer un programa donde debo validar y comparar varios edit. Coloco el formulario para que tengan una idea.
https://drive.google.com/open?id=1NcbPVprUXuQOY134iLHvA21lWAj4F3KL
Explicare lo que debe hacer el programa.
Si por ejemplo en la columna 1 fila 10 yo coloco los valores 10 50 70 y en la columna 4 fila 35 coloco esos mismos valores en ese mismo orden me tiene que salir un mensaje que diga que esa combinacion de numeros esta siendo utilizada.
He intentado hacerlo con IF pero seria muchas condiciones. Apelo a ustedes para ver de que otra forma se podria hacer.
Gracias de antemano
oscarac
18-02-2019, 17:34:30
has probado con concatenar las lineas y luego preguntar?
algo asi
Cadena110 := Edit1.Text + Edit2.Text + Edit3.Tex // Cadena de la Columna 1 Linea 10
y luego
If Cadena435 = Cadena110 Then Message ('Numeros ya ingresados')
Neftali [Germán.Estévez]
18-02-2019, 18:06:52
He intentado hacerlo con IF pero seria muchas condiciones. Apelo a ustedes para ver de que otra forma se podria hacer.
Lo primero es poner nombres "adecuados" a los controles TEdit que hay en el formulario.
Lo segundo es, que como biien dices, intentar hacerlo copn IF te dará un número de condiciones muy grande (inviable).
Puedes acceder a un componente utilizando su nombre utilizando algo similar a lo siguiente:
var
edt:tedit;
begin
...
// Acceder a un componente por su nombre
edt := FindComponent('edit1');
// cambiar el contenido de edit1
edt.Text := '111';
Si combinas esto con un bucle FOR y los índices correctos, podrás acceder a todos los Edits.
No se si me he explicado. Si es que no coméntalo y te podemos añadir un ejemplo más explicativo.
roman
18-02-2019, 18:30:47
Cada vez que el usuario termine de llenar (o cambiar) una terna, deberás comparar contra todas las demás para ver si está repetida. Eso de inmediato sugiere un ciclo en donde la terna se compara con cada una de las otras. Esto implica un múltiple recorrido de todos los controles. Para facilitar eso, yo declararía un arreglo de todos los Edits:
type
TTerna = array[1..3] of TEdit;
var
Lineas: array[1..40] of TTerna;
E inicializaría el arreglo en el constructor del formulario:
Lineas[1, 1] := Edit1A;
Lineas[1, 2] := Edit1B;
Lineas[1, 3] := Edit1C;
Lineas[2, 1] := Edit2A;
Lineas[2, 2] := Edit2B;
Lineas[2, 3] := Edit2C;
// etcétera
De esta forma evitas tener que referirte a los controles por su nombre. Esto puede ser costoso porque métodos como FindComponent lo que hacen de por sí es un ciclo por todos los componentes del formulario en busca de uno con el nombre dado. Esto, multiplicado por todas la veces que vas a tener que acceder al control para comparar podría ser un camino muy largo.
Para hacer la comparación, puedes implementar una función de comparación en un ciclo:
function Coincide(Terna1, Terna2: TTerna): Boolean;
Result := (Terna1[1].Text = Terna2[1].Text) and (Terna1[2].Text = Terna2[2].Text) and (Terna1[3].Text = Terna2[3].Text);
end;
function Existe(Terna: TTerna): Boolean;
var
I: Integer;
begin
Result := false;
for I := 1 to 40 do
if Coincide(Terna, Lineas[I]) then
begin
Result := true;
break;
end;
end;
Esto lo escribo al vuelo así que puede estar incorrecto, pero es para dar la idea.
// Saludos
donpedro
20-02-2019, 16:48:37
Hola, bendiciones para todos. Agradezco sus opiniones, las cuales han sido de gran ayuda. Les cuento.
He tomado la idea de Oscarac, pero lo he hecho con arreglos. Ejemplo:
Declare un arreglo
var
Form1: TForm1;
i:integer;
cadenas:array [1..10] of string;
flag:boolean;
implementation
Luego los llene concatenando las lineas (que contienen 3 edit cada linea)
cadenas[1]:=edit1.Text+edit2.Text+edit3.Text;
cadenas[2]:=edit4.Text+edit5.Text+edit6.Text;
cadenas[3]:=edit7.Text+edit8.Text+edit9.Text;
cadenas[4]:=edit10.Text+edit11.Text+edit12.Text;
cadenas[5]:=edit13.Text+edit14.Text+edit15.Text;
cadenas[6]:=edit16.Text+edit17.Text+edit18.Text;
cadenas[7]:=edit19.Text+edit20.Text+edit21.Text;
cadenas[8]:=edit22.Text+edit23.Text+edit24.Text;
cadenas[9]:=edit25.Text+edit26.Text+edit27.Text;
cadenas[10]:=edit28.Text+edit29.Text+edit30.Text;
y con un FOR recorro los arreglos haciendo la comparacion
if (key=#13) then
begin
for i := 1 to 10 do
if c1f4=cadenas[i] then
begin
if messagedlg('Orden Numerico Utilizado',mterror,[mbok],0)=mrok then
break;
end;
end;
Esta solucionado, gracias a ustedes.
Pero me gustaria agregarle algo, y es que cuando encuentre una similitud, me gustaria saber en que columna y fila ya se habia introducido la combinacion de numero, ya sea, resaltando en color los edits que contienen los numeros.
Neftali [Germán.Estévez]
20-02-2019, 17:48:16
cadenas[1]:=edit1.Text+edit2.Text+edit3.Text;
cadenas[2]:=edit4.Text+edit5.Text+edit6.Text;
cadenas[3]:=edit7.Text+edit8.Text+edit9.Text;
cadenas[4]:=edit10.Text+edit11.Text+edit12.Text;
cadenas[5]:=edit13.Text+edit14.Text+edit15.Text;
cadenas[6]:=edit16.Text+edit17.Text+edit18.Text;
cadenas[7]:=edit19.Text+edit20.Text+edit21.Text;
cadenas[8]:=edit22.Text+edit23.Text+edit24.Text;
cadenas[9]:=edit25.Text+edit26.Text+edit27.Text;
cadenas[10]:=edit28.Text+edit29.Text+edit30.Text;
Para evitar esto, es justo para o que sirve el FindComponent.
Te lo pongo de memoria, pero la idea sería algo así:
for i:=0 to 9 do begin
// cadenas[1] ... Edit1 .... Edit2 ... Edit3
cadenas[i+1] := TEdit(FindComponent('edit' + IntToStr(3*i+1)).Text) +
TEdit(FindComponent('edit' + IntToStr(3*i+2)).Text) +
TEdit(FindComponent('edit' + IntToStr(3*i+3)).Text);
end;
Y abreviando un poco más...
for i:=0 to 9 do begin
Str := '';
for j:=1 to 3 do begin
// Esta línea concatena los 3 edits
Str := Str + TEdit(FindComponent('edit' + IntToStr(3*i+j)).Text);
end;
cadenas[i+1] :=Str;
end;
mamcx
20-02-2019, 18:02:14
Si por ejemplo en la columna 1 fila 10 yo coloco los valores 10 50 70 y en la columna 4 fila 35 coloco esos mismos valores en ese mismo orden me tiene que salir un mensaje que diga que esa combinacion de numeros esta siendo utilizada.
Ya que estas en la universidad, supuestamente te han ensañado la importancia de las estructuras de datos y los algoritmos. En resumen:
- Ordena, organiza y busca
- Usa la estructura de datos correcta que facilite lo de arriba
Si estuvieras haciendo esto con SQL la respuesta seria muy obvia. Pon todo en una "tabla":
Col Row Values
1 1 10 50 70
4 35 10 50 70
Ahora que tienes los datos visualizados apropiadamente, que hacer con ellos se hace mas claro, verdad?
E incluso, te hace pensar: Podria hacerlo mejor? Siguiendo con la idea de inspirarse con bases de datos, como se hace una búsqueda en una BD? Con un indice. Como podrías "indexar" estos datos?:
Key Position
10 50 70 [1 1,4 35]
De ahi, que estructuras de datos son las mas adecuadas para cada caso? Eso te lo dejo de tarea...
roman
20-02-2019, 18:18:30
Ahora que tienes los datos visualizados apropiadamente, que hacer con ellos se hace mas claro, verdad?
Concuerdo, Mario. El problema es que como sucede muchas veces con Delphi, no hay ni siquiera un intento por separar la lógica de la interfaz.
// Saludos
donpedro
25-02-2019, 16:27:39
;530782']
cadenas[1]:=edit1.Text+edit2.Text+edit3.Text;
cadenas[2]:=edit4.Text+edit5.Text+edit6.Text;
cadenas[3]:=edit7.Text+edit8.Text+edit9.Text;
cadenas[4]:=edit10.Text+edit11.Text+edit12.Text;
cadenas[5]:=edit13.Text+edit14.Text+edit15.Text;
cadenas[6]:=edit16.Text+edit17.Text+edit18.Text;
cadenas[7]:=edit19.Text+edit20.Text+edit21.Text;
cadenas[8]:=edit22.Text+edit23.Text+edit24.Text;
cadenas[9]:=edit25.Text+edit26.Text+edit27.Text;
cadenas[10]:=edit28.Text+edit29.Text+edit30.Text;
Para evitar esto, es justo para o que sirve el FindComponent.
Te lo pongo de memoria, pero la idea sería algo así:
for i:=0 to 9 do begin
// cadenas[1] ... Edit1 .... Edit2 ... Edit3
cadenas[i+1] := TEdit(FindComponent('edit' + IntToStr(3*i+1)).Text) +
TEdit(FindComponent('edit' + IntToStr(3*i+2)).Text) +
TEdit(FindComponent('edit' + IntToStr(3*i+3)).Text);
end;
Y abreviando un poco más...
for i:=0 to 9 do begin
Str := '';
for j:=1 to 3 do begin
// Esta línea concatena los 3 edits
Str := Str + TEdit(FindComponent('edit' + IntToStr(3*i+j)).Text);
end;
cadenas[i+1] :=Str;
end;
Use esa logica para limpiar los edit de la siguiente manera:
for i := 1 to 120 do
if TEdit(self.FindComponent('edit' + inttostr(i)))<> nil then
TEdit(self.FindComponent('edit' + inttostr(i))).Clear;
Pero no he logrado hacerlo para concatenar las cadenas
Neftali [Germán.Estévez]
25-02-2019, 16:30:19
Use esa logica para limpiar los edit de la siguiente manera:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)for i := 1 to 120 do if TEdit(self.FindComponent('edit' + inttostr(i)))<> nil then TEdit(self.FindComponent('edit' + inttostr(i))).Clear;
Pero no he logrado hacerlo para concatenar las cadenas
Pues al final se trata de conseguir el nombre del componente correcto, utilizando FindComponent, tal y como has hecho aquí.
El resto de código sea para limpiar, concatenar, o lo que sea es independiente.
^\||/^\||/^\||/
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.