Listing file su directory su un TListView
Domanda
Sto costruendo un programma che ha bisogno di su Form_Create
, popolare una TListView
chiamato FileList
, la directory che voglio per popolare è dove il programma compilato è + \Files
, come non ho mai usato un TListView
voglio sapere come fare questo?
Soluzione
Non ci sono più parti per la tua domanda. Fornirò un Panoramica qui. Se hai bisogno di aiuto in qualsiasi fase particolare, si prega di inviare una più specifica domanda di follow-up.
-
Determinare quali "dove il programma compilato è" si riferisce a.
Per ottenere il percorso completo del file EXE, chiamare
ParamStr(0)
. Per rimuovere il nome del file EXE da quella stringa, in modo da avere solo la parte di directory, chiamareExtractFilePath
. Assicurarsi che termina con una barra rovesciata (IncludeTrailingPathDelimiter
) e quindi aggiungere il vostro "File" directory. -
Ottenere un elenco di file.
FindFirst
eFindNext
per fare un ciclo che guarda a tutti i file. I nomi includeranno il "" e ".." i nomi delle directory relative, così si potrebbe desiderare di escluderli. Attenzione che i file non vengono enumerati in un ordine particolare. Se avete bisogno di loro in ordine alfabetico, per esempio, è necessario farlo da soli. (Possono appaiono per essere in ordine alfabetico nei test, ma che non sarà sempre vero.)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;
-
Aggiungi nodi al controllo per rappresentare i file.
Si potrebbe voler fare questo nella funzione ipotetica
DoSomethingWithFile
ho citato sopra. Utilizzare proprietàItems
della visualizzazione elenco per fare le cose con gli oggetti, come ad esempio aggiungerne di nuovi.var Item: TListItem; begin Item := ListView.Items.Add; Item.Caption := FileName; end;
TListItem
ha proprietà aggiuntive; controllare la documentazione per i dettagli. La proprietàSubItems
è utile se si sta mostrando la visualizzazione elenco in " report in modalità", dove non ci può essere più colonne per un singolo nodo. -
immagini associati con gli oggetti.
immagini nodi in una vista elenco provenire dalle liste immagine associati,
LargeImages
eSmallImages
. Essi si riferiscono a uno o piùTImageList
componenti sul modulo. Metti le immagini icona lì, e quindi assegnareImageIndex
proprietà le voci a i numeri corrispondenti.
A seconda di come elaborato si desidera che il programma sia, si potrebbe desiderare di utilizzare il controllo TShellListView
di Delphi invece di fare tutto il lavoro da soli sopra.
Altri suggerimenti
Se si lascia cadere un TImageList sul modulo con due immagini in (file uno a prua e su per le directory), quindi assegnare il TImageList alla proprietà TListviews LargeImages, è possibile utilizzare il codice qui sotto.
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;
È quindi possibile costruire su questo con l'aggiunta di immagini differenti per il TImageList per i diversi tipi di file, e l'utilizzo di ExtractFileExt (SR.Name) per ottenere l'estensione dei file
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;
Avrete bisogno di mostrare le immagini al momento di elaborare le righe.
Questo dovrebbe dare un'idea: http://www.delphidabbler.com/articles?article=16 http://delphi.about.com/od/delphitips2008/qt/lv_checkbox_bmp. htm
L'unica differenza è che si disegna un'icona / immagine. Qui si impara come si fa in una griglia: http://delphi.about.com /library/weekly/aa032205a.htm Quindi, da entrambi è possibile ottenere l'idea.