【问题标题】:TStrings vs TStringList in TCheckListBoxTCheckListBox 中的 TStrings 与 TStringList
【发布时间】:2012-06-12 08:40:01
【问题描述】:

在 Delphi 7 中,我使用的是 TCheckListBox。我希望它使用 TStringList 而不是 TStrings,因此我可以将 Duplicates 设置为 dupIgnore,并将 Sorted 设置为 TRUE。

我可以这样做吗:

Form1 = class(TObject
    CheckListBox1: TCheckListBox;  // created by the IDE
end;

procedure TForm1.FormCreate
begin
   CheckListBox1.Items.Free;
   CheckListBox1.Items := TStringList.Create;
   CheckListBox1.Items.Sorted := TRUE;
   CheckListBox1.Items.Duplicates := dupIgnore;
end;

这样安全吗?有什么注意事项或建议吗?

编辑:删除 MyStringList 的声明并将 .Items 添加到最后两个赋值行。

编辑 2:尝试编译上面的代码,看起来我必须像这样转换最后两行:

        TStringList(CheckListBox1.Items).Sorted := TRUE;
        TStringList(CheckListBox1.Items).Duplicates := dupIgnore;

虽然我也许可以让它运行,但我提出这个问题是因为让它运行并不意味着它会一直运行或安全。

【问题讨论】:

  • MyStringList的目的是什么?
  • 我删除了未使用的 MyStringList 声明。
  • 我认为这不是一个好主意。由TCheckListBox 创建的TStrings 实际上是"TListBoxStrings" 类型,它覆盖了Put、Get 等方法。 Sorted 属性可以在不使用 TStringList 的情况下正常工作。
  • @kobik,TListBoxStrings 是什么?据我所知,TCheckListBox.Items 被声明为TStrings
  • 是的,但它们在constructor TCustomListBox.Create(AOwner: TComponent); 中创建为FItems := TListBoxStrings.Create;

标签: delphi delphi-7


【解决方案1】:

您无法控制TCheckListBox 使用哪个类来存储其项目。为Items 属性分配一个值只会将其项目分配给内部存储。

另外,你不应该打电话给Items.Free;TCheckListBox 依赖于其内部的 TListBoxStrings 实例。

要回答您对问题所做的修改:也不要将 Items 属性硬转换为 TStringList。类型转换错误(Items 暴露的实例不是TStringList),只会导致问题。

编辑,为您似乎试图实现的目标提出解决方法:要保持复选框排序,您可以将其Sorted 属性设置为True。为避免重复,您可以在代码中添加项目之前检查列表。

【讨论】:

  • 您可以使用外部TStringList 进行存储。在这种情况下,您必须将其创建为虚拟的,并根据需要检索数据。请注意,大量项目存在问题 - 请参阅 stackoverflow.com/questions/7144966/…
  • 在添加到 TCheckListbox 之前,我已经听取了您的建议并在 TStringList 中对我的数据进行了预排序。但是,你能澄清为什么我的方法不起作用。我认为 OO 的全部意义在于,这里:TStringList 是 TStrings 的后代,所以我可以替换一个 TStringList
  • 如果 B 从 A 继承,则 B 是 A,但 A 可能不是 B。(例如,狗是动物,但动物可能不是狗。)在您的情况下,声明了 Items作为TStrings,您可以放心地假设它实际上是TStrings 的后代,而不是更多。假设 TStringList 假设太多,在这种情况下是错误的(Items 实际上并不指向 TStringList 实例)。
  • @Robert - 从 OO 的角度来看,您可以将任何 TStrings 后代替换为 Items。从实际的角度来看你不能,因为FItems 是班级私有的(除非你求助于可怕的黑客)。在任何情况下,TCheckListBox 取决于其项目类提供的功能:TListBoxStrings(另一个 TStrings 后代)。例如,TL​​istBoxStrings 在添加项目后向底层 api 控件发送LB_ADDSTRING。 TStringList 不这样做,它没有拥有 ListBox 的概念。因此,StringList 无法满足您的目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多