4

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

4

3 回答 3

16

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

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

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

  2. 获取文件列表。

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

    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. 将图像与项目相关联。

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

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

于 2010-01-07T15:49:55.790 回答
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;
于 2010-01-07T15:43:18.690 回答
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 因此,您可以从两者中获得想法。

于 2010-01-07T15:14:29.997 回答