Ver Mensaje Individual
  #56  
Antiguo 15-05-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
Hola Danielmj

El error te lo da por la pre-condición establecida donde estas debe tener siempre 5 elementos a la hora de leerla, puedes quitar esa condición, o añadirle otras que tu consideres.

Código Delphi [-]
const
  MaxCount: integer = 5;

  ...
  
function TCombinacionHelper.load(list: array of Byte): boolean;
var
  i: LongInt;
begin
  Result := False;
  clear;
  // if length(list) = MaxCount then begin   //<-- Quita esta linea 
    for i := 0 to High(list) do
      AddNumero(list[i]);
    Result := true;
  // end;    //<-- Quita esta linea
end;


Cita:
Empezado por danielmj Ver Mensaje
...
lo que intento es por ejemplo generar x numero de combinaciones repetidas y metidas en un listview, de ella extraigo los numeros mas repetidos y sobre esa unica combinacion, hago las comparaciones.
Para operar olvídate del listview, (al fin y al cabo mostrar 5000 o 10000 combinaciones la mayoría inutiles no le es interesante al usuario) usalo solamente una vez que tengas los resultados esperados con las combinaciones ya filtradas. Ademas al ser un componente visual no obtendrás la velocidad adecuada. Haz las operaciones sobre array que es mucho mas rápido. aquí tienes un ejemplo:

Código Delphi [-]
var
  i:longint;
  combinacion1, comunes:Tcombinacion;
  cs1: string;
  lista:  array of TCombinacion;
begin
  try
    setLength(lista, 5000);
    //rellenar una lista de 5000 elementos con una combinación aleatoria
    for i:=0 to high(lista) do
      lista[i].aleatorio;

    //cargar la combinación maestra
    if not Combinacion1.load([1, 45, 33, 14, 20, 22]) then begin
      MessageDlg('La combinacion no es valida!!!', mtError, [mbOK], 0);
      exit;
    end;

    // guarda la combinacion1 en un string,
    // esto es solamente por acelerar el proceso a la hora de mostrar la combinacion
    // como string y no repetirlo en cada ciclo del bucle
    cs1 := Combinacion1.AsString;
    //recorre el bucle para analizar todas las combinaciones con la combinacion principal
    for i := 0 to high(lista) do begin
      /// compara una combinacion con otra y obtine los comunes a ambas combinaciones
      comunes := lista[i].comparar(Combinacion1);
      /// si el valor es 0 entonces no hay numeros comunes
      if comunes <> 0 then
        memo1.Lines.Add(cs1 + #9 + lista[i].AsString + #9 + '(' + IntToStr(comunes.count) + ') ' + comunes.AsString);
    end;
  finally
    setLength(lista, 0);
  end;

Un saludo
Responder Con Cita