1、GIS制图实习六实习六 MapBasic入门武汉大学资源与环境科学学院 程雄 王坤一MapBasic编程基础1MapBasic的基本语法规则1MapBasic的注释行:用英文单引号“”来标记注释语句。2程序中可以用大写、小写或混合的方式输入程序。3当一条语句超过一行所允许的长度时,可以把一个语句分成两行或多行书写。4通过Define语句可以定义一个标识符,它等价于一个特殊的值。例如:Define MY_COLOR l6711680Mapbasic.def中用Define语句定义了许多标准MapBasic的标识符。其中包括许多常用的颜色(例如BLACK,WHITE,RED,GREEN,BLUE,
2、 CYAN,MAGENTA和YELLOW) 和其他标识符(例如TRUE,FALSE,RED,GREEN,BLUE和TAB_INF_NAME等),只要在程序开头一般需要输入下语句,就可以任意地使用这些标识符了:Include “mapbasic.def”5Include语句的语法: Include “filename”这里filename是一个包含有MapBasic语句的文本文件。Filename还可以包括一个目录路径。如果没有指定路径,则编译器在当前工作目录寻找该文件,如果没有发现,则编译器又会在MapBasic安装目录下寻找。Mapbasic.def中用Define语句定义了许多标准MapB
3、asic的标识符(例如TRUE,FALSE,RED,GREEN,BLUE和TAB_INF_NAME等)。当开发了越来越多的MgpBasic程序时,会发现某些代码会经常重复使用。就可以写了一个或多个用户函数库(放到一个单独的文本文件中),如果在写的某个MapBasic程序中要使用这些用户函数,可以用Include调用这些用户函数,比如把该文件取名为functs.mb,可以用下面的语句把该函数库合并到程序中:Include “functs.mb”2常量MapBasic的常量有:字符串常量、数值常量、逻辑常量、日期型常量等。(1)字符串常量: 用两个英文双引号括起来表示的,双引号不是字符串的一部分,
4、字符串常量最长可以有65535个字符。(2)数值常量:数值常量又分为整型常数(整型常量)和实型常数(实型常量)。(3)逻辑常量:逻辑常量只有两个值TRUE和FALSE。TRUE为1,FALSE为0。(4)日期型常量: 2003年12月31日可以用两种方法表示。用八位整数“YYYYMMDD”表示,如20031231。也可以用一个字符串表达式“MM/DDYYYY”表示,如12312003。3变量MapBasic的变量分为全局变量和局部变量。全局变量在程序中的任何过程中使用。局部变量只能在定义它的函数或过程中使用。因此,应该尽量使用局部变量。MapBasic关于变量说明及变量赋值的语法规则与其他现代
5、BASIC语言类似。但是,MapBasic比其他BASIC语言支持更多的变量类型。(1)每个变量名必须以字母、下划线“_”或者“”号开头,后面可跟字母、数字、下划线“_”和“#”,变量名最多可以包含31个字符。不能用MapBasic的关键词作为变量名。(2)MapBasic支持以下类型变量,其中包括数值类型、字符类型、对象类型、逻辑型、日期型和样式类型等。MapBasic的变量类型如下:变量类型描述及例子SmallInt范围在-32767 +32767之间的整数,用两个字节存储Integer范围在-2,147,483,647 +2,147,483,647之间的整数,用四个字节存储Float浮点
6、数,用八个字节的IEEE格式存储String变长字符串,最多可有32767个字符String*n定长字符串,n为字符串长度(最多可有32767个字符)Logical逻辑值TRUE或FALSE,用两个字节存放(O为FALSE,非0为TRUE)Date日期型(MM/DD/YYYY),其中两个字节存放年,另两个字节存放月和日Object图形对象,如点(Point)、线(Line)、区域(Region)等Pen线型,如hwypen = MakePen(1,3,BLACK)Brush填充模式,如zbrush = MakeBrush(5,BLUE,WHITE)Font字体,如lbl_font = Make
7、Font(“Helv”,1,20,BLACK,WHITE)Symbol点符号(3)程序中使用的变量都要先声明,然后才能使用,并且要保证声明的类型正确。Dim语句用来声明局部变量。Dim语句的语法形式如下:Dim var_name ,ver_name, As var_type,var_name,ver_name, As var_typeGlobal语句用来声明全局变量,其用法和Dim语句相同。为了便于管理全局变量,可以建立一个定义文件(Globals.def),并在该文件中定义全局变量,然后在程序中用Include语句将全局变量添加到程序中。(4)MapBasic中只能定义一维数组变量,定义数组
8、变量的方法是在变量后面加一对圆括号,圆括号中设定数组长度。如果在定义数组变量时,没有定义大小则不能赋值,必须用ReDim重新定义大小后才能使用。Dim code() As String,I As Integer 定义数组变量Code和整型变量IReDim code(10) As String 定义数组变量Code的大小I=Ubound(code) 获得数组长度10ReDim code(I+10) 数组长度增加到20(5)用Type End Type语句可以定义一个用户数据类型(Custom Date Types)。用户数据类型是一个或多个常规变量类型的组。一般情况下,把Type End Typ
9、e放在程序的开始处。如下例,定义了一个用户数据类型employee,然后把变量manager, staff(10),声明为employee类型,并给变量manager赋值:Type employee name As String title As String id AS IntegerEnd TypeDim manager,staff(10) As employeemanager.name = “Joe”manager.title = “Director of Publications”manager.id = 1112233334表达式表达式是由一个或多个常量、变量、函数、表和运算符组成的
10、式子。表达式即可以简单到用一个常量表达,也可以由多个变量、常量、函数、表和操作符组成。5运算符运算符是作用于一个或多个常量、变量或其他值,从而产生一个结果,它的表达形式可以是一个特殊的字符(如+、*、)、一个词(如:And、Or、Not) 或者是一个词组(如:Contains Part、Entirely Within)。在MapBasic中,运算符报括算术运算符、字符串运算符、日期运算符、比较运算符、逻辑运算符、地理运算符。算术运算符:常用的有:+(加法)、-(减法)、*(乘法)、/(除法)、(整除)、Mod(取余)、(乘方)。字符串运算符:常用的有:+、&、Like。其中:“+”和“&”运算
11、符可以把两个或多个字符串表达式连接成一个更长的字符串表达式。“Like”运算符执行字符串的比较。字符串可以含有通配符“_”,和“%”,其中下划线“_”,表示任意一个字符,而百分号“%”表示任意一个或多个连续字符。日期运算符:常用的有:加号“+”和减号“-”。一个日期型值加上(或减去)一个整数,将返回一个日期型值,表示该日期以后(或之前)的一个日期。两个日期型值相减将返回一个整型值,表示两个日期之间相隔的天数。下面的例子用CurDate()函数确定当前的日期,然后计算出明天的日期tomorrow,一星期后的日期one_week_late以及今天是今年的第几天days_elapsedDim tod
12、ay, tomorrow, next_day As Date,Days_elpsed As IntegertodayCurDate()tomorrow = today+1next_day = today+7days_elapsed = today StringToDate(“1/1”)比较运算符:常用的有:=、=、BetweenAnd比较运算符通过比较两个相同类型的项产生一个逻辑值,TRUE或FASLE。逻辑运算符:逻辑运算符对两个逻辑值进行运算,结果仍产生一个逻辑值。常用的有以下三种: And、Or、Not地理运算符:在MapBasci中,可以使用下列地理运算符对表对象运算,其结果是产生一个
13、逻辑值。运算符 返回TRUE的情况 Contains 第一个对象包含第二个对象的中心Contains Part 第一个对象包含第二个对象的部分Contins Entire 第个对象包含第二个对象的全部Within 第一对象的中心在第二个对象中Partly Within 第一个对象的部分在第二个对象中Entirely Within 第一个对象全部在第二个对象中 Intersects 两个对象相交 运算符的优先级就是指在一个包含多个运算符的复杂表达式中,决定哪一个运算符优先被执行。MapBasic对每一个运算符的优先级进行了规定,在同一行中的运算符的优先级顺序是:最高优先级:圆括号() 乘方 *,
14、Mod, +,-, 字符串连接(+,&) 地理运算符,比较运算符,Like Not And最低优先级:Or当一个表达式中有多个运算符时,优先级高的先处理,优先级低的后处理。一般地,优先级相同的运算符从左到右依次处理,但对于乘方(A),是从右向左运算。例如:赋值语句x = 223给变量x赋的值是256而不是64。6流程控制结构流控制结构语句将影响到程序中语句的执行顺序,MapBasic主要有以下三种类型的流控制结构语句:(1)分支语句(IF.Then、GoTo、Do Case)If.Then语句的语法如下:If if_condition ThenIf_statement_listElseIf e
15、lseif_condition Thenelseif_statement_listElseIfElseelse_statement_listEnd if Do.Case语句的语法如下:Do.Case do_conditionCase Case_exprstatement_listCaseCase Elsestatement_listEnd Case GoTo语句在MapBasic程序运行时,GoTo语句可将跳转到程序中指定的标号行,执行该标号行后的语句,也可以返回到原来的位置执行。GoTo语句要指定一个标号。这个标号必须是在同一过程中的某一行。标号是放在行首的名字,每个标号必须以一个冒号结尾。
16、例如:If ccountNew,打开新的程序编辑窗口。图5-01 MapBasic开发环境(2)在编辑窗口中输入一行MapBasic程序代码,如图5-02所示。图5-02 MapBasic(3)在主菜单中选择File-Save,将该程序保存为一个MapBasic源代码文件,例如first.mb。(4)选择Project-Combile Current File,对程序进行编译。如果编译成功将自动生成一个相应的可执行文件,在本例中为first.mbx;(5)启动MapInfo。选择MapInfo中Tools-Run MapBasic Program,选择编译生成的可执行文件first.mbx,M
17、apInfo将运行该程序,程序运行结果如图5-03所示。(6)或者,在MapBasic中,选择Project-Run系统将自动启动MapInfo系统,并执行刚才生成的可执行文件first.mbx。在这个简单的实例中,演示了MapBasic程序开发基本过程从程序创建、代码输入、编译和运行的全过程。在实际的程序开发中每一步都比实例复杂,下面分步介绍各阶段中常见问题及处理方法。2建立一个项目文件的步骤:选择FileNew打开一个编辑窗口。在编辑窗口中输入下面这一行:Link接着输入这样一行文本Application = appfilename(这里appfilenams是指建立的可执行文件的文件名)
18、。例如:Application = C:MBCODECUSTOM.MBX接着再输入一行文本Module = modulename(这里mdulename是指MapBasic的目标文件名),例如:Module = C:MBCODECUSTOM.MBO请注意文件的扩展名,MapBasic的目标文件的扩展名为.mbo。当多模块项目中的一个单独的模块被编译时,MapBasic就会为它建立一个目标文件。当选择projectCompile Current File时,MapBasic就会试图把当前文件编译成一个可执行文件(扩展名为.mbx)。如果该程序文件调用了不在此文件中的函数或过程,MapBasic则
19、不能建立一个.mbx文件。在这种情况下MapBasic假设它只是一个大项目的一个部分,而把它编译成一个目标文件(.mbo)。另外,当一个程序没有主过程时,MapBasic在编译时也把它编译成一个目标文件。重复第步,直到包括应用程序的所有模块。选择FileSave As保存项目文件。注意在Save As对话框中选择文件类型中的“Project File”(从对话框左下角的文件类型列表中选择),以便使保存的项目文件有扩展名.mbp。最后选择“file-save”命令保存这个工程文件,扩展名为.mbp。现在按照下面的方法来编辑和链接这个工程文件:(1)编译每个在工程文件中使用的模块,选择Projec
20、t菜单中的“compile current file”命令。(2)选择Project菜单中的“select project file”命令,在打开的对话框中,选择一个工程文件,以让MapBasic知道哪个工程文件需要链接。(3)选择Project菜单中的“link current project”命令以完成对应用程序的链接。MapBasic读列在工程文件中的对象文件(.mbo)。若链接无错误,则MapBasic建立一个可执行文件(.mbx);若有错误,则显示错误信息。3. 调试程序调试程序一般是指发现并改正运行错误的过程。有些运行错误很容易纠正,例如由输入错误引起的(原应输入表名“states”而不是“stats”)。但是另外一些错误却很难定位,为了帮助检测和纠正程序中的错误,MapBasic提供了调试程序的工具(Stop和Continue语句)。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1