Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-04-2018
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola, mi código es este:

Código Delphi [-]
for i := 0 to lista3.Items.Count -1 do
begin
    // Calculo CAD1 cada vez que cambia el indice de lista3
  with lista3 do
    begin
        Selected := Items[i];
    fila.Caption:= 'Fila: '+IntToStr(i)+' /'+items.item[i].caption;
    n.Caption:= items.Item[i].SubItems[0] + ' '+ items.Item[i].SubItems[1]+
    ' '+ items.Item[i].SubItems[2] + ' '+ items.Item[i].SubItems[3]+
    ' '+items.Item[i].SubItems[4];

    {Items.Item[i].SubItems[0] +
        ' '+ Items.Item[i].SubItems[1] +' '+ Items.Item[i].SubItems[2]+
        ' '+ Items.Item[i].SubItems[3] +' '+ Items.Item[i].SubItems[4];{+
    ' '+ Items.Item[i].SubItems[5];}
    end;

    // Recorro per
    for j := 0 to per.Items.Count -1 do
    begin
        // Actualizo panel de informacion
        stB.Panels.Items[2].Text:= '[C. '+IntToStr(i+1)+'],'+'[P. '+IntToStr(j+1)+']';
        barra.Max:= lista3.Items.Count;
        barra.Position:= i+1;
        barra2.Max:= per.Items.Count;
        barra2.Position:= j;
        stB.Panels.Items[4].Text:= FormatFloat('0.00',(i * 100) / lista3.items.Count)+'%';

        // Calculo CAD2 cada vez que cambia el indice de per
        cad2 := per.Items.Strings[j];

        // Si lista3 y per son "iguales" agrego un registro a listaResumen2
    // Si alguno de los 5 numeros de lista 3 es distinto a alguno de los
    //numeros de per, YA NO VA A FUNCIONAR.

      if cad2 = n.Caption then
        begin
            with listaResumen2.Items.Add do
            begin
                inc(cinco);
                caption:= lista3.Selected.Caption;
                subitems[0]:= lista3.Items.Item[i].SubItems[0];
                subitems[1]:= lista3.Items.Item[i].SubItems[1];
                subitems[2]:= lista3.Items.Item[i].SubItems[2];
                subitems[3]:= lista3.Items.Item[i].SubItems[3];
                subitems[4]:= lista3.Items.Item[i].SubItems[4];
                subitems[5]:= lista3.Items.Item[i].SubItems[5];
                subitems[5]:= IntToStr(5);
                subitems[6]:= IntToStr(cinco);
            end;
        end;
    end;

Comparo cada item de per (cad2) con la etiqueta "n" ¿no debería funciionar? loo pregunto por que no lo hace.
Voy a probar tu código y te comento. Gracias.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #2  
Antiguo 13-04-2018
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 17
TOPX Va camino a la fama
Cita:
Empezado por danielmj Ver Mensaje
Voy a probar tu código y te comento. Gracias.
¿El código de bucanero ó el código de TOPX?
-
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #3  
Antiguo 13-04-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Thumbs up

Cita:
Empezado por danielmj Ver Mensaje
Comparo cada item de per (cad2) con la etiqueta "n" ¿no debería funciionar? loo pregunto por que no lo hace.
Voy a probar tu código y te comento. Gracias.
El problema que veo en tu código es que las variables que estas comparando son de tipo string, y en cuanto no sean totalmente idénticas ya no te va a devolver ninguna coincidencia.
Tomando el ejemplo mio anterior y aplicado a tu técnica obtendrías:

Código Delphi [-]
  // combinación 1: elementos 1, 5, 6  
  cad1 := '1 5 6';
  // combinación 2: elementos 2, 5, 6 
  n.caption := '2 5 6';

  if cad2 = n.Caption then begin
    //solo ocurrira cuando las dos combinaciones sean identicas
    ... 
  end;

Por eso salvo que sea la misma combinación no obtienes resultados. Debes hacer otro tipo de comparación que no sea de tipo string.

Lo interesante del método que te puse arriba es que al hacer el AND de dos combinaciones representadas con dos integer de tipo INT64, solamente se tarda un único ciclo de CPU para saber si la combinación tiene o no tiene alguna coincidencia, y dado que la mayoría de las veces no vas a tener coincidencias, es un proceso muy rápido.

Y para procesos con tantísimas combinaciones a comparar, cualquier ganancia en calculo se agradece, pues se nota en el tiempo final.
Responder Con Cita
  #4  
Antiguo 13-04-2018
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola TOPX creo que no es lo que busco, o no entendí bien tu propuesta, lo que trato de hacer (básicamente) es comparar cada fila de un listview de 5 elementos con cada item de un listbox que almacena todas las permutaciones (120).

Bucanero, miro tu versión, pero hay cosas que no veo, por ejemplo, declaro tu funcion, pero no la implementación a la hora de comparar las permutaciones con cada subitem del listview. Se me escapa.

Un saludo.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #5  
Antiguo 13-04-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
aplicandolo a tu código deberías de tener algo así:

Código Delphi [-]

function ValorCombinacion(list:TStrings):Int64;
var
  elemento:Byte;
  i: Integer;
begin
  result := 0;
  with list do
    for i := 0 to Count - 1 do begin
      //se obtiene el valor numerico de la lista
      elemento := StrToInt(strings[i])-1;
      //se inserta en el resultado
      result := result or (Int64(1) shl elemento);
    end;
end;

function obtenerComunes(res:int64):string;
var
  i:integer;
begin
  result:='';
  for i :=0 to 49 do
    if ((res and (int64(1) shl i))<>0) then 
      result:=result+IntToStr(i+1)+' ';
end;

...

var
  res, cad1, cad2:Int64;
  comunes:String;

...

for i := 0 to lista3.Items.Count -1 do
begin
    // Calculo CAD1 cada vez que cambia el indice de lista3
  with lista3 do
    begin
        Selected := Items[i];
        cad1:= ValorCombinacion(lista3.items[i].SubItems);
    end;

    // Recorro per
    for j := 0 to per.Items.Count -1 do
    begin
        ....

        // Calculo CAD2 cada vez que cambia el indice de per
        cad2 := ValorCombinacion(per.Items[j].SubItems);

        res:=cad1 and cad2;
        if (cad1 = cad2) then begin
            // las dos combinaciones son iguales
        end
        else if (res <> 0) then begin
           // coinciden algunos elementos y en particular los elementos que coinciden
           // son aquellos cuya posición de bit esta puesta a 1
           //para saber los elementos que son comunes recorres bit a bit la variable RES 
           obtenerComunes(res);
        end
        else begin
          // las dos combinaciones son totalmente distintas
        end;


    end;


Un saludo
Responder Con Cita
  #6  
Antiguo 13-04-2018
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola Bucanero, estoy con tu código pero en
Código Delphi [-]
cad2 := ValorCombinacion(per.Items[j].SubItems);
da error, no reconoce "subitems". <<Per>> es un listBox, quizás sea por eso., así que por ahora no puedo ver que tal funciona.
Un saludo y gracias.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #7  
Antiguo 13-04-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
debes de adaptar el parámetro LIST de la funcion ValorCombinacion para el tipo de componente que estes utilizando en tu caso particular, pensé que eran TLISTVIEW. Si en un TLISTBOX entonces puedes poner:

Código Delphi [-]
cad2 := ValorCombinacion(per.items);
Responder Con Cita
  #8  
Antiguo 13-04-2018
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Hola, no va Bucanero, da error... básicamente que el valor de per, no es un valor entero valido.
Un saludo.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
Respuesta



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
sumando valores de un listview danielmj Varios 28 14-11-2014 21:52:30
VALORES FANTASMAS FIREBIRD 2.1 valores Grandes ASAPLTDA Firebird e Interbase 17 02-12-2012 12:09:02
Rellenar con 0.... buitrago Varios 6 17-11-2011 20:02:53
¿Cómo insertar una imágen en un lisbox o un memo? Acuarius3000 Gráficos 3 27-06-2005 08:44:53
arastrar archivos a un lisbox gulder C++ Builder 3 05-05-2005 13:31:50


La franja horaria es GMT +2. Ahora son las 10:02:35.


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