2017-11-01 3 views
2

私は最後のTPngComponents "PngComponents for Delphi 2009 - Delphi 10.2 Tokyo"を使用します。 簡単にprojectを作成して、私の問題を表示してください。2番目のTPngImageCollectionItemオブジェクトの割り当て後TreeViewは最初に割り当てられたイメージを塗りつぶします(Delphi XE 7)

2番目の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; 

例:

enter image description here

+2

を最小限のコードを記載してください

正しいコードは次のようになります。あなたの質問に問題を再現するために、外部リソースへのリンクの後ではなく(無効になる可能性があり、あなたの質問を今後の読者に役に立たないようにする) –

+0

私はすべてを追加しようとしているが、 tのコードと説明と私はすべてのファイルを格納することができます隠すテキストのような機能を見つけることはありません。 – Ride

+1

例が大きすぎる場合は、おそらく最小限ではありません。 –

答えて

4

TPngImageListTPngImageを追加する方法はAddPngを使用して、コレクションの周りいじるされていません。これにより、イメージの実際の表示を担当する、基礎となるWindowsイメージリストも更新されます。あなたはコレクションアイテムのPngImageプロパティを割り当てる必要があり、既存の項目を変更する場合

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

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

ありがとうございました!コード "Assign"と "SetPngImage"の違いを見ています。そして "SetPngImage"は "Changed"関数を呼び出しています。私は "名前"と "背景"を既にコピーしているので、 "TPngImageCollectionItem"のためにAssignを使いたいと思っています。 – Ride

関連する問題