Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ordenar por fecha archivos de TFileListBox (https://www.clubdelphi.com/foros/showthread.php?t=86842)

GerTorresM 11-10-2014 02:02:00

Ordenar por fecha archivos de TFileListBox
 
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

Código Delphi [-]
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

Código Delphi [-]

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.
Cita:

Empezado por GerTorresM (Mensaje 482916)
...
estoy utilizando código que encontré en la red de esta forma...

Juro que pensé que se trataba de Malbolge :)

Cita:

Empezado por GerTorresM (Mensaje 482916)
...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:
Código Delphi [-]
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:
Código Delphi [-]
...
begin
  SortFilesByAge(DirectoryListBox1, ListBox1);
...

Saludos :)

GerTorresM 14-10-2014 00:55:06

Funciona pero..
 
Ecfisa Muchas gracias de antemano


al correr me envia el siguiente error

Código Delphi [-]
    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:
Código Delphi [-]
 
uses 
   Windows,..., SysUtils, ...

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

Saludos :)

GerTorresM 15-10-2014 23:36:04

Esa fue la mejor respuesta
 
Ecfisa:

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


La franja horaria es GMT +2. Ahora son las 01:29:06.

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