Реализация универсальных интерфейсных компонентов

Классы будем описывать в отдельных модулях. Это позволит включать в программу описания только тех классов, которые в ней будут использоваться.

Класс TWin описываем в модуле Win: в интерфейсной части - само описание класса, а в части реализации - методы класса.

Unit Win;

Interface Uses crt;

Type str80=string[80J;

TWin=Object

xl, yl, x2, y2:integer; {координаты окна} attr: integer; {атрибут}

xt, yt'.integer; {начало текста}

text:str80; {строка текста}

procedure Init(axl, ayl, ax2, ay2, aattr, axt.ayt: integer;atext:str80); procedure SetAttr(aattr:integer); {изменение цвета и фона окна} procedure Draw; {вывод окна на экран}

End;

Implementation

Procedure TWin.Init; {инициализация полей}

Begin

xl:=axl; yl:=ayl; х2:=ах2; у2:=ау2; attr:=aattr; х t:-axt; yt:=ayt; text: =at ext;

End;

Procedure TWin.Draw; {вывод окна на экран}

Begin

TextBackGround(attr div 16);

TextColor(attr mod 16);

, Window(xl,yl,x2,y2);

Clrscr; {выделение окна}

• Gotoxy(xt,yt);

Write(text); {вывод строки текста}

end;

Procedure TWin.Setattr; {изменение цвета фона и текста}

Begin

attr: =aattr; {изменение атрибута}

Draw; {вывод окна с другим атрибутом}

end;

End.

Класс TInput описываем в модуле Input. Метод Error объявляем виртуальным, так как он вызывается из другого метода класса и будет переопределяться в классах потомках, в то время как метод, из которого он вызывается, скорее всего переопределяться не будет (1-й случай обязательного использования позднего связывания).

Unit Input;

Interface Uses crt, Win;

Type TInput=Object(TWin) .

inp:TWin; {окно ввода}

Constructor Init(axl,ayl, ax2, ay 2, aattr, axt, ayt:integer;atext:str80;

bxl,byl,bx2>by2,battr,bxt,byi:integer;btext:str80); procedure Draw; {вывод окна} procedure Clear; {очистка поля ввода}

procedure Input; {ввод строки из окна}

function Error:boolean; virtual; {проверка введенных данных} end;

Implementation Constructor TInput.Init;

Begin

inherited Initfaxl, ay l, ax2,ay2, aattr, axt, ayt.atext);

Inp.Initfbxl, by I, bx2, by2, battr, bxt, byt, "); end;

Procedure TInput.Draw;

Begin

inherited Draw; inp.Draw;

End;

Procedure TInput.Clear;

Begin


inp.text:= ”; inp.Draw;

Window (inp.xl, inp.yl, inp.x2, inp.y2); TextBackGroundfinp.attr div 16); TextColor(inp.attr mod 16); repeat

Gotoxy(inp.xt,inp.yt);

Clear;

ReadLn(inp. text);

Gotoxy(inp.xt, inp.yt); Write(inp.text); until not Error;


Класс TMessage описываем в модуле Message.

Unit Message;

Interface Uses crt, Win;

Type TMessage-Object(TWin)

ok:TWin; {окно подтверждения}

procedure Init(axl, ayj,ax2, ау2, aattr, cat, ayt:integer;atext:str80;

bxl, byl, bx2, by2, battr, bxt, byt: integer;btext:str80); procedure Run; {ожидание подтверждения} procedure Draw; {вывести окно} end;

Implementation Procedure TMessage.Init;

Begin

inherited Init(axl, ayl, ax2, ay2, aattr, cat, ayt, atext); ok. Init(bxl, byl, bx2, by2, battr, bxt, byt, btext); end;

Procedure TMessage.Draw;

Begin

inherited Draw; {выводим родительское окно} okDraw; {выводим окно запроса на продолжение работы}

End;

Procedure TMessage.Run;

Begin

Draw; {выводим окно}

ReadKey; {ожидаем подтверждения}

End;

End.

Класс TMenu описываем в модуле Menu. Инициализацию объектных полей-массивов целесообразно выполнять типизированными константами. Несовпадения размерности массивов, если используются не все пункты меню, можно избежать, описав параметры как открытые массивы, не забыв, что индекс элементов открытого массива начинается с нуля.

Unit Menu;

Interface Uses crt, Win;

Type TMenu=Object(TWin)

nalt.integer; {количество альтернатив в меню}

masalt:array[1 ..10] ofTWin; {массив альтернатив меню} npos:integer; {номер выбранной альтернативы}

constructor Init(axl,ayl, ах2, ау2, aattr,

axt, ayt: integer ;atext:str80;n:integer; const w.array ofTWin); {открытый массив TWin} procedure Run; {реализация работы с меню}

procedure Draw; virtual; {вывести окно}

procedure Enter; virtual; {при нажатии на Enter ...} end;

