在Assign()之后,TListItem.Checked将自身切换为True

时间:2017-11-20 19:45:13

标签: listview delphi delphi-7 listviewitem

我遇到了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 个答案:

答案 0 :(得分:7)

Delphi附带VCL源代码。请查看ComCtrls.pas以了解TListItemTListView

的实施情况

如果您在项目选项中启用了“使用调试DCU”,然后使用调试器逐步执行了TListItem源代码,您会看到完全发生了什么。 Item.Checked := False失败,阅读Item.Checked始终返回True,因为Item.Index为-1(因为您绕过了TListItems.Add())。

TListItem.GetChecked() getter方法无法处理ListView_GetCheckState()宏(LVM_GETITEMSTATE消息的包装器)因传递无效项索引而失败的可能性。< / p>

手动创建TListItem对象不足以将项添加到基础Win32 ListView控件。如果您通过TListItemTListItems.Add()以外的方式创建TLisItem.Insert(),则必须调用TListItems.AddItem()TListitem插入基础ListView控件。