在TListView上列出目录中的文件

4

我正在编写一个程序,需要在Form_Create事件中,填充名为FileListTListView控件。我想要填充的目录是编译后程序所在目录下的\Files文件夹。由于我从未使用过TListView控件,因此想知道如何实现这个功能?

3个回答

16

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

  1. 确定“编译后程序所在位置”是什么意思。

    要获取EXE文件的完整路径,请调用ParamStr(0)。为了从该字符串中删除EXE文件名,使你只有目录部分,请调用ExtractFilePath。确保它以反斜杠结尾(使用IncludeTrailingPathDelimiter),然后附加你的“Files”目录。

  2. 获取文件列表。

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

  3. 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;
    
  4. 在控件中添加节点以表示文件。

    你可能希望在上面提到的假设的DoSomethingWithFile函数中执行此操作。使用列表视图的Items属性执行与项目相关的操作,例如添加新项目。

  5. var
      Item: TListItem;
    begin
      Item := ListView.Items.Add;
      Item.Caption := FileName;
    end;
    

    TListItem有其他属性,请查看文档以获取详细信息。如果您在“报表”模式下显示列表视图并且单个节点有多列,则SubItems属性非常有用。

  6. 将图像与项目关联。

    列表视图中节点的图像来自相关联的图像列表,LargeImagesSmallImages。它们指向窗体上一个或多个TImageList组件。将图片放在其中,然后将项目的ImageIndex属性分配给相应的数字。

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


1
Stack Overflow的很好的示例。真正优秀的答案Rob。 - robsoft

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;

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接