Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-02-2019
donpedro donpedro is offline
Miembro
 
Registrado: nov 2009
Posts: 102
Poder: 0
donpedro cantidad desconocida en este momento
Comparacion y validacion en Delphi

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=1Nc...HvA21lWAj4F3KL

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
Responder Con Cita
  #2  
Antiguo 18-02-2019
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.009
Poder: 20
oscarac Va por buen camino
has probado con concatenar las lineas y luego preguntar?
algo asi

Código Delphi [-]
Cadena110 := Edit1.Text + Edit2.Text + Edit3.Tex  // Cadena de la Columna 1 Linea 10


y luego

Código Delphi [-]
If Cadena435 = Cadena110 Then  Message ('Numeros ya ingresados')
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #3  
Antiguo 18-02-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por donpedro Ver Mensaje
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:


Código Delphi [-]
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 18-02-2019
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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:

Código Delphi [-]
type
  TTerna = array[1..3] of TEdit;

var
  Lineas: array[1..40] of TTerna;

E inicializaría el arreglo en el constructor del formulario:

Código Delphi [-]
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:

Código Delphi [-]
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
Responder Con Cita
  #5  
Antiguo 20-02-2019
donpedro donpedro is offline
Miembro
 
Registrado: nov 2009
Posts: 102
Poder: 0
donpedro cantidad desconocida en este momento
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
Código Delphi [-]
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)

Código Delphi [-]
      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

Código Delphi [-]
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.
Responder Con Cita
  #6  
Antiguo 20-02-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Código Delphi [-]
      
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í:

Código Delphi [-]
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...
Código Delphi [-]
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;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 20-02-2019
Avatar de mamcx
mamcx mamcx is online now
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por donpedro Ver Mensaje
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":

Código:
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?:

Código:
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...
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 20-02-2019
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por mamcx Ver Mensaje
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
Responder Con Cita
  #9  
Antiguo 25-02-2019
donpedro donpedro is offline
Miembro
 
Registrado: nov 2009
Posts: 102
Poder: 0
donpedro cantidad desconocida en este momento
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Código Delphi [-]
      
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í:

Código Delphi [-]
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...
Código Delphi [-]
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:
Código Delphi [-]
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
Responder Con Cita
  #10  
Antiguo 25-02-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por donpedro Ver Mensaje
Use esa logica para limpiar los edit de la siguiente manera:
Código Delphi [-]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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comparacion de Hash MD5 Delphi-Oracle no coincide marvajes Conexión con bases de datos 1 13-11-2015 22:27:59
Ayuda Comparacion. Paco Fernandez Varios 4 28-04-2012 14:55:01
comparación de text lisc_dla Varios 2 02-08-2011 21:04:15
Comparación de Fechas sierraja Varios 5 19-06-2005 07:56:20
Validación en Delphi. Ana Iris Guille Varios 3 30-06-2003 18:25:02


La franja horaria es GMT +2. Ahora son las 17:37:09.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi