![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Продолжаю "вспоминать"/осваивать профильную специальность к своей недалёкой старости...
Возник вопрос. В поле класса, есть TStringList со служебными данными. Так как, просто закинуть присваиванием (как я когда то делал, ужас!) в поле MemoX.Lines этот стринглист является нежелательным, ибо нарушает великий принцип инкапсуляции! Решил немного извернутся. Долгое (относительно, для такого вопроса) гугленье дало некоторое решение. Имеем класс: Код:
TBvn = class private firstLine:String; BVInfo:TStringList; Items:TObjectList<TBvnItem>; public constructor Create(filename:TFileName; IMaxFileRecords:Integer); //парсинг данных destructor Destroy; override; function getFirstLine:String; procedure getBVInfo(sll:TStrings); end; Хотим отобразить на экране содержимое BVInfo, для этого такая процедурка: Код:
procedure TBVN.getBVInfo(sll: TStrings); begin if assigned(BVInfo) then sll.Assign(BVInfo); end; и вот такая проверка поведения в этой процедуре: Код:
//для проверки - удалить if Assigned(BVN) then begin Memo1.Lines.Add(BVN.getFirstLine); BVN.getBVInfo(Memo2.Lines); Memo2.Lines[1]:='борода'; BVN.getBVInfo(Memo2.Lines); end; end; Собственно, есть два вопроса: 1. Как ни странно, содержимое Memo не меняется. Это был такой эксперимент. Получается что процедура sll.Assign(BVInfo), копирует данные BVInfo из класса, в Memo, а не передаёт по ссылке? Ведь если бы шла передача по ссылке, а не по значению, то изменением второй строки Memo, в виде Memo2.Lines[1]:='борода', изменилось бы и поле BVInfo класса. Ну и нарушился бы принцип инкапсуляции соответственно. Или бы выскочила ошибка доступа какая-нибудь, потому что BVInfo в секции private. Но как ни странно, поведение всей этой конструкции именно такое, как мне надо, и работает именно так, как я хочу. Странно. Может кто-нибудь объяснить поведение? 2. Я вообще кучу всего передумал, и возврат массивом строк, и копирование в разные стринглисты перебором в цикле, через Add. Насколько неверно моё решение? З.Ы. маленький: нужен ли перед некийStringList.Free, некийStringList.Clear ? |