Использование коллекций
В последний оператор метода Interior.Init внесите следующее изменение:
Constructor TInterior.Init(var Bounds: TRect; HS,VS: PScrollBar); begin SetLimit(LLine,PSA.Count) end; {TInterior.Init}
Другим станет также и реализация метода TInterior.Draw:
Procedure TInterior.Draw; var n,k: Integer; B: TDrawBuffer; p: PString; Color: Byte; begin Color: = GetColor(1); for n: = 0 to pred(Size.Y) do begin k: = Delta.Y+n; MoveChar(B,' ',Color,Size.X); if k < pred(PS.Count) then begin p: = PS.At(k); MoveStr(B,Copy(р,Delta.X+1,Size.X),Color) end; WriteLine(0,N,Size.X,1,B) end end; {TInterior.Draw}
Элементы коллекции нумеруются, начиная с номера 0. Длина коллекции (общее количество ее элементов) хранится в поле PS.Count. Функция PS.At(k) возвращает указатель на k-й элемент коллекции.
Созданная коллекция размещается в динамической памяти, поэтому после использования ее следует удалить из кучи. Для этого перекроем стандартный деструктор Done:
type TInterior = object (TScroller) ……. Destructor Done; Virtual; end; Destructor TInterior.Done; begin Dispose(PS, Done); {Удаляем коллекцию} Inherited Done {Выполняем стандартный деструктор} end;
Еще раз хочу обратить Ваше внимание на особенность программирования в среде Turbo Vision: Вы определяете метод, но не указываете, когда он должен быть выполнен. Правильно сконструированный объект уже "знает", когда он ему понадобится! Так было в случае правила Draw, так же обстоит дело и с деструктором Done: обработчик событий окна TWindow вызовет этот метод, как только он получит событие cmCancel (закрыть окно). Чтобы убедиться в этом, установите контрольную точку в строке:
Dispose(PS, Done); {Удаляем коллекцию}
И запустите программу. Останов в контрольной точке произойдет только в том случае, если Вы загрузите окно с текстом и попытаетесь выйти из программы. Если из программы выйти сразу после ее запуска, контрольная точка не сработает.
Вид экрана с окном просмотра отсортированного файла показан на рис. 15.9.
Рис. 15.9. Окно с отсортированным тестом программы