PDA

Ver la Versión Completa : Ordenar por fecha archivos de TFileListBox


GerTorresM
11-10-2014, 02:02:00
Hola a tod@s


bien hoy me ocupa intentar entregar el contenido de un TFileListBox a un ListBox, estoy lo hago puesto que el TFileListBox es ReadOnly y no me permito organizar los archivos de forma diferente a la alfabética para el caso estoy utilizando código que encontré en la red de esta forma

primera función


function FileDateString( const filename: String ): String;
begin
result :=
FormatDateTime('yyyymmdd hhmmss|',
FileDateToDateTime( FileAge( filename )))
end;


en orden de ideas me va ayudar a obtener los datos de la fecha y hora del archivo

segunda función ahí esta mi gran problema



procedure getListadoArchivo (pListDirectory : TDirectoryListBox; pListBox : TListBox);
var _listadoArchivos : TFileListBox;
_listadoOrdenadoArchivos : TStringList;
_i_local : Integer;
begin
try
_listadoOrdenadoArchivos:= nil;
_listadoArchivos:= nil;
_listadoArchivos:= TFileListBox.Create(TComponent(pListDirectory.Parent));
_listadoArchivos.Visible:= False;
_listadoArchivos.Directory:= pListDirectory.Directory;
for _i_local:= 0 to _listadoArchivos.Count -1 do
begin
_listadoOrdenadoArchivos.add(
FileDateString(pListDirectory.Directory + '\' + _listadoArchivos.items[_i_local]));
_listadoOrdenadoArchivos.Sorted:= True;
end;
pListBox.Items.Assign(_listadoOrdenadoArchivos);
finally
_listadoOrdenadoArchivos.Free;
_listadoArchivos.Free;
end;
end;



bien en orden de ideas deseo recibir un TDirectoryListBox y devolver en forma ordenada por fecha los archivos contenidos en el directorio, pero cuando se ejecuta esta línea de código _listadoArchivos.Directory:= pListDirectory.Directory;, se caen las cosas y me envía el siguiente mensaje Control has no parent windows.

la verdad no tengo ni idea que puede ser el error pues en el creador se esta invocando la ventana donde ejecuto el procedimiento _listadoArchivos:= TFileListBox.Create(TComponent(pListDirectory.Parent)); y el evento donde lo estoy invocando es el change del TDirectoryListBox.

Agradezco de antemano la colaboración



gertorresm
colombia

ecfisa
11-10-2014, 07:19:11
Hola GerTorresM.

...
estoy utilizando código que encontré en la red de esta forma...

Juro que pensé que se trataba de Malbolge :)


...deseo recibir un TDirectoryListBox y devolver en forma ordenada por fecha los archivos contenidos en el directorio...

Según entiendo, queres realizar un procedimiento que recibe como parámetros un TDirectoryListBox A y un TListBox B y que devuelve como valor de respuesta una lista compuesta por fecha + '|' + ruta + nombre, ordenada de forma ascendente por fecha, en el TListBox B.

Entonces, y si no interpreté mal la consigna, creo que se puede hacer de forma mucho mas simple:

procedure SortFilesByAge(DLBox: TDirectoryListBox; LBox: TListBox);
var
sr: TSearchRec;
dir: string;
ageName: string;
begin
LBox.Clear;
dir:= IncludeTrailingPathDelimiter(DLBox.Directory);
if FindFirst(dir+'*.*',faAnyFile, sr) = 0 then
begin
repeat
if (sr.Attr and faArchive) = faArchive then
begin
ageName:= FormatDateTime('yyyymmdd hhmmss|',
FileDateToDateTime(FileAge(dir + sr.Name))) + dir + sr.Name;
LBox.Items.Add(ageName);
end;
until FindNext(SR) <> 0;
FindClose(SR);
end;
LBox.Sorted:= True;
end;


Ejemplo de llamada:

...
begin
SortFilesByAge(DirectoryListBox1, ListBox1);
...


Saludos :)

GerTorresM
14-10-2014, 00:55:06
Ecfisa Muchas gracias de antemano


al correr me envia el siguiente error


until FindNext(SR) <> 0;
FindClose(SR);


en la segunda línea me envía el siguiente error


Incompatible types: 'Cardinal' and 'TSearchRec'

te agradezco tu tiempo y el interes sobre éste tema



gertorresm

ecfisa
14-10-2014, 12:56:38
Hola GerTorresM.

Necesistas usar el procedimiento FindClose de SysUtils. Revisa que en la cláusula uses de tu unidad esté declarado Windows antes de SysUtils, de otro modo tomará la declaración del procedimiento de la unidad Windows:

uses
Windows,..., SysUtils, ...


Otra solución es especificar que usarás el procedimiento declarado en SysUtils de este modo:
SysUtils.FindClose(SR);

Saludos :)

GerTorresM
15-10-2014, 23:36:04
Ecfisa:

Te agradezco mucho tu tiempo y paciencia, la verdad es que era justo lo que necesitaba !!