2012-06-20 4 views
17

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

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

+2

'TMemo.Lines является TStringList = false'. Фактически, фактический объект, стоящий за этим, является оберткой вокруг API Windows. Хранилище организовано с помощью элемента управления EDIT Windows, который реализует «TMemo». «Должен ли я преобразовать его в TStringList, прежде чем работать с ним?» Нет. Почему ты хочешь это сделать? –

+5

TStrings - это меньший «контракт», который обеспечивает большую гибкость для разработчика. Вы можете взаимодействовать с любым классом, который реализует абстрактный класс TStrings. – Simon

ответ

21

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; 
+1

Хорошо, спасибо, это имеет смысл. Поэтому я предполагаю, например. Memo.Lines.Delete (0) работает, потому что он не использует TStrings для внутреннего использования? – Illiou

+0

Да. При удалении компонента memo в вашей форме не возникает ошибка компилятора _abstract_, давайте предположим, что не создается экземпляр абстрактного объекта. ;) – NGLN

+1

Несомненно, есть простой способ сортировки на месте. –

Смежные вопросы