Подтвердить что ты не робот

Почему memo.Lines использует TStrings вместо TStringList?

Почему Memo.Lines использует абстрактный класс TStrings? Почему вместо этого он не использует TStringList?

И должен ли я преобразовать его в TStringList, прежде чем работать с ним?

4b9b3361

Ответ 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;