2017-11-01 1 views
2

마지막 TPngComponents "PngComponents for Delphi 2009 - Delphi 10.2 Tokyo"을 사용합니다. 내 문제를 표시하기 위해 간단하게 project을 작성하십시오.두 번째 TPngImageCollectionItem 개체를 할당 한 후 TreeView 여전히 첫 번째 할당 된 이미지를 그립니다. (Delphi XE 7)

두 번째 후에 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

이 최소한의 코드를 기입하십시오 : 기존 항목을 변경하려면

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

당신이 컬렉션 항목의 PngImage 속성을 지정해야합니다 :

올바른 코드가 같아야합니다 귀하의 질문에 문제를 재현하는 것이 아니라 외부 리소스에 대한 링크 (무효화 될 수 있으므로 귀하의 질문을 향후 독자에게 쓸모 없게 만듭니다.) –

+0

t 코드 및 설명 및 모든 파일을 저장할 수있는 텍스트 숨기기 같은 기능을 찾을 수 없습니다. – Ride

+1

예제가 너무 큰 경우에는 충분하지 않을 수도 있습니다. –

답변

4

방법은 AddPng을 사용하고 수집 주위 하구되지 않은 TPngImageListTPngImage을 추가한다. 또한 이미지의 실제 표시를 담당하는 기본 Windows 이미지 목록을 업데이트합니다.

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

감사합니다. 나는 코드 "Assign"과 "SetPngImage"의 차이를 본다. 그리고 "SetPngImage"는 "Changed"함수를 호출합니다. 나는 "TPngImageCollectionItem"에 대해 Assign을 사용하기를 원한다. 왜냐하면 그들은 이미 "Name"과 "Background"를 복사했기 때문에 단지이 상황에서는 사용할 수 없다. – Ride

관련 문제