добавить маленькую иконку в virtualtreeview

я пытаюсь добавить маленькую иконку в VirtualTreeview в delphi2010. У меня есть 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 (запись с методами) заполняется, когда я загружаю файлы, поэтому мне нужно просто добавить fileico из fileinfo в список изображений и отобразить в дереве

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;

так где проблема? ! Благодарность


person S.FATEH    schedule 19.06.2012    source источник
comment
Похоже на проблему с частичной прозрачностью. Возможно, вам нужно установить список изображений ColorDepth на cd32Bit.   -  person David Heffernan    schedule 19.06.2012
comment
@DavidHeffernan спасибо, но все еще не работает   -  person S.FATEH    schedule 19.06.2012
comment
Хорошо, что именно ты сделал? Когда именно вы изменили ColorDepth? Сразу после создания списка изображений. Кроме того, как выглядит ваш реальный код? Предположительно реальный код присваивает FileInfo. Если настоящий код делает это, то разочаровывает то, что вы разместили поддельный код. Если это ваш реальный код, то не присваивать ничего FileInfo явно проблема.   -  person David Heffernan    schedule 19.06.2012
comment
И вы не должны добавлять новый значок каждый раз, когда древовидное представление запрашивает индекс изображения. Добавьте значок один раз и каждый раз возвращайте один и тот же индекс изображения.   -  person David Heffernan    schedule 19.06.2012
comment
Дэвид прав, вы должны понять виртуальную парадигму, прежде чем работать с Virtual TreeView.   -  person hubalazs    schedule 19.06.2012


Ответы (1)


Давайте создадим список изображений 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;

Если этого недостаточно, опубликуйте больше примеров кода, чтобы рассказать нам о вашей проблеме.

person balazs    schedule 19.06.2012
comment
@S.FATEH Вы уже приняли ответ на свой вопрос. Код, который вы добавили, ничего для нас не меняет. - person David Heffernan; 19.06.2012