Окно со скроллером
Close (f) end else {Файл не был открыт} Lines. Insert (NewStr (' Нет доступа к файлу '+name)); {Создаем окно со скроллером: } DeskTop.GetExtent (R); W: = New (PWindow, Init (R, 'Просмотр файла '+name,0)); with W do begin GetClipRect(R); R.Grow(-1, -1); Insert (New (PInterior, Init (R, StandardScrollBar ( sbHorizontal+ sbHandleKeyboard), StandardScrollBar (sbvertical+sbHandleKeyboard)))) end; DeskTop. Insert (W); {Ждем действий пользователя:} Inherited Run end {TMyApp.Run}; {----------------} Constructor TInterior.Init; {Создает окно скроллера} begin Inherited Init (R, SX, SY); GrowMode: = gfGrowHiX+gfGrowHiY; SetLimit(128, Lines.count -1) end {TInterior.Init}; {----------------} Procedure TInterior.Draw; {Выводит на экран содержимое окна скроллера} var Y: Integer; В: TDrawBuffer; S: String; begin for Y: = 0 to pred(Size.Y) do begin MoveChar(B,' ',GetColor (1), Size.X); if (Y+Delta.Y < Lines. Count) and (Lines. At (Y+Delta.Y) < > NIL) then begin S: = PString (Lines. At (Y+Delta.Y)); MoveStr (В, copy (s, Delta. X+1, Length (s) – Delta. X), GetColor(1)) end; WriteLine(0,Y,Size.X,1,B) end end {TInterior.Draw}; {----------} var P: TMyApp; begin P.Init; P. Run; P. Done end.
В программе перекрывается метод TApplication.Run. В потомке TMyApp этот метод вначале считывает текстовые строки из файла с текстом программы в коллекцию Lines и создает на экране окно со скроллером. После этого вызывается стандартный метод TApplication.Run.
Метод TInterior.Draw обеспечивает вывод нужных строк в окно скроллера. Для определения порядкового номера выводимых строк и их положения относительно границ скроллера используется поле TScroller.Delta. Обратите внимание: если в коллекцию помещается "пустая" строка, т.е. строка нулевой длины, глобальная функция NewStr возвращает значение NIL. В методе TInterior.Draw оператор:
if (Y+Delta.Y < Lines .count) and (Lines.At(Y+Delta.Y) < > NIL) then…
Осуществляет проверку значения получаемого из коллекции указателя на NIL; если бы мы не предусмотрели эту проверку, прогон программы (использование NIL-указателя) на некоторых ПК мог бы привести к аварийному останову.