Почему memo.Lines использует TStrings вместо TStringList?
Почему Memo.Lines использует абстрактный класс TStrings? Почему вместо этого он не использует TStringList?
И должен ли я преобразовать его в TStringList, прежде чем работать с ним?
Ответ 1
TMemo.Lines, TListBox.Items, TComboBox.Items и т.д.; все объявлены как TStrings. Остерегайтесь, говоря о собственности! Внутренними созданными типами являются TMemoStrings, TListBoxStrings и TComboBoxStrings соответственно, которые являются потомками TStrings и различаются по мере хранения.
И почему? Для взаимозаменяемости и функциональной совместимости. Таким образом, каждый TStrings -поток имеет те же свойства, что и вы можете сделать:
Memo1.Lines := ListBox1.Items;
Как использовать? Хорошо, свойство TStrings, подобное TMemo.Lines, отлично работает. Вы можете добавлять, удалять, изменять, обновлять и очищать строки (и объекты) в свойстве, потому что внутри это 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;