【问题标题】:Why does memo.Lines use TStrings instead of TStringList?为什么 memo.Lines 使用 TStrings 而不是 TStringList?
【发布时间】:2012-06-20 14:50:01
【问题描述】:

为什么Memo.Lines 使用抽象类TStrings?为什么不改用TStringList

我应该在使用它之前将其转换为TStringList 吗?

【问题讨论】:

  • TMemo.Lines is TStringList = False。事实上,这背后的实际对象是 Windows API 的包装器。存储由实现TMemo 的Windows EDIT 控件组织。 “在使用它之前我应该​​将它转换为 TStringList 吗?”不。你为什么要这样做?
  • TStrings 是一个较小的“合同”,为开发人员提供了更大的灵活性。您可以与任何实现 TStrings 抽象类的类进行交互。

标签: delphi tstringlist memo


【解决方案1】:

TMemo.LinesTListBox.ItemsTComboBox.Items等;所有都被声明为TStrings。当心,谈论的是财产!内部创建的类型分别为TMemoStringsTListBoxStringsTComboBoxStrings,它们都是TStrings的后代,存储方式不同。

为什么?为了互换性和互操作性。所以每个TStrings-descendant 都有相同的属性,所以你可以这样做:

Memo1.Lines := ListBox1.Items;

如何使用?好吧,像 TMemo.Lines 这样的 TStrings 属性可以正常工作。您可以添加、删除、更改、更新和清除属性上的字符串(和对象),因为在内部它是一个TMemoStrings,它实现了所有这些交互。声明实施。

但是当您需要任何特殊处理时,例如就像TStringList 提供的排序一样,那么您需要帮助。您不能将TMemo.Lines 类型转换或转换为TStringList,因为它不是一个,而是您需要为此特殊处理创建一个中间对象:

var
  Temp: TStringList;
begin
  Temp := TStringList.Create;
  try
    Temp.Assign(Memo1.Lines);
    Temp.Sort;
    Memo1.Lines.Assign(Temp);
  finally
    Temp.Free;
  end;
end;

【讨论】:

  • 好的,谢谢,这是有道理的。所以我猜例如Memo.Lines.Delete(0) 之所以有效,是因为它内部不使用 TStrings?
  • 是的。如果在表单上放置备忘录组件不会导致抽象编译器错误,那么我们假设没有实例化抽象对象。 ;)
  • 肯定有一种更巧妙的就地排序方式。
  • 调用Memo.Lines.Delete() 代表适当的Win32 API 调用,该调用实际上从UI 控件中删除了一行。不同控件的 API 不同,这就是它们使用不同 TStrings 派生类的原因。这就是使用像TStrings 这样的抽象层的美妙之处。调用者不必关心它是如何在内部实现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多