首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列出TListView上目录中的文件

列出TListView上目录中的文件
EN

Stack Overflow用户
提问于 2010-01-07 23:02:54
回答 3查看 10.3K关注 0票数 4

我正在构建一个程序,它需要在Form_Create上填充一个名为FileListTListView,我想填充的目录是编译后的程序所在的目录+ \Files,因为我从未使用过TListView,我想知道怎么做吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-07 23:49:56

你的问题有多个部分。我将在这里提供一个概述。如果您需要任何特定步骤的帮助,请发布更具体的后续问题。

  1. 确定“编译的程序在哪里”指的是什么。

要获取EXE文件的完整路径,请调用ParamStr(0)。要从该字符串中删除可执行文件名,以便只有目录部分,请调用ExtractFilePath。确保它以反斜杠(IncludeTrailingPathDelimiter)结尾,然后追加您的" files“目录。

  • 获取文件列表。

使用FindFirstFindNext创建一个查看所有文件的循环。名称中将包含".“和"..“相对目录名,因此您可能希望排除它们。请注意,这些文件不会以任何特定的顺序枚举。例如,如果您需要按字母顺序对它们进行排序,则需要自己执行此操作。(它们可能在您的测试中按字母顺序排列,但这并不总是正确的。)

var记录: TSearchRec;如果FindFirst(路径+ '\*',faAnyFile,记录)=0,则开始,然后尝试重复if (Rec.Name = '.')或(Rec.Name = '..')然后继续;如果(Rec.Attr和faVolumeID) = faVolumeID,则继续;//与卷ID无关如果(Rec.Attr和faHidden) = faHidden,则继续;//遵守操作系统“隐藏”设置if (Rec.Attr和faDirectory) = faDirectory then;//这是一个目录。可能想做点特别的事。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具有其他属性;有关详细信息,请查看文档。如果您在"report“模式下显示列表视图,则SubItems属性很有用,在这种模式下,单个包含项目的node.

  • Associate图像可以有多个列。

列表视图中节点的图像来自关联的图像列表LargeImagesSmallImages。它们引用表单上的一个或多个TImageList组件。将图标图像放在那里,然后将项目的ImageIndex属性分配给相应的数字。

根据您希望程序的复杂程度,您可能希望使用Delphi的TShellListView控件,而不是自己完成所有上述工作。

票数 16
EN

Stack Overflow用户

发布于 2010-01-07 23:43:19

如果您将一个包含两个图像的TImagelist放在表单上(一个在文件中,另一个在目录中),然后将该TImagelist分配给TListviews LargeImages属性,则可以使用以下代码。

代码语言:javascript
复制
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)获取文件扩展名

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-01-07 23:14:30

您需要在绘制行时显示图像。

这应该会给你一个概念: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,因此您可以从两者中获得想法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2021139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档