为什么
我需要在处理之前将其转换为
Memo.Lines
使用抽象类 TStrings
?为什么不能使用TStringList
?我需要在处理之前将其转换为
TStringList
吗?Memo.Lines
使用抽象类 TStrings
?为什么不能使用TStringList
?TStringList
吗?TMemo.Lines
、TListBox.Items
、TComboBox.Items
等都声明为TStrings
。注意,这是关于属性的说法!内部创建的类型分别为TMemoStrings
、TListBoxStrings
和TComboBoxStrings
,它们都是TStrings
的子类,并且在存储方式上有所不同。
为什么呢?为了实现互换性和互操作性。因此,每个TStrings
的子类都具有相同的属性,因此可以进行以下操作:
Memo1.Lines := ListBox1.Items;
如何使用?嗯,像TMemo.Lines
这样的TStrings
属性就可以很好地起作用。您可以添加、删除、更改、更新和清除属性上的字符串(和对象),因为内部它是一个实现了所有这些交互的TMemoStrings
。声明和实现分开。
但是当您需要任何特殊处理时,例如像TStringList
提供的排序,那么您就需要帮助。您不能将TMemo.Lines
强制转换或转换为TStringList
,因为它不是一个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()
会委托给适当的Win32 API调用来实际从UI控件中删除一行。不同的控件使用不同的API,因此它们使用不同的TStrings派生类。这就是使用像TStrings
这样的抽象层的优势所在。调用者无需关心其内部实现方式。 - Remy Lebeau
TMemo.Lines is TStringList = False
。实际上,这背后的对象是Windows API的包装器。存储由实现TMemo
的Windows EDIT控件组织。"我在使用它之前应该将其转换为TStringList吗?" 不需要。你为什么要这样做呢? - David Heffernan