Ver Mensaje Individual
  #6  
Antiguo 20-02-2023
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 a todos!!

una alternativa puede ser utilizar las clases TArray<inteteger> o Tdictionary<integer, ....> en donde en este caso puede obtener un indice a los capitulos.

Mira si estos códigos te pueden servir:

Código:
/// ----
/// Metodo 1: con la clase TArray
/// ----
function BuscarHuecosCapitulos(Files:TStringDynArray):Tarray<Integer>;
var
  fileName: string;
  Capitulos: TArray<Integer>;
  Capitulo, j:integer;
begin
  result := [];

  /// Genera un array con los numeros de capitulos
  for fileName in Files do
    Capitulos := Capitulos + [GetFileNumCapitulo(fileName)];

  /// los ordena
  TArray.sort<Integer>(Capitulos);

  //y se recorre el array desde el primer capitulo hasta el ultimo capitulo buscando los huecos
  Capitulo := 1;
  j := 0; /// la variable J es la posicion en el array de los capitulos
  repeat
    if Capitulo < Capitulos[j] then
      result := result + [Capitulo]
    else
      inc(j);
    Inc(Capitulo);
  until j > High(Capitulos);
end;
Código:
/// ----
/// Metodo 2: con la clase TDictionary
/// ----
function BuscarHuecosCapitulos(Files:TStringDynArray):Tarray<Integer>;
var
  fileName: string;
  Capitulos: TDictionary<Integer, boolean>; /// el tipo boolean se puede sustituir por cualquier otro tipo, no se va a usar en este caso
  capitulo, UltimoCapitulo: integer;
begin

  result := [];

  Capitulos := TDictionary<Integer, BOOLean>.create;

  // en este caso se debe de obtener también el ultimo capitulo que se ha encontrado
  UltimoCapitulo := 0;
  for fileName in Files do begin
    capitulo := GetFileNumCapitulo(fileName);
    Capitulos.AddOrSetValue(capitulo, True);
    if capitulo > UltimoCapitulo then
      UltimoCapitulo := capitulo;
  end;

  for capitulo := 1 to UltimoCapitulo do
    if not Capitulos.ContainsKey(capitulo) then
      Result := result + [capitulo];

  Capitulos.free;
end;
y la forma de uso

Código Delphi [-]
uses
  IOUtils, system.Generics.collections;

...
procedure BuscarCapitulos;
var
  Dir, fileName: string;
  Files: TStringDynArray;
  i: integer;
  faltan: TArray;
begin
  Dir := 'C:\A\libros\uno\';
  Files := TDirectory.GetFiles(Dir);

  // aqui se obtine un listado con los capitulos que faltarian
  faltan := BuscarHuecosCapitulos(Files);
  for i := 0 to High(faltan) do
    memo1.lines.Add(format('falta el capituno #%d', [faltan[i]]));
end;
Responder Con Cita