Las listas de archivos directorio en un TListView
Pregunta
Estoy construyendo un programa que necesita en Form_Create
, rellenar una llamada TListView
FileList
, el directorio que quiero para poblar es donde el programa compilado es + \Files
, como nunca he usado un TListView
Quiero saber cómo hacer esto?
Solución
Hay varias piezas a su pregunta. Voy a ofrecer un vista general aquí. Si necesita ayuda en cualquier paso en particular, por favor enviar una pregunta más específica de seguimiento.
-
Determinar qué "donde el programa compilado es" se refiere a.
Para obtener la ruta completa del archivo EXE, llame
ParamStr(0)
. Para quitar el nombre del archivo EXE de esa cadena, por lo que tiene solo la parte del directorio, llameExtractFilePath
. Asegúrese de que se termina con una barra invertida (IncludeTrailingPathDelimiter
) y luego agregar su "Archivos" directorio. -
Obtener una lista de archivos.
FindFirst
yFindNext
para hacer un bucle que se ve en todos los archivos. Los nombres incluirán el "" y ".." nombres de directorio relativos, por lo que es posible que desee excluirlos. Ten en cuenta que los archivos no se enumeran en un orden particular. Si necesitas ellos ordenados alfabéticamente, por ejemplo, tendrá que hacerlo usted mismo. (Pueden aparecen a estar en orden alfabético en sus pruebas, pero eso no siempre es cierto.)var Rec: TSearchRec; begin if FindFirst(path + '\*', faAnyFile, Rec) = 0 then try repeat if (Rec.Name = '.') or (Rec.Name = '..') then continue; if (Rec.Attr and faVolumeID) = faVolumeID then continue; // nothing useful to do with volume IDs if (Rec.Attr and faHidden) = faHidden then continue; // honor the OS "hidden" setting if (Rec.Attr and faDirectory) = faDirectory then ; // This is a directory. Might want to do something special. DoSomethingWithFile(Rec.Name); until FindNext(Rec) <> 0; finally SysUtils.FindClose(Rec); end; end;
-
Agregar nodos al control para representar los archivos.
Es posible que desee hacer esto en la función
DoSomethingWithFile
hipotética que he mencionado anteriormente. UsarItems
la propiedad de la vista de lista para hacer cosas con los artículos, tales como añadir otras nuevas.var Item: TListItem; begin Item := ListView.Items.Add; Item.Caption := FileName; end;
TListItem
tiene propiedades adicionales; comprobar la documentación para más detalles. ElSubItems
propiedad es útil si usted está mostrando la vista de lista en " informe modo", donde puede haber varias columnas de un solo nodo. -
imágenes asociados con los artículos.
Imágenes Nodos en una vista de lista provienen de las listas de imágenes asociadas,
LargeImages
ySmallImages
. Se refieren a uno o másTImageList
componentes en su formulario. Pon las imágenes de iconos allí, y luego asignar propiedadesImageIndex
los artículos a los números correspondientes.
En función de cómo elaborar desea que su programa sea, puede que desee utilizar el control TShellListView
de Delphi en lugar de hacer todo el trabajo por encima de sí mismo.
Otros consejos
Si se le cae un TImageList en el formulario con dos imágenes en archivos (una a proa y en los directorios), a continuación, asignar el TImageList a la propiedad TListviews LargeImages, puede utilizar el siguiente código.
procedure TForm2.Button1Click(Sender: TObject);
var li:TListItem;
SR: TSearchRec;
begin
FileList.Items.BeginUpdate;
try
FileList.Items.Clear;
FindFirst(ExtractFilePath(Application.ExeName) +'*.*', faAnyFile, SR);
try
repeat
li := FileList.Items.Add;
li.Caption := SR.Name;
if ((SR.Attr and faDirectory) <> 0) then li.ImageIndex := 1
else li.ImageIndex := 0;
until (FindNext(SR) <> 0);
finally
FindClose(SR);
end;
finally
FileList.Items.EndUpdate;
end;
end;
A continuación, puede construir sobre esto añadiendo diferentes imágenes al TImageList para diferentes tipos de archivos, y el uso de ExtractFileExt (SR.Name) para obtener la extensión de los archivos
if ((SR.Attr and faDirectory) <> 0) then li.ImageIndex := 1
else if lowercase(ExtractFileExt(SR.Name)) = '.png' then li.ImageIndex := 2
else if lowercase(ExtractFileExt(SR.Name)) = '.pdf' then li.ImageIndex := 3
else li.ImageIndex := 0;
Tendrá que mostrar las imágenes en la elaboración de las filas.
Esto debe darle una idea: http://www.delphidabbler.com/articles?article=16 http://delphi.about.com/od/delphitips2008/qt/lv_checkbox_bmp. htm
La única diferencia es que vamos a dibujar un icono / imagen. Aquí se aprende cómo hacerlo en una cuadrícula: http://delphi.about.com /library/weekly/aa032205a.htm Por lo tanto se puede obtener la idea.