DBASEⅢ的图形功能

Author: 成都 李亚冰 Date: 1994-07-29

        一、未公布的命令和函数
        ①SET SEGMENT TO〈段地址〉
        其功能是定义系统分配给屏幕缓冲区内存的段地址,地址随显示卡的类型而不同,CGA卡的段地址为47104(B800H),EGA/VGA的段地址为40960(A000H)。
        ②POKE〈屏幕地址〉,〈数据〉
        将数据写入指定的屏幕地址。
        ③〈屏幕地址〉
        读取指定屏幕地址的数据。
        其中段地址、屏幕地址和数据均为十进制。
        二、屏幕地址的分析
        在CGA显示器图形方式下,分辨率为640×200,段地址为47104。写入屏幕的图象就由数据1_256决定。整个屏幕显示分为1_4个逻辑行,第一逻辑行的地址为0_7999,第二行的地址为8192_16191,第三行的地址为16384_24383,第四行的地址为24576_32575,四个逻辑行可控制整个屏幕。物理行水平640个点分为80个图形单位其第一行的屏幕地址为0_80,第二行的屏幕地址为8192_8271,第三行为16384_16463,第四行为24567_32575,而第五行实际上是第一逻辑行的延续,其地址为80_159,所以,以此类推,可得知整个屏幕中地址与图象位置的关系。
        在VGA彩色显示卡的图形方式下,情况就十分简单,其段地址为40960,整个屏幕只有一个物理行,其地址为80_298144,每行80个图象单位,整个图像的面积可覆盖26行汉字系统的提示行以上的全部区域,甚至如果增大图象地址的值,图像单位可覆盖提示行。
        三、DBASEⅢ图形功能的应用
        以上已经简单说明了DBASEⅢ的图形功能,以下可运用此功能来作图,我们可以编一个命令文件直接从数据库中读取数据,绘制精确的直方图。
        此程序为CGA模式下的作图程序,先建立一个文件名为CZ.DBF的数据库,其结构很简单,只有年份和产值两项,程序清单如下。本程序在IBM PC,386机上运行通过。
        SET TALK OFF
        CLEA
        SET SEGMENT TO 47014                     &&设置CGA的段地址
        N=6495
        M=0
        DO WHILE M<50
        STOR "POKE"+STR(N)+",128" TO P1   &&写一逻辑行
        STOR "POKE"+STR(N+8192)+",128" TO P2  &&写二逻辑行
        STOR "POKE"+STR(N+16384)+",128" TO P3  &&写三逻辑行
        STOR "POKE"+STR(N+24576)+",128" TO P4  &&写四逻辑行
        N=N-80                               &&"128"为一点
        M=M+1
        &P1
        &P2
        &P3
        &P4
        ENDDO
        L=6495
        DO WHILE L<6535
        STOR "POKE"+STR(L+24576)+",255" TO P5   &&画一水平线
        &P5
        L=L+1
        ENDD
        @ 1,24 SAY "各年产值直方图"
        @ 5,13 SAY"产值"
        USE CZ
        GO TOP
        DO WHILE .NOT. EOF()
        X=0
        Y=6495+RECNO()*7
        @ 5,21+(RECNO()-1)*7 SAY 年份
        @ 9,21+(RECNO()-1)*7 SAY 产值
        STOR 产值 TO C
        DO WHILE X<C
        STOR "POKE"+STR(Y)+",255" TO P6
        STOR "POKE"+STR(Y+8192)+",255" TO P7
        STOR "POKE"+STR(Y+16384)+",255" TO P8
        STOR "POKE"+STR(Y+24576)+",255" TO P9
        Y=Y-80
        X=X+1
        &P6
        &P7
        &P8
        &P9
        ENDDO
        SKIP
        ENDD
        RETU
        
        (成都 李亚冰)