作者:web+php | 来源:互联网 | 2023-01-08 09:29
我遇到了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进行所有更新.
1> Remy Lebeau..:
Delphi附带VCL源代码.看在ComCtrls.pas
为实施TListItem
和TListView
.
假如你在你的项目中选择启用"使用调试的DCU",然后通过加强TListItem
与调试器的源代码,你会看到究竟发生了什么. Item.Checked := False
失败,读取Item.Checked
总是返回True
,因为Item.Index
是-1(因为你绕过TListItems.Add()
).
该TListItem.GetChecked()
吸气剂的方法不处理的可能性ListView_GetCheckState()
的宏(这对于一个包装LVM_GETITEMSTATE
消息)失败由于被传递的无效项目索引.
手动创建TListItem
对象不足以将项添加到基础Win32 ListView控件.如果创建TListItem
除TListItems.Add()
or 之外的via方法TLisItem.Insert()
,则必须调用TListItems.AddItem()
以插入TListitem
基础ListView控件.