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.