Delphi 为什么memo.line使用tstring而不是TStringList?

Delphi 为什么memo.line使用tstring而不是TStringList?,delphi,tstringlist,memo,Delphi,Tstringlist,Memo,为什么Memo.line使用抽象类TStrings?为什么不改用TStringList 在使用它之前,我是否应该将其转换为TStringList?TMemo.Lines,TListBox.Items,TComboBox.Items,等等;所有都声明为t字符串。当心,谈论的财产是什么!内部创建的类型分别是TMemoStrings、TListBoxStrings和tcomboxstrings,它们都是TStrings的后代,存储方式各不相同 为什么?为了互换性和互操作性。因此,每个TStrings-

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


在使用它之前,我是否应该将其转换为
TStringList

TMemo.Lines
TListBox.Items
TComboBox.Items
,等等;所有都声明为
t字符串
。当心,谈论的财产是什么!内部创建的类型分别是
TMemoStrings
TListBoxStrings
tcomboxstrings
,它们都是
TStrings
的后代,存储方式各不相同

为什么?为了互换性和互操作性。因此,每个
TStrings
-子体都具有相同的属性,因此您可以执行以下操作:

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;

TMemo.Lines是TStringList=False
。事实上,这背后的实际对象是围绕Windows API的包装器。存储由实现
TMemo
的Windows编辑控件组织。“我应该在使用它之前将其转换为TStringList吗?”不。你为什么要这样做?TStrings是一个较小的“契约”,允许开发人员具有更大的灵活性。您可以与实现TStrings抽象类的任何类交互。好的,谢谢,这很有意义。所以我猜,例如Memo.Lines.Delete(0)之所以有效,是因为它在内部不使用tstring?是的。当在表单上删除备忘录组件不会导致抽象编译器错误时,让我们假设没有抽象对象被实例化当然,有一种更巧妙的方法可以就地排序。调用
Memo.Lines.Delete()
委托给相应的Win32 API调用,该调用实际上会从UI控件中删除一行。对于不同的控件,API是不同的,这就是为什么它们使用不同的Tstring派生类。这就是使用像
TStrings
这样的抽象层的好处。调用方不必关心它是如何在内部实现的。