|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"ListViewにDir内のファイル一覧を表示する"
Title: リストビューにディレクトリ内のファイル一覧を表示する。
指定したディレクトリ内のファイルの一覧をリストビューに表示さ
せます。検索は FindFirst & FindNext を使用、アイコン、ファイル
タイプの情報は SHGetFileInfo を用いています。
でもエクスプローラよりかなり遅いので改良の余地があるはずです。
uses
CommCtrl, ShellAPI;
procedure MakeFileList(ListView: TListView; Directory: String);
var
SearchRec: TSearchRec;
SHFileInfo: TSHFileInfo;
OldDirectory: String;
begin
OldDirectory := GetCurrentDir;
SetCurrentDir(Directory);
ListView.Items.BeginUpdate;
ListView.Items.Clear;
// ファイルの検索を開始する
if FindFirst('*.*', faAnyFile, SearchRec) = 0 then
begin
repeat
//if(SearchRec.Name <> '.')and(SearchRec.Name <> '..')then
with ListView.Items.Add do
begin
Caption := SearchRec.Name;
if (SearchRec.Attr and faDirectory) = 0 then
SubItems.Add(Format('%dkb', [(SearchRec.Size + $3ff) shr 10]))
else
SubItems.Add('');
// 下のブロックをコメントアウトすると5倍くらい速くなる
// ので、SHGetFileInfo の実行速度が足かせのようです。
begin
SHGetFileInfo(SearchRec.FindData.cFileName, 0,
SHFileInfo, SizeOf(SHFileInfo),
SHGFI_SYSICONINDEX or SHGFI_TYPENAME);
SubItems.Add(SHFileInfo.szTypeName);
ImageIndex := SHFileInfo.iIcon;
end;
SubItems.Add(FormatDateTime('yyyy/mm/dd hh:nn',
FileDateToDateTime(SearchRec.Time)));
end;
// 次のファイルを探してリピートする
until FindNext(SearchRec) <> 0;
// 標準サイズのアイコンの指定
ListView_SetImageList(ListView.Handle,
SHGetFileInfo('.', 0, SHFileInfo, SizeOf(SHFileInfo),
SHGFI_LARGEICON or SHGFI_SYSICONINDEX),
LVSIL_NORMAL);
// スモールサイズのアイコンの指定
ListView_SetImageList(ListView.Handle,
SHGetFileInfo('.', 0, SHFileInfo, SizeOf(SHFileInfo),
SHGFI_SMALLICON or SHGFI_SYSICONINDEX),
LVSIL_SMALL);
end;
ListView.Items.EndUpdate;
SetCurrentDir(OldDirectory);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeFileList(ListView1, Edit1.Text);
MessageBeep(0);
ShowMessage('Finished');
end;
C:\windows で試したら、エクスプローラより約3倍くらい遅いです。
調べてみると SHGetFileInfo の実行時間がほとんどです。想像ですが
同関数の最後の引数に SHGFI_PIDL を加えて、パス名でなく ITEMID で
ファイルを指定するとエクスプローラ並みの速度になるかもしれません。
でも私は ITEMID の使い方がわからないんです ;_;)。
私のレベルではここまでです。あとは上級者の方々にお願いします。
1998/01/28、河邦 正(GCC02240@niftyserve.or.jp)
Original document by 河邦 正 氏 ID:(GCC02240)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|