Окно с текстом
{---------------------} Procedure MyApp. HandleEvent; {Обработка нестандартных команд cmNewWin, cmDelWin} begin Inherited HandleEvent (Event); case Event. Command of cmNewWin: begin ClearEvent (Event); NewWindow; end; cmDelWin: Event. Command: = cmClose; end; ClearEvent(Event) end {MyApp.HandleEvent }; {-------------------} Procedure MyApp.NewWindow; {Открывает новое окно} var R: TRect; W: PWindow; begin Inc(WinNo); {Номер окна} {Задаем случайные размеры и положение окна: } R. Assign (0, 0.24+Random(10),7+Random(5)); R. Move (Random (80 – R. В. X),Random(24-R.B.Y)); W: = New (PWindow, Init (R, ' ',WinNo)); W^.GetClipRect (R); {Получаем в R границы окна} R.Grow(-1, -1); {Размер внутренней части окна} {Инициируем просмотр текста: } W. Insert (New (PInterior, Init(R))); DeskTop .insert (W); {Помещаем окно на экран} end {MyApp.NewWindow}; {-------------------} Constructor TInterior.Init; {Инициация просмотра текста во внутренней части окна} begin Inherited Init (R); GrowMode: = gfGrowHiX+gfGrowHiY end {Tinterior.Init}; {-----------} Procedure TInterior. Draw; {Вывод текста в окне} var k: Integer; В: TDrawBuffer; begin for k: = 0 to pred(Size.Y) do begin MoveChar(B,' ',GetColor(1),Size.X); MoveStr(B, copy(Lines[k],1,Size.X),GetColor(1)); WriteLine(0,k,Size.X,1,B) end end {TInterior.Draw}; {-------------------} var P: MyApp; begin P.Init; P.Run; P.Done end.
В программе объявляется тип TInterior, предназначенный для создания изображения во внутренней части окон. Его метод Init определяет способ связи объекта TInterior со стандартным объектом TWindow – оператор:
GrowMode: = gfGrowHiX+gfGrowHiY
Задает автоматическое изменение размеров объекта TInterior при изменении размеров окна так, чтобы вся внутренняя часть окна была всегда заполнена текстом. Метод TInterior.Draw заполняет внутреннюю часть окон текстовыми строками, которые в ходе выполнения конструктора TMyApp.Init предварительно считываются из файла с исходным текстом программы в глобальный массив Lines.
Для вывода текста сначала с помощью метода MoveChar буферная переменная В типа TDrawBuffer заполняется пробелами, затем методом MoveStr в нее копируется нужный текст, а с помощью WriteLine содержимое переменной В помещается в видеопамять. Такая последовательность действий стандартна для вывода текстовых сообщений в Turbo Vision. Заметим, что функция GetColor (1) возвращает номер элемента палитры, связанный с обычным текстом; для выделения тестовых строк можно использовать вызов GetColor (2).