Библиотечный модуль WIN-DOWHANDLER
Бесплатный доступ
В докладе описывается библиотечный модуль 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