在TListView上列出目录上的文件

时间:2010-01-07 15:02:54

标签: delphi file-io lazarus tlistview

我正在构建一个需要Form_Create的程序,填充一个名为TListView的{​​{1}},我要填充的目录是编译程序为+ {{1因为我从未使用FileList我想知道如何做到这一点?

3 个答案:

答案 0 :(得分:15)

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

  1. 确定“编译程序所在的位置”是指什么。

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

  2. 获取文件列表。

    使用FindFirstFindNext制作一个查看所有文件的循环。名称将包括“。”和“..”相对目录名称,因此您可能希望排除它们。请注意,文件不按任何特定顺序枚举。例如,如果您需要按字母顺序排序,则需要自己进行排序。 (他们可能出现在测试中按字母顺序排列,但并非总是如此。)

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

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

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

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

  4. 将图像与项目关联。

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

  5. 根据您希望程序的详细程度,您可能希望使用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 所以你们两个都可以得到这个想法。