1

我正在尝试在delphi2010中向VirtualTreeview添加小图标我使用属性图像将ImageList附加到VirtualTreeview

procedure TMainFrm.VSTGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  FileInfo: PFileInfoRec;
begin
  if Kind in [ikNormal , ikSelected] then
  begin
    if Column = 0 then
    ImageIndex :=ImageList1.AddIcon(FileInfo.FileIco);
  end;
end;

但添加图标后看起来太暗了:

截屏

FileInfo Strucutre (Record with methods) 在我加载文件时填充,所以我需要的只是将 fileico 从 fileinfo 添加到 imagelist 并显示在树视图中

type
  PFileInfoRec= ^TFileInfoRec;
  TFileInfoRec = record
  strict private
    vFullPath: string;
      .
      .
      .
    vFileIco : TIcon;
  public
    constructor Create(const FilePath: string);
    property FullPath: string read vFullPath;
      .
      .
      .
    property FileIco : TIcon  read vFileIco;
  end;

构造函数:

constructor TFileInfoRec.Create(const FilePath: string);
var
  FileInfo: SHFILEINFO;
begin
  vFullPath := FilePath;
    .
    .
    .
  vFileIco        := TIcon.Create;
  vFileIco.Handle := FileInfo.hIcon;
//  vFileIco.Free;
end;

那么问题在哪里?!谢谢

4

1 回答 1

2

让我们有一个图像列表ImageList1并将其分配给VirtualStringTree1.Images属性。然后加入之前的评论者,在你使用之前FileInfo,给它分配一些东西,比如:FileInfo := Sender.GetNodeData(Node),而不是你可以使用FileInfo.FileIco的。但是您应该将您的图标添加到图像列表而不是OnGetImageIndex. 您应该在 OnInitNode 中执行此操作(如果您遵循虚拟范式,您应该执行的操作),而不是将添加图标的索引存储在 FileInfo 中。例子:

procedure TForm1.VirtualStringTree1InitNode(Sender: TBaseVirtualTree;
  ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  FileInfo: PFileInfoRec;
begin
  FileInfo := Sender.GetNodeData(Node);
  //...
  FileInfo.FileIcoIndex := ImageList1.AddIcon(FileInfo.FileIco);

end;

比在onGetImageIndex

procedure TMainFrm.VSTGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  FileInfo: PFileInfoRec;
begin
  FileInfo := Sender.GetNodeData(Node);
  if Kind in [ikNormal , ikSelected] then
  begin
    if Column = 0 then
    ImageIndex :=FileInfo.FileIcoIndex;
  end;
end;

如果还不够,请发布更多示例代码,以启发我们您的问题。

于 2012-06-19T11:55:43.953 回答