ファイルとサブフォルダーのフォルダーをスキャンし、その結果をVirtualStringTreeに追加しようとしています..ツリービューの各ノードにアイコンを追加する場合を除いて、これはうまく機能します(アイコンはシステムシェルアイコンからのものです) .
奇妙な問題が発生し、アイコンが特定のノードでのみ表示されます。ほとんどの場合、表示されるアイコンは 1 つだけです (下の画像を参照)。
私が使用するコードは次のとおりです。
ツリー ノード データ宣言:
nodeData=record
Text:String;
ImageIndex:integer;
end;
PNodeData=^nodeData;
ファイル/フォルダーをスキャンするコードは次のとおりです
procedure scanDir(const Dir:string);
var SR: TSearchRec;
begin
addNewNode(Dir);
if(FindFirst(IncludeTrailingBackslash(Dir) + '*.*', faAnyFile or faDirectory, SR)=0)then
try
if(isFile)then addNewNode(IncludeTrailingBackslash(Dir)+SR.Name);
else if(isFolder)then scanDir(IncludeTrailingBackslash(Dir)+SR.Name); // recursive call!
until(FindNext(Sr)<>0);
finally
FindClose(SR);
end;
end;
新しいノードを追加するコード:
procedure addNewNode(Text:String);
var theNode,Node:PVirtualNode;
d:PNodeData;
parent:string;
SHFileInfo :TSHFileINfo;
Icon: TIcon;
begin
parent:=ExtractFileDir(Text);
if(hashmap.ContainsKey(parent))then theNode:=hashmap.Items[parent]
else theNode:=nil;
Icon := TIcon.Create;
SHGetFileInfo(PChar(Text), 0, SHFileInfo, SizeOf(SHFileInfo),
SHGFI_ICON or SHGFI_SMALLICON );
Icon.Handle := SHFileInfo.hIcon;
// begin updating
Form1.theTree.BeginUpdate;
// add a child node
Node:=Form1.theTree.AddChild(theNode);
d:=Form1.theTree.GetNodeData(Node);
// add a checkbox
Node.CheckType:=ctCheckBox;
Node.CheckState:=csCheckedNormal;
if((ExtractFileExt(Text)='')and(not hashmap.ContainsKey(Text)))
then hashmap.Add(Text, Node);
// assign a text to the newly created node
d^.Text:=ExtractFileName(Text);
// assign an ImageIndex to the newly created node
d^.ImageIndex:=Form1.treeImageList.AddIcon(Icon);
// end update
Form1.theTree.EndUpdate;
// Destroy the Icon
DestroyIcon(SHFileInfo.hIcon);
end;
treeVeiw OnGetImageIndex のコード:
procedure TForm1.theTreeGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
var FileInfo:PNodeData;
begin
FileInfo := Sender.GetNodeData(Node);
ImageIndex := FileInfo^.ImageIndex;
end;
PS: treeImageListは、treeView.images プロパティにリンクされたimageListです。