【问题标题】:After second assign TPngImageCollectionItem object TreeView still paint first assigned image(Delphi XE 7)第二次分配 TPngImageCollectionItem 对象 TreeView 后仍然绘制第一个分配的图像(Delphi XE 7)
【发布时间】:2017-11-01 07:43:08
【问题描述】:

我使用最后一个 TPngComponents“PngComponents for Delphi 2009 - Delphi 10.2 Tokyo”。 创建简单的project 来显示我的问题。

为什么在第二次分配 TPngImageCollectionItem 对象 TreeView 后仍然绘制第一次分配的图像并且可能需要调用一些刷新函数?

type
  TForm1 = class(TForm)
    pilTree: TPngImageList;
    pilNoImage: TPngImageList;
    pilAllCor: TPngImageList;
    tvCor: TTreeView;
    pilAllNotCor: TPngImageList;
    tvNoCor: TTreeView;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

procedure AddNodes(ATV: TTreeView);
var
  nFirst, nChild: TTreeNode;
begin
  nFirst := ATV.Items.AddChild(nil, '1');
  nChild := ATV.Items.AddChild(nFirst,'2');
  nChild.ImageIndex := 1;
  nChild.SelectedIndex := 1;
  nFirst.Expanded := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  iI: Integer;
  ItemAdd: TPngImageCollectionItem;
  ANode: TTreeNode;
begin
  // Steps working correct
  for iI := 0 to 1 do begin
    ItemAdd := pilAllCor.PngImages.Add;
    ItemAdd.Assign(pilTree.PngImages[iI]);
  end;
  // Steps working NOT correct
  for iI := 0 to 1 do begin
    ItemAdd := pilAllNotCor.PngImages.Add;
    ItemAdd.Assign(pilNoImage.PngImages[0]);
    ItemAdd.Assign(pilTree.PngImages[iI]);
  end;

  //Setup treeview
  tvCor.Images := pilAllCor;
  tvNoCor.Images := pilAllNotCor;
  AddNodes(tvCor);
  AddNodes(tvNoCor);
end;

例子:

【问题讨论】:

  • 请在您的问题中包含重现问题的最少代码,而不是在指向外部资源的链接后面(这可能会变得无效,从而使您的问题对未来的读者毫无用处)
  • 我尝试添加所有但收到关于很多代码的消息并且没有解释并且找不到像隐藏文本这样我可以存储所有文件的功能。
  • 如果您的示例太大,则可能不够小。

标签: delphi treeview tpngimagelist


【解决方案1】:

TPngImage 添加到 TPngImageList 的方法是使用 AddPng 而不是摆弄集合。这也将更新负责实际显示图像的底层 Windows 图像列表。

正确的代码应该是这样的:

  for iI := 0 to 1 do begin
    pilAllCor.AddPng(pilTree.PngImages[iI].PngImage);
  end;

如果您想更改现有项目,您应该分配集合项目的 PngImage 属性:

    pilAllCor.PngImages[iI].PngImage := pilTree.PngImages[iI].PngImage;

【讨论】:

  • 谢谢!我看代码“Assign”和“SetPngImage”的不同之处。并且“SetPngImage”有调用“Changed”功能。我只想将“分配”用于“TPngImageCollectionItem”,因为他们已经复制了“名称”和“背景”,并且不希望在这种情况下无法使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多