3

ファイルとサブフォルダーのフォルダーをスキャンし、その結果を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です。

4

0 に答える 0