在TListView上列出目录上的文件

Nat*_*pos 3 delphi file-io tlistview lazarus

我正在构建一个需要打开的程序Form_Create,填充一个TListView被调用FileList的目录,我要填充的目录是编译的程序是+ \Files,因为我从来没用过TListView我想知道如何做到这一点?

Rob*_*edy 15

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

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

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

  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;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将节点添加到控件以表示文件.

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

    var
      Item: TListItem;
    begin
      Item := ListView.Items.Add;
      Item.Caption := FileName;
    end;
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 将图像与项目相关联.

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

根据您希望程序的详细程度,您可能希望使用Delphi的TShellListView控制而不是自己完成上述所有工作.