Implementation Constructor TMenu.Init;

Var i: integer;

Begin

inherited In it (ax I, ayl, ax2, ay2, aattr, axt, ayt, at ext);

nalt:=n; {количество реально используемых пунктов меню}

for i:-l tonalt do

masalt[i].Init(w[i-l].xl, w[i-l].yl, w[i-l].x2, w[i-l].y2,

w[i-I].attr, w[i-l].xt, w[i-l].yt, w[i-I].text);

End;

Procedure TMenu.Draw; .

Var Uinteger;

Begin { очищаем экран}

TextBackGround(O);

TextColor(I);

Window(l,l,80,25); Clrscr;

inherited Draw; {выводим основное окно}

for i:-l to nalt do masalt[i].Draw; {выводим окна пунктов} End; -

Procedure TMenu.Run;

Var chi, ch2.char;

temp:integer;

Begin

Draw;

npos:=nalt;

masalt[npos]. Setattr(71); repeat

chl:=Readkey; {читаем код клавиши} if chl=#0 then ch2:=Readkey; case chi of #0: case ch2 of

#75:begin {перемещение курсора влево}

temp:=npos-l;

if temp=0 then temp: =nalt; {закольцовываем} masalt[npos].Setattr(l 13); {убираем выделение}

masalt[temp].Setattr(71); {выделяем пункт}

npos:=temp; end;

#77:begin {перемещение курсора вправо}

temp:=npos+l;

if temp=nalt+1 then temp:=l; {закольцовываем}

masalt[npos].Setattr(l 13); {убираем выделение} masalt[temp].Setattr(71); {выделяем пункт} npos: =temp; end;

end;

#13: begin

masalt[npos].Setattrf113); {убираем выделение}

Enter; {при нажатии Enter - выполняем пункт} Draw; {выводим главное меню} masalt[npos].Setattr(71); {выделяем пункт меню}

end;

end

until((npos=nalt)and(chl =#13)) or (chi =#27); {до завершения работы} End;

Procedure TMenu.Enter; {абстрактный метод выполнения пунктов} Begin end;

End.

Класс TForm описываем в модуле Form. Инициализацию объектных полей - окон ввода также будем выполнять с использованием типизированных констант.

Unit Form;

Interface

Uses crt, Win,Input,Menu;

Type TForm=Object(TMenu)

ninput:integer; {количество полей ввода} masinp:array[1..5] ofTInput; {массив полей ввода} constructor Init(axl, ayl, ax2, ay2,aattr, axt, ayt: integer;atext:str80;

n:integer; const wl:array of TWin;k:integer; const w2:array of TInput); procedure Draw; virtual; {вывод окна} procedure Clear; {очистка окон ввода} procedure Input; {ввод информации из окон ввода} end;

Implementation Constructor TForm.Init;

Var i: integer;

Begin

inherited Init(axl, ayl,ax2, ay2, aattr, axt, ayt, atext, n,wl); ninput: =k; {количество задействованных окон ввода}

for i:—l to ninput do masinp[i].Init(w2[i-l].xl, w2[i-l].yl,

w2[i-l].x2, w2[i-l].y2, w2[i-lj.attr, w2[i-l].xt, w2[i].yt, w2[i-lj. text, w2[i-l]. inp.xl, w2[i-l]. inp.yl, w2[i-l].inp.x2, w2[i-lj.inp.y2, w2[i-l].inp.attr, w2[i-l].inp.xt, w2[i-l].inp.yt, w2[i-lj. inp.text);

End;

Procedure TForm.Draw;

Var i. integer;

Begin

inherited Draw; {выводим основное окно}

for i:=l to nalt do masalt[i].Draw; {выводим окна пунктов} for i:=l to ninput do masinp[i].Draw; {выводим окна ввода}

End;

Procedure TForm. Clear;

Var i: integer;

Begin

for i:=l to ninput do masinp[ij.Clear; {чистим окна ввода}

End;

Procedure TForm.Input;

Var i. integer;

Begin

Clear;

for i:=l to ninput do masinp[ij.Input; {вводим данные}

End;

End.

12.1.

<< | >>
Источник: Иванова Г.С. Основы программирования. 2002

Еще по теме Реализация универсальных интерфейсных компонентов:

  1. Универсальность телевидения
  2. Степень универсальности
  3. Универсальный журналист
  4. Универсальный цикл
  5. НЕВРОЗ УНИВЕРСАЛЬНЫЙ
  6. Шесть универсальных добродетелей
  7. Ступень шестая. УНИВЕРСАЛЬНАЯ
  8. Характеристики универсального энергетического поля
  9. Функциональные компоненты правового сознания.
  10. § 3.1. Основные структурные компоненты организации
  11. Что это значит - универсальные связи?
  12. Глава 6 УНИВЕРСАЛЬНОЕ ЭНЕРГЕТИЧЕСКОЕ ПОЛЕ