我遇到了TListItem的某些意外行为。检查以下测试代码:
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。我没有在帮助文件中找到有关此行为的任何评论。
这是错误还是功能?
我正在使用所有更新的Delphi 7。
最佳答案
Delphi随附VCL源代码。在ComCtrls.pas
中查找TListItem
和TListView
的实现。
如果您在项目选项中启用了“使用调试DCU”,然后使用调试器逐步浏览TListItem
源代码,您将确切地看到正在发生的事情。 Item.Checked := False
失败,并且读取Item.Checked
总是返回True
,因为Item.Index
为-1(因为您绕过了TListItems.Add()
)。TListItem.GetChecked()
getter方法不能处理由于传递无效的项目索引而导致ListView_GetCheckState()
宏(LVM_GETITEMSTATE
消息的包装器)失败的可能性。
手动创建TListItem
对象不足以将该项添加到基础Win32 ListView控件。如果通过TListItem
或TListItems.Add()
以外的其他方式创建TLisItem.Insert()
,则必须调用TListItems.AddItem()
将TListitem
插入基础ListView控件。