2017-11-20 27 views
1

예기치 않은 TListItem 동작이 나타났습니다. 다음 테스트 코드를 확인하십시오.TListItem.Checked가 Assign() 후 True로 전환됩니다.

var 
    Item: TListItem; 

    //... 

    ListView1.Checkboxes := True; 
    with ListView1.Items.Add do 
    begin 
    Caption := 'old item'; 
    Checked := False; 
    end; 

    Item := TListItem.Create(ListView1.Items); 
    Item.Caption := 'new item'; 
    Item.Checked := False; 

    ListView1.Items[0].Assign(Item); 

    Assert(ListView1.Items[0].Caption = 'new item'); 
    Assert(ListView1.Items[0].Checked = False); //WTF 

Checked 속성이 어쨌든 True로 전환되므로 어설 션 오류가 발생합니다. 도움말 파일에서이 동작에 대한 설명을 찾지 못했습니다.

이것은 버그 또는 기능입니까?

나는 모든 업데이트와 함께 델파이 7을 사용하고 있습니다.

+3

이것은'Assign()'과는 아무런 관련이 없습니다. 'Assign'앞에 'Assert (Item.Checked가 아님);를 삽입하면 실패 할 것입니다. –

답변

7

델파이는 VCL 소스 코드와 함께 제공됩니다. TListItemTListView의 구현에 대해서는 ComCtrls.pas을 참조하십시오.

는 프로젝트 옵션에서 "사용 디버그 DCUs"를 활성화하고, 당신이 정확히 무슨 일이 일어나고 있는지 볼 것이다 디버거와 TListItem 소스 코드를 강화했다. Item.Checked := False은 실패하고 Item.Checked은 항상 을 반환합니다. Item.Index은 -1이므로 ( TListItems.Add()을 우회했기 때문에) -1입니다.

getter 메서드는 잘못된 항목 인덱스가 전달되어 ListView_GetCheckState() 매크로 (LVM_GETITEMSTATE 메시지의 래퍼)가 실패 할 가능성을 처리하지 않습니다.

TListItem 개체를 수동으로 만드는 것만으로는 기본 Win32 ListView 컨트롤에 항목을 추가 할 수 없습니다. TListItems.Add() 또는 TLisItem.Insert() 이외의 방법으로 TListItem을 만드는 경우 을 호출하여 TListitem을 기본 ListView 컨트롤에 삽입해야합니다.