MỘT VÍ DỤ MINH HỌA CHO VIỆC SỬ DỤNG BỘ NHỚ

Một phần của tài liệu giao trinh pascal (Trang 26 - 29)

VIII. TRUY XUẤT VÙNG NHỚ MAÌN HÌNH

4.MỘT VÍ DỤ MINH HỌA CHO VIỆC SỬ DỤNG BỘ NHỚ

Một trong số các ứng dụng thường dùng của các tiện ích truy xuất bộ nhớ đó là quan tâm đến bộ nhớ màn hình trong các tiện ích tạo giao diện. Minh họa sau đây là tạo cửa sổ, hoặc một ô có bóng mờ bằng cách sử dụng truy xuất bộ nhớ. Sau đây là listing chương trình.

{--- }

{Chương trình minh họa tạo cửa sổ có bóng mờ } {sử dụng phương pháp truy xuất bộ nhớ } {--- }

{--- } PROGRAM Windows_with_Shade;

CONST

ShdOn : Boolean = TRUE; ShdOff: Boolean = FALSE; ShdX : Byte = 2;

ShdY : Byte = 1;

ShdAttr: Byte = $07; {ký tự xám trên nền đen } Function VidSeg: Word; {218 196- 191 179 217 192 } Begin if Mem[$0000:$0449] = 7 then VidSeg := $B000 else VidSeg := $B800; End;

Function VidOfs(Col, Row: Byte): Word; Begin

case Mem[$0000:$0449] of

0,1: VidOfs := 2*(Col-1) + 80*(Row-1); else VidOfs := 2*(Col-1) + 160*(Row-1); end;

End;

Procedure WriteCh(x,y,Attr,Len: Byte; Ch: Char); Var Vseg, Vofs: Word;

i: Byte; Begin

Vseg:=VidSeg;

Vofs:=VidOfs(x,y); for i:=1 to Len do begin

MemW[VSeg:VOfs]:=(Attr SHL 8)+Ord(Ch); Inc(VOfs,2);

end; End;

Procedure WriteSt(x,y,Attr: Byte; S: String); Var Vseg, Vofs: Word;

i: Byte; Begin

Vseg:=VidSeg;

Vofs:=VidOfs(x,y);

for i:=1 to Length(S) do begin

Inc(VOfs,2); end;

End;

Procedure WriteStC(x1,y,x2,Attr: Byte; S: String); Var x: Byte;

Begin

x:=((x1+x2) div 2) - (Length(S) div 2); WriteSt(x,y,Attr,S);

End;

Procedure SetAttr(x1,y1,x2,y2,Attr:Byte); Var Vseg, Vofs: Word;

x,y: Byte; Begin Vseg:=VidSeg; Vofs:=VidOfs(x,y); for y:=y1 to y2 do for x:=x1 to x2 do begin Vofs:=VidOfs(x,y); Mem[VSeg:VOfs+1]:=Attr; end; End;

Function Replicate(Ch: Char; N: Byte): string; Var temp: string;

Begin

temp:='';

while Length(temp) < N do temp:=temp+Ch; Replicate:=temp;

End;

Procedure BoxSh(x1,y1,x2,y2,Attr: Byte; Shd: Boolean); Var k: Byte;

Begin

if Shd then

SetAttr(x1+ShdX,y1+ShdY,x2+ShdX,y2+ShdY, ShdAttr); WriteSt(x1,y1,Attr,#218+Replicate(#196,x2-x1-1)+#191); for k:=y1+1 to y2-1 do

WriteSt(x1,k,Attr,#179+Replicate(#32,x2-x1-1)+#179); WriteSt(x1,y2,Attr,#192+Replicate(#196,x2-x1-1)+#217); End;

Procedure WinSh(x1,y1,x2,y2,Attr: Byte; Tit: String; Shd: Boolean);

Begin

BoxSh(x1,y1,x2,y2,Attr,Shd); WriteStC(x1,y1,x2,Attr,Tit);

End; BEGIN

{ $1F : White/Blue }

BoxSh(15,8,65,18,$7F,ShdOn);

WinSh(6,6,50,16,$4F,' Window #2 ',ShdOn); WinSh(15,12,55,22,$1F,' Window #3 ',ShdOn); ReadLn;

END.

Một phần của tài liệu giao trinh pascal (Trang 26 - 29)