Библиотечный модуль WIN-DOWHANDLER

Автор: Бирман А.А.

Журнал: Компьютерная оптика @computer-optics

Статья в выпуске: 2, 1987 года.

Бесплатный доступ

В докладе описывается библиотечный модуль WINDOWHANDLER, позволяющий на экране алфавитно-цифрового дисплея реализовать работу с окнами - произвольными областями прямоугольной формы и осуществлять в них операции ввода-вывода.

Короткий адрес: https://sciup.org/14058133

IDR: 14058133

Текст научной статьи Библиотечный модуль WIN-DOWHANDLER

end;

VAR DONE:BOOLEAN; (* DONE-'ВВЕДЕНО ЧИСЛО” *) NEXTCHAR:CHAR; (* ПЕРВАЯ HE ЦИФРА ПРИ ВВОДЕ ЦЕЛЫХ *)

PROCEDURE SETMARK ( LINE,POS:CARDINAL );

(«МАРКЕР HA LINE-ЛИНИ» И POS-ПОЗИЦИЮ ЭКРАНА ( LINE -C0..233, POS-C0..793 ) *)

PROCEDURE OPENWINDOW ( VAR W:WINDOW; POS,LINE,WIDTH,HIGH:CARDINAL; NAME:ARRAY OF CHAR; VAR DONE:BOOLEAN; HEAD:BOOLEAN) ;

(* POS-АБСОЛЮТНАЯ КАОРДИНАТА КРАЙНЕЙ ЛЕВОЙ ПОЗИЦИИ, LIN-АБС.КАОРДИНАТА ВЕРХНЕЙ СТРОКИ, WIDTH-ШИРИНА ОКНА, HIGH-ЧИСЛО ЛИНИИ В ОКНЕ,ВКЛЮЧАЯ ШАПКУ, NAME-ПОСТОЯННАЯ ШАПКА, DONE"'ОКНО ОТКРЫТО”, НЕАО=”НУЖНО ПЕЧАТАТЬ ШАПКАХ’*)

PROCEDURE CLOSEWINDOW ( VAR W:WINDOW );

PROCEDURE SETPOS ( W:WINDOW; LINE,POS:CARDINAL );

(*УСТАНОВИТЬ ТЕКУШУ10 ПОЗИЦИЮ OKHA-(LINE,POS) *)

PROCEDURE GETPOS ( W:INDOW; VAR LINE,POS:CARDINAL ); («ПОЛУЧИТЬ ТЕКУЩИЕ КАОРДИНАТЫ ОКНА *)

PROCEDURE CLRLINE( W:WINDOW; LINE,POS:CARD INAL );

(«ОЧИСТИТЬ В ОКНЕ СТРОКУ LINE С ПОЗИЦИИ POS »)

PROCEDURE CLRWINDOW ( W:WINDOW );         (* ОЧИСТИТЬ ОКНО *)

PROCEDURE WWRITE ( WIN:WINDOW; CH:CHAR );

(« ЗАПИСАТЬ СИМВОЛ В ТЕКУЩЕЙ ПОЗИЦИИ ОКНА *)

PROCEDURE WWRITELINE ( WIN:WINDOW; STRING:ARRAY OF CHAR );

(* ЗАПИСАТЬ СТРОКУ С ТЕКУЩЕЙ ПОЗИЦИИ ОКНА *)

PROCEDURE CLRD ( LINE:CARDINAL );

(* ОЧИСТИТЬ ДИСПЛЕИ НАЧИНАЯ СО СТРОКИ LINE *)

PROCEDURE WWRITELN ( WIN:WINDOW );

(* ПЕРЕИТИ НА ДРУГУЮ СТРОКУ ОКНА *)

PROCEDURE WREAD ( WIN:WINDOW; VAR CH:CHAR );

(* УСТАНОВИТЬ МАРКЕР В ТЕКУЩУЮ ПОЗИЦИЮ ОКНА И ПРИНЯТЬ СИМВОЛ,ЗАТЕМ ЕГО ВЫСВЕТИТЬ *)

PROCEDURE WREADCARD ( WIN:WINDOW; VAR C:CARDINAL );

(* МАРКЕР УСТАНАВЛИВАЕТСЯ В ТЕКУЩУЮ ПОЗИЦИЮ ОКНА И ВВОДИТСЯ ЦЕЛОЕ*)

PROCEDURE WWRITECARD ( WIN:WINDOW; C,N:CARDINAL );

(* ВЫВЕСТИ ЦЕЛОЕ-’С” С ТЕКУЩЕЙ ПОЗИЦИИ ОКНА С ”N” ЗНАКАМИ *)

END WINDOWHANDLER.

ПРИЛОЖЕНИЕ 2

IMPLEMENTATION MODULE WINDOWHANDLER; (*жТ- 6,1986,05 x)

FROM TTIO IMPORT ЫРИТЕЗТРИНГ,WPHTE,REAfl,5ЕТМ0ДЕ;

FROM 5Т0РАГЕ IMPORT ALLOCATE,DEALLOCATE; («CONST NL=24;NCH=80;«)

PROCEDURE SETMARK(LINE,POS:CARDINAL);

BEGIN

wphte(33o ;wphte(13io ;

ЫРИТЕ(CHAR(40B+LINE));WPHTE(CHAR(40B+POS))5

end setmark;

PROCEDURE OPENWINDOW(VAR WIN:WINDOW;X,Y,WI,HI:CARDINAL;

NAME:ARRAY OF CHAR;

VAR DONE:BOOLEAN;

KAP:BOOLEAN) ;

VAR l:CARDINAL;

BEGIN

new(win) ;

IF (X>NCH-1)OR(Y>NL~1) THEN DONE:=FALSE;RETURN END;

WITH WIN'"' DO

BLK.X:=X;

IF (КАР) THEN BLK.Y:=Y+2 («ШАПКА OKHA*)

ELSE BLK.Y:=Y END;

IF X+WK=NCH-1 THEN BLK.W:=WI ELSE BLK. W: ^NCH-l -X END;

IF Y+HI<= NL-1 THEN BLK.H:=HI ELSE: BLK.H:=NL-1-Y END;

IF КАР THEN l:=0;

WHILE (I<=HIGH(NAME)) AND(NAMECIЗФ0С)AND(I<-WI) DO HEADC13:=NAMECI 3; INC(I)

end;

(«ЗАПИШЕМ ЗАГОЛОВОК ОКНА*)

SETMARK(Y,X);i:=0;

WHILE(I<=HIGH(NAME))AND(NAMECIЗФ0С)&(К=WI) DO WPHTE(NAMEL13) ;INC(I)

end;

SETMARK(Y + l,X);I:=0;

WHILE (K=HIGH (NAME) ) & (NAMEE 13^00 & (I ( =WI) DO WPMTE(’-');INC(I) end; end;(*if*)

CPOS:=0;CLINE:=0;

done:=true;

WSTATE:=SETSTATEШOPEN,NEWLINE,PREDELW;

end;(«with*)

END OPENWINDOW;

PROCEDURE CLOSEWINDOW(VAR WIN:WINDOW);

BEGIN

DISPOSE(WIN) END closewindow;

PROCEDURE SETPOS( WIN=WINDOW; LINE,P0S:CARDINAL);

VAR L,P:CARDINAL;

BEGIN

IF WIN=NIL THEN RETURN END;

WITH WIN'"' DO

IF OPEN IN WSTATE THEN

IF LIN!:: >BI...K . ■ I 'MiN . i""BL'<,H ELSE L: "LINE END?

I'7 PCS)BLK.W THEN P: "BL.N.к ELSE P: POS END?

SE THARK(BL К.Y+L,BLK.X+P) ?

CLINE: -L» Г "OS: Г'

END

ENDOW] TH* ■

END SETPOC ;

PROCEDURE GETiCS( WINaWINDOWS VAR LINE,POSsCARDINAL)f

BEGIN IF WIN-NIL T IEN RETURN END?

WITH WIN'4 DO

IF OPEN IN WSTATE THEN !.INE:=CL I NE5 PОS: = СPОS END

ENI.'

END GETPOS?

PROCEDURE CLRLINE( WINsWINDOW; LI NE,POS:CARDINAL ) :

VAR I:CARDINAL?

BEGIN IF WIN=NIL THEN RETURN END;

WITH WIN4 DO

IF OPEN IN WSTATE THEN

IF LINE) BLK.H THEN RETURN END;

IF POS) BLK.W-1 THEN RETURN END;

SETMARK(BEK.Y+LINE, BLK.X+POS) ;

FOR I 8-POS TO BLK.W-1 DO WPHTE (' ’) END;

END

end;(«WITH*) end clrline;

PROCEDURE CLRWINDOW( WI№WINDOW) ;

VAR I:CARDINAL;

BEGIN IF WIN^NIL THEN RETURN END;

WITH WIN'4 DO

IF OPEN IN WSTATE THEN

FOR 1:^0 TO BLK.H-1 DO CLRLINE (WIN, 1,0) END;

CPOS:=0;CLINE: ^ 0

END

END(xWITH*)

END CLRWINDOW;

PROCEDURE WWRITE( WINsWINBOW", CH:CHAR);

const cr=15c;lf=12c;

VAR CARRY:BOOLEAN;

BEGIN

IF WIN=NIL THEN RETURN END;

WITH WIN'4 DO

IF OPEN IN WSTATE THEN

IF CH=CR THEN CPOS:--0; EXCL (WSTATE. OVER) ; RETURN

ELSIE CH-LF THEN CLINE:= (CLINE + 1)MOD(BLK.H) ;

IF PREDEL IN WSTATE THEN CLRLINE(WIN,CLINE,0) END;

RETURN

E L. S E C A R R Y : - (С P О S +1) DIV (В L К . W) > 0 ;

IF" NOT (OVER IN WSTATE) THEN

SETMARK(BLK.Y+CLINE,BLK.X*CPOS); WPHTE(CH);

IF NOT CARRY THEN CPOS:-(CPOS+l)MOD(BLK.W) END;

IF CARRY THEN

IF (NEWLINE IN WSTATE) THEN

ОРИТЕ (70 ", Cl... INE : = (CL. I NE । 1) MOD (DI..K . H) ; CPOS: ^6;

IF" PREDEL IN WSTATE then CLRLINE (WIN»CL I NF, 0; END

ELSE

INCL

END

END

END

END

END(*IF*>

END(*WITH*>

END wwrite;

PROCEDURE WWRITELN ( WIN:WINDOW >;

BEGIN IF WIN=NIL THEN RETURN END;

WWRITE (WIN» 150 ;WWRITE(WINf 120

END wwriteln;

PROCEDURE WWRITELINE ( WI№WINDOW; LIN:ARRAY OF CHAR ) ;

BEGIN

WWRITEARRAY(WINfLIN)

END WWRITELINE?

PROCEDURE WWRITEARRAY( WIN:WINDOW; VAR LIN:ARRAY OF CHAR)»

VAR I:CARDINALf

BEGIN I:=0;

WHILE (K=HIGH(LIN))&(LINCI3i0O DO WWRITE(WIN»LINE 11) ;INC (I) END END WWRITEARRAY;

PROCEDURE CLRD ( LI№CARDINAL );

VAR If J : CARDINAL;

BEGIN

SETMARK (LINfO);

WPHTE(33C) ;ЫРИТЕ(112О

END clrd;

PROCEDURE WREAD ( WIN:WINDOW; VAR CH:CHAR);

BEGIN

IF WIN=NIL THEN RETURN END;

WITH WIN'4 DO

SETMARK(BLK.Y+CLINEfBLK.X+CPOS)

end;(*витх*>

РЕАД(СН);

WWRITE (WINfCH)

END wread;

PROCEDURE WWRITECARD( WIN:WINDOW; X»N: CARDINAL);

VAR I:CARDINAL;

A=ARRAY С0..6Э OF CARDINAL;

BEGIN i:=e;

REPEAT AEI3:=X MOD 10; X: =X DIV 10;iNC(I)

UNTIL X=0;

WHILE N)I DO DEC(N); WWRITE(WINf’ ') END;

REPEAT DEC(I); WWRITE(WINfCHAR(ALI3>60y)) UNTIu I “ 0 END wwritecard;

PROCEDURE WREADCARD( WIN:WINDOW ;VAR X:CARDINAL);

var ch:char;x0:cardinal;

BEGIN

IF WTN=NIL THEN RETURN END;

IF OPEN IN WIN'4. WSTATE THEN

LOOP WREAD(WINfCH)f

IF CH>' ' THEN

IF (CH>:=,0,)^(CH< = ,9,) THEN

X0:=CARDINAL(CH) -60B5WREAD (WIN,CH) 5

X0:=10*X0+(CARDINAL(CH)-60B);WREAD(WIN,CH)

end;(«while*)

X:=X0?

done--true;

ELSE DONE:-FALSE;

end;nextchar:=ch;EXIT

END (*IF*>

END(«LOOP*) END (*IF*) end wreadcard;

BEGIN

5ЕТМ0ДЕ(0 - TRUE)

END WINDOWHANDLER

Статья научная