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);
faltan := BuscarHuecosCapitulos(Files);
for i := 0 to High(faltan) do
memo1.lines.Add(format('falta el capituno #%d', [faltan[i]]));
end;