Почему Memo.Lines использует абстрактный класс TStrings? Почему вместо этого он не использует TStringList?Почему memo.Lines использует TStrings вместо TStringList?
И должен ли я преобразовать его в TStringList, прежде чем работать с ним?
Почему Memo.Lines использует абстрактный класс TStrings? Почему вместо этого он не использует TStringList?Почему memo.Lines использует TStrings вместо TStringList?
И должен ли я преобразовать его в TStringList, прежде чем работать с ним?
TMemo.Lines
, TListBox.Items
, TComboBox.Items
и т. Д .; все объявлены как TStrings
. Остерегайтесь, говоря о собственности! Внутренними созданными типами являются TMemoStrings
, TListBoxStrings
и TComboBoxStrings
соответственно, которые являются потомками TStrings
и отличаются всем способом хранения.
И почему? Для взаимозаменяемости и функциональной совместимости. Таким образом, каждый TStrings
-descendant обладает теми же свойствами, и поэтому вы можете сделать:
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;
Хорошо, спасибо, это имеет смысл. Поэтому я предполагаю, например. Memo.Lines.Delete (0) работает, потому что он не использует TStrings для внутреннего использования? – Illiou
Да. При удалении компонента memo в вашей форме не возникает ошибка компилятора _abstract_, давайте предположим, что не создается экземпляр абстрактного объекта. ;) – NGLN
Несомненно, есть простой способ сортировки на месте. –
'TMemo.Lines является TStringList = false'. Фактически, фактический объект, стоящий за этим, является оберткой вокруг API Windows. Хранилище организовано с помощью элемента управления EDIT Windows, который реализует «TMemo». «Должен ли я преобразовать его в TStringList, прежде чем работать с ним?» Нет. Почему ты хочешь это сделать? –
TStrings - это меньший «контракт», который обеспечивает большую гибкость для разработчика. Вы можете взаимодействовать с любым классом, который реализует абстрактный класс TStrings. – Simon