我正在构建一个需要Form_Create
的程序,填充一个名为TListView
的{{1}},我要填充的目录是编译程序为+ {{1因为我从未使用FileList
我想知道如何做到这一点?
答案 0 :(得分:15)
您的问题有多个部分。我将在此处提供概述。如果您需要任何特定步骤的帮助,请发布更具体的后续问题。
确定“编译程序所在的位置”是指什么。
要获取EXE文件的完整路径,请致电ParamStr(0)
。要从该字符串中删除EXE文件名,因此只有目录部分,请调用ExtractFilePath
。确保以反斜杠(IncludeTrailingPathDelimiter
)结束,然后附加“文件”目录。
获取文件列表。
使用FindFirst
和FindNext
制作一个查看所有文件的循环。名称将包括“。”和“..”相对目录名称,因此您可能希望排除它们。请注意,文件不按任何特定顺序枚举。例如,如果您需要按字母顺序排序,则需要自己进行排序。 (他们可能出现在测试中按字母顺序排列,但并非总是如此。)
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;
向控件添加节点以表示文件。
您可能希望在我上面提到的假设DoSomethingWithFile
函数中执行此操作。使用列表视图的Items
属性来处理项目,例如添加新项目。
var
Item: TListItem;
begin
Item := ListView.Items.Add;
Item.Caption := FileName;
end;
TListItem
有其他属性;查看文档以获取详细信息。如果您在“报告”模式下显示列表视图,则SubItems
属性非常有用,其中单个节点可以有多列。
将图像与项目关联。
列表视图中的节点图像来自关联的图像列表LargeImages
和SmallImages
。它们引用表单上的一个或多个TImageList
组件。将图标图像放在那里,然后将项目“ImageIndex
”属性分配给相应的数字。
根据您希望程序的详细程度,您可能希望使用Delphi的TShellListView
控件,而不是自己完成上述所有工作。
答案 1 :(得分:2)
如果您在表单上放置一个带有两个图像的TImagelist(一个前置文件,另一个用于目录),则将TImagelist分配给TListviews LargeImages属性,您可以使用以下代码。
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;
然后,您可以通过向TImageList添加不同的图像来构建不同的文件类型,并使用ExtractFileExt(SR.Name)来获取文件扩展名
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;
答案 2 :(得分:1)
绘制行时,您需要显示图像。
这应该会给你一个想法: http://www.delphidabbler.com/articles?article=16 http://delphi.about.com/od/delphitips2008/qt/lv_checkbox_bmp.htm
唯一的区别是你会画一个图标/图像。 在这里,您将学习如何在网格中执行此操作:http://delphi.about.com/library/weekly/aa032205a.htm 所以你们两个都可以得到这个想法。