为什么memo.Lines使用TStrings而不是TStringList?

Ill*_*iou 20 delphi tstringlist memo

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

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

NGL*_*GLN 24

TMemo.Lines,TListBox.Items,TComboBox.Items等; 所有都被宣布为TStrings.小心,谈论属性!内部创建的类型是TMemoStrings,TListBoxStringsTComboBoxStrings分别,它们的所有后代TStrings和存储的方式不同的所有.

为什么?用于互换性和互操作性.所以每个TStrings主人都有相同的属性,所以你可以这样做:

Memo1.Lines := ListBox1.Items;
Run Code Online (Sandbox Code Playgroud)

如何使用?好吧,一个TStringsTMemo.Lines工作的房子很好.您可以添加,删除,更改,更新和清除属性上的字符串(和对象),因为在内部它是TMemoStrings实现所有这些交互的.声明<>实施.

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

var
  Temp: TStringList;
begin
  Temp := TStringList.Create;
  try
    Temp.Assign(Memo1.Lines);
    Temp.Sort;
    Memo1.Lines.Assign(Temp);
  finally
    Temp.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 调用`Memo.Lines.Delete()`委托给相应的Win32 API调用,它实际上从UI控件中删除一行.对于不同的控件,API是不同的,这就是为什么它们使用不同的TStrings派生类.这就是使用像`TStrings`这样的抽象层的美妙之处.调用者不必关心它是如何在内部实现的. (5认同)