我正在构建一个需要 on Form_Create
,填充TListView
被调用的程序FileList
,我想要填充的目录是编译程序的位置 + \Files
,因为我从未使用过TListView
我想知道如何做到这一点?
3 回答
您的问题有多个部分。我将在这里提供一个概述。如果您在任何特定步骤上需要帮助,请发布更具体的后续问题。
确定“编译程序在哪里”指的是什么。
要获取 EXE 文件的完整路径,请调用
ParamStr(0)
. 要从该字符串中删除 EXE 文件名,因此您只有目录部分,请调用ExtractFilePath
. 确保它以反斜杠 (IncludeTrailingPathDelimiter
) 结尾,然后附加您的“文件”目录。获取文件列表。
使用
FindFirst
andFindNext
创建一个查看所有文件的循环。名称将包括“。” 和“..”相对目录名称,因此您可能希望排除它们。请注意,文件未按任何特定顺序枚举。例如,如果您需要按字母顺序对它们进行排序,则需要自己进行。(它们在你的测试中可能看起来是按字母顺序排列的,但这并不总是正确的。)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;
将节点添加到控件以表示文件。
您可能希望在
DoSomethingWithFile
我上面提到的假设函数中执行此操作。使用列表视图的Items
属性来处理项目,例如添加新项目。var Item: TListItem; begin Item := ListView.Items.Add; Item.Caption := FileName; end;
TListItem
具有附加属性;检查文档以获取详细信息。如果您在“报告”模式下显示列表视图,该SubItems
属性很有用,其中单个节点可以有多个列。将图像与项目相关联。
列表视图中节点的图像来自关联的图像列表,
LargeImages
并且SmallImages
. 它们指的是TImageList
表单上的一个或多个组件。将您的图标图像放在那里,然后将项目的ImageIndex
属性分配给相应的数字。
根据您希望程序的精细程度,您可能希望使用 Delphi 的TShellListView
控件,而不是自己完成上述所有工作。
如果您将 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;
绘制行时需要显示图像。
这应该给你一个想法: 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 因此,您可以从两者中获得想法。