PDA

Ver la Versión Completa : Cómo filtrar por tipos de archivo en un componente ShellTreeView


MaMu
14-08-2006, 05:07:24
Hola, tengo un ShellTreeView y un ShellListView perfectamente sincronizados, pero quiciera saber, como puedo hacer para que simplemente el ShellListView muestre los archivos que yo quiera, por ejemplo solo los *.txt y no todo el conjunto que manda el ShellTreeView. Ni en el ShellComboBox encuentro opciones para filtrar como es el caso cuando usamos FilterComboBox de un DriveComboBox.

Gracias

dec
14-08-2006, 05:34:20
Hola,

No estoy seguro, pero, creo que tienes que utilizar el evento "AddFolder" del componente "ShellListView", o, cuando menos, algo más o menos como lo que sigue parece funcionar bien:


const
// Se me ocurre algo así para permitir varios "tipos" de archivo
filtroArchivos = '.txt .dat';
// filtroArchivos = '.txt'; // Sólo archivos de texto

procedure TForm1.ShellListView1AddFolder(Sender: TObject;
AFolder: TShellFolder; var CanAdd: Boolean);
begin
if not AFolder.IsFolder then // Si no es un directorio...
CanAdd := (Pos(ExtractFileExt(AFolder.PathName), filtroArchivos) <> 0);
end;

MaMu
14-08-2006, 05:41:39
Hola,

No estoy seguro, pero, creo que tienes que utilizar el evento "AddFolder" del componente "ShellListView", o, cuando menos, algo más o menos como lo que sigue parece funcionar bien:


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
const
// Se me ocurre algo así para permitir varios "tipos" de archivo
filtroArchivos = '.txt .dat';
// filtroArchivos = '.txt'; // Sólo archivos de texto

procedure TForm1.ShellListView1AddFolder(Sender: TObject;
AFolder: TShellFolder; var CanAdd: Boolean);
begin
if not AFolder.IsFolder then // Si no es un directorio...
CanAdd := (Pos(ExtractFileExt(AFolder.PathName), filtroArchivos) <> 0);
end;





Gracias por tu respuesta, yo habia probado algo similar, agregando solo archivos y distinguiendo las carpetas, pero tanto en mi forma como la tuya se me cuelan los *.ZIP.

Saludos.

dec
14-08-2006, 06:19:19
Hola,

Pues es verdad que se cuelan los archivos Zip y me temo que no serán los únicos... luego de varias pruebas parece ser que se toman los archivos ZIP (y acaso otro tipo de archivos comprimidos) como "directorios", y, puesto que, en cierto modo así son.

Lo cierto es que tanto "AFolder.IsFolder" retorna "true" con un archivo Zip y la función "FileGetAttribute" ídem de ídem. No sé me ocurre ahora mismo ninguna forma de conseguirlo, pero, tiene que haberla, apostaría algo.

En este artículo en Torry's (http://www.swissdelphicenter.ch/torry/showcode.php?id=1259) se trata el tema, pero, no lo he probado y, me parece, que también de ese modo se colarían los archivos Zip...

Después de algunas vueltas... he probado a utilizar la función de Windows "GetFileAttributes", y, de esta forma parece que no se cuelan archivos Zip (ignoro si se colará algún otro tipo de archivo... no deseado...), esto es, dicha función no parece tomar los archivos Zip como directorios, como ocurría con la "FileGetAttribute" y "AFolder.IsFolder".


const
// filtroArchivos = '.txt'; // Sólo archivos de texto
// Se me ocurre algo así para permitir varios "tipos" de archivo
filtroArchivos = '.txt .dat';

procedure TForm1.ShellListView1AddFolder(Sender: TObject;
AFolder: TShellFolder; var CanAdd: Boolean);
begin
// Así parece que no se cuelan los archivos Zip (no sé el resto de "comprimidos")
CanAdd := ((GetFileAttributes(PChar(AFolder.PathName)) and FILE_ATTRIBUTE_DIRECTORY) <> 0)
or (Pos(AnsiLowerCase(ExtractFileExt(AFolder.PathName)), AnsiLowerCase(filtroArchivos)) <> 0);
end;


PD. Los archivos en formato ".rar" tampoco se cuelan... ignoro si lo hacían "antes". ;)