MapX应用讲义第02章 MapBasic程序设计

上传人:猪** 文档编号:59672629 上传时间:2022-03-04 格式:DOC 页数:57 大小:1.43MB
收藏 版权申诉 举报 下载
MapX应用讲义第02章 MapBasic程序设计_第1页
第1页 / 共57页
MapX应用讲义第02章 MapBasic程序设计_第2页
第2页 / 共57页
MapX应用讲义第02章 MapBasic程序设计_第3页
第3页 / 共57页
资源描述:

《MapX应用讲义第02章 MapBasic程序设计》由会员分享,可在线阅读,更多相关《MapX应用讲义第02章 MapBasic程序设计(57页珍藏版)》请在装配图网上搜索。

1、第2章 MapBasic程序设计62.1 MapBasic程序设计基础62.1.1 MapBasic的基本语法规则62.1.2 MapBasic的数据类型62.1.3 名称72.1.4 常量72.1.5 变量82.1.6 表达式102.1.7 结束程序122.1.8 结束程序并退出MapInfo122.1.9 Define及Include语句122.2 流程控制语句132.2.1 GoTo语句132.2.2 条件语句IfThen132.2.3 Do Case语句132.2.4 ForNext语句142.2.5 DoLoop语句142.3 函数与过程152.3.1 过程152.3.2 函数162

2、.3.3 参数的传递规则172.3.4 事件处理程序182.4 文件的输入与输出192.4.1 顺序文件的操作192.4.2 随机文件和二进制文件的操作212.5 MapBasic程序结构222.6 创建用户界面232.6.1 选单232.6.2 对话框252.6.3 窗口302.6.4 按钮箱(工具箱)322.7 MapInfo表管理342.7.1 打开MapInfo表342.7.2 访问表的指定行列352.7.3 向表中添加记录352.7.4 删除表中指定行362.7.5 创建一个新表362.7.6 修改表结构372.8 获取MapInfo的各种信息382.8.1 表的字段信息(Colum

3、nInfo)382.8.2 地图窗口中的图层信息(LayerInfo)392.8.3 图层中的标签信息(LabelInfo)412.8.4 地图窗口的坐标或距离等信息(MapperInfo)422.8.5 各种对象特性(ObjectInfo)432.8.6 图形对象的坐标或角度等信息(ObjectGeography)452.8.7 区域或折线对象节点的x、y坐标(ObjectNodeX、ObjectNodeY)462.8.8 当前选中对象的各种信息(SelectionInfo)462.8.9 表的各种信息(TableInfo)472.8.10 窗口信息(WindowInfo)482.9 Map

4、Info地图对象的管理502.9.1 对象变量502.9.2 对象列512.9.3 创建新对象512.9.4 合并对象532.9.5 修改对象532.9.6 地图查询542.10 调用动态链接库552.11 运行592.11.1 运行MapInfo选单或工具按钮命令592.11.2 运行MapBasic应用程序和工作空间602.11.3 运行Windows执行程序60第2章 MapBasic程序设计MapBasic是Mapinfo的二次开发语言,它是一种类似Basic的解释性语言,比较适合于扩展Mapinfo功能。本章主要讲述MapBasic编程基本知识及OLE自动化编程需要的最基本的MapI

5、nfo图表操作知识等。2.1 MapBasic程序设计基础 MapBasic中大部分的语句、控制结构、数据类型和标准函数与一般的Basic语言类似。2.1.1 MapBasic的基本语法规则在用MapBasic编程时,应注意以下的基本语法规则:1.注释行 在MapBasic中,用单引号“”来标记注释语句。 对注释行,MapBasic不进行编译,编译时,MapBasic跳过注释行。2.有关语句字母的大小写 在MapBasic中,不区分大小写。但是为了清楚起见,一般把MapBasic语言中的关键词的第一个字母大写,而程序中出现的所有变量都用小写。例如: If N1 then Note “数目太小!

6、” End If3.MapBasic语句行 每个MapBasic过程均由语句行组成。一般一行写一个语句。若语句较长时,可以分两行或多行书写,无需续行符,例如:If (x10)Or (y10) ThenNote “满足条件!” End If4.在MapBasic.def中定义的代码 MapBasic.def是一个文本文件,其中含有标准MapBasic代码的定义。该文件中定义的代码均用大写字母表示,如TRUE、FALSE等。 若应用程序中引用了MapBasic定义的代码,程序的头部必须包含下列语句: Indude MapBasic.def 若无上列语句,则运行将产生一个运行错误。2.1.2 Map

7、Basic的数据类型 在MapBasic中,常用的数据类型有:l SmallInt范围在-32 768+3 2767之间的整数,用2个字节存储,相当于VB中的整型。l Integer范围在-2 147 483 648+2 147 483 647之间的整数,用4个字节存储,相当于VB中的长整型。l Float浮点数,用8个字节的IEEE格式存储。l String变长字符串,最多可有32 767个字符。l String定长字符串,n为字符长度,最多可有32 767个字符。l Logical逻辑值TRUE或FALSE用两个字节存放(0为FALSE,非0为TRUE)。l Date日期型(MM/DD/Y

8、YYY)。l Object图形对象,如点(Point)、线(Line)、区域(Region)等。l Pen线型,如hPen=MabePen(1,3,BLACK)。l Brush填充模式,如hBrush=MakeBrush (4,BLUE,WHITE)。l Font字体,如hFont=MakeFont(Helv,1,20,BLACK, WHITE)。l Symbol符号,如hSymbol=MakeSymbol(40,BLACK,16)。2.1.3 名称 在MapBasic代码中,一个最基本的元素是名称。一个名称可以作为符号常量名、变量名、数据名、过程名与对象名等。 MapBasic按下列规则来构

9、成一个合法的名称:l 以字母开头。l 只允许包含有字母、数字和下横线(_),不允许有其他诸如逗号“,”、句号“。”等标点字符式空格字符。l 长度不能超过31个字符。l 不能用MapBasic的关键词作为变量名。如:If、Then、Select等。l MapBasic不区分名字中的大小写字母。也就是说名字Sum、SUM和sum被认为是同一个名字。 命名时,最好赋予名字有一定的记忆功能,这样可以提高整个程序的可读性。例如:存储总和的变量名可以取为Total_Sum,计数用的变量名可以用Counter等。2.1.4 常量在MapBasic中,可以使用的常量有:直接量、整型常数、实型常数、字符串常量、

10、逻辑常量与日期型常量等6种。1.直接量 在程序中直接出现的数字、字符串,称为直接量。例如下列语句中: MyName=”ZhangSan” Area=3.14159*R*R 其中”ZhangSan”为字符串常量,3.14159是实型常数。2.整型常数在MapBasic中,除习惯采用的十进制整型数外,还可以将整型数表示为十六进制或八进制,十进制整数的表示就是通常的表示法,如57,58就是十进制整型常数。十六进制整数的表示法是在十六进制整数前加上一个&H的前缀。同样,对于八进制整数,其表示法是在八进制整数前加上一个&O的前缀以示区别。下例中,对同一个整数值,分别用3种进制表示,如表2-1所示:表2-

11、1 对同一整型值的3种进制表示十进制整数八 进 制十六进制9&O11&H914&O16&HE3.实型常数实型常数就是带有小数点的数,它有小数表示法和科学记数法2种。l 十进制小数表示法,如3.1416, 0.518。l 科学记数法,如0.2178E+10。4.字符串常量 在MapBasic中,字符串常量是用两个引号()括起来的一串字符。例如”Hello MapBasic!”是一个长度为15的字符串常量。字符串的长度最多可存65 535个字符。 长度为零的字符串称为空串,用表示。空串和空格字符组成的串是有区别的。例如,”其长度为0,而 其长度为3。5.逻辑常量 逻辑常量只有两个值TRUE和FAL

12、SE。TRUE为1,FALSE为0。如果应用程序中使用了TRUE或FALSE,则在程序头中必须包括一个Include语句,例如: Include mapbasic.def Dim ledit as Logical ledit=FALSE6.日期型常量对日期型常量赋值,可以使用以下2种格式。l 格式1: Dim d_enddate as Date d_enddate=19951231l 格式2: Dim d_enddate as Date d_enddate=12/31/19952.1.5 变量 变量是指在程序执行过程中其值随着执行序列而改变的量。程序中的每个变量用一个变量名来识别。MapInf

13、o系统对程序中的每个变量分配一个相应于存储指定的数据类型所需大小的存储空间,来存储变量的值。 MapBasic支持SmallInt、Integer等12种数据类型,参见”2.1.2 MapBasic的数据类型”。在程序中用变量语句来声明变量的类型。常用的变量声明语句有Dim和Global。例如:Dim Conter as Integer下面简述变量的作用范围,以及用得较多的字符串变量、数组变量与用户数据类型。1.变量的作用范围变量的作用域遵循下列规则:l 局部变量:在过程或函数中声明的变量,只在本过程或函数范围内才有效,不能在过程或函数外引用它。用Dim语句声明。l 全局变量:用Global语

14、句,使变量在各个模块中的所有过程或函数中有效。l 当局部变量和全局变量同名时,此时局部变量有效。 下面的程序声明了若干全局变量和局部变量: Dedare Sab MainGlobal gx,gy,gz as Float Sub Main Dim x,y,z As Float End Sub2.字符串变量 MapBasic支持定长和变长字符串。变长字符串变量可以存放任何不超过32 767个字符。定长字符串变量存储指定长度的字符串,当实际字符长度不足时,将在后面补空格。 Dim str1 as strong Dim str2 as strong*10 str1=test str1=test 实际存

15、储为test If str1=str2 Tben Note 不会发生! Elose Note 会发生! End if3.数组变量 MapBasic只支持一维数组,第一个元素的下标为1,最大为32 767。要声明一个数组变量,只要在变量名后加上一个用圆括号括起来的数组长度就可以了,数组长度也可以是一个整型的表达式。如果已经定义了一个数组,而在使用的过程中又发现长度不够,可用ReDim语句扩充数组。Bound()函数返回数组当前的长度。 Dim Counter as Integer Dim strName (5) as string*20 Counter=UBound (strName)获得数组长

16、度 ReDim StrName (Counter+10)增加数组长度105.用户数据类型 用户数据类型是一个或多个常规变量类型的值,用TypeEnd Type语句定义。该语句必须独立于任何一个子过程之外,一般放在程序开始处。 用户数据类型的每一个组件称为一个域,如果要单独使用某一个域值,可以在变量名后面加“.”,再跟上域名。用Type定义一个用户数据类型时,它的每个域可以声明为任何一种数据类型,包括前面已经定义的用户数据类型。 Type TypeDzmL YYYY as small innteger MM as small intteger DD as small integer ML as

17、float Lat as float Lon as float End Type Declare sub Main Dim china ML (100) as Type DzmL sub Main ReDim (200) chinaML(1).lat=30 chinaML(1).lon=115 chinaML(1).ML=3.0 End Type2.1.6 表达式 MapBasic的表达式分算术表达式、关系表达式、逻辑表达式和字符串表达式。1.算术表达式算术表达式由算术运算数(变量或常量)函数的引用和算术运算符加上必要的圆括号构成,如表2-2所示。表2-2 算术运算符及其含义运 算 符运算说明

18、例 子结果(a=10,b=8)+加法X=a+b18-减法X=a-b2*乘法X=a*b80/除法X=a/b1.25整除X=ab1Mod取余X=a Mod b2乘方X=ab100 000 0002.字符串表达式 MapBasic提供两个连接字符串的操作符“+”、“&”和一个比较字符串的操作“Like”。l +两边可以是数字型、日期型或字符串型。l &两边必须是字符串型。“&”还可用来特指一个十六进制数,所以用“&”来连接两个字符串时,必须保证“&”前后各有一个空格。l Like运算符执行字符串的比较字符串也可以会有通配符“-”和“%”,其中下划线“_”表示任意一个字符,而百分号“%”表示一个或多个

19、连续字符。最终表达式返回一个逻辑值,如果字符串匹配成功,返回TURE,否则返回FALSE。3.日期表达式 加号“+”和减号“-”也可用于日期型表达式。一个日期型值加上或减去一个整数,将返回一个日期型值。两个日期型值相减,返回一个整型值,表示两个日期之间的间隔天数。4.逻辑运算符 逻辑运算符对两个逻辑值进行运算,结果仍产生一个逻辑值。l Not逻辑非l And逻辑与l Or逻辑或5.地理表达式该类运算符作用于对象(Object)表达式,其结果将产生一个逻辑值TRUE(-1)或FALSE(0),如表2-3所示。表2-3 地理表达式运算符及其含义运 算 符返回TRUE的情况例 子Containsa对

20、象包含b对象的中心If a Contains b ThenContains Parta对象包含b对象的部分If a Contains Part b ThenContains Entirea对象包含b对象的全部If a Contains Entire b ThenWithIna对象的中心在b对象中If a WithIn b ThenPartly WithIna对象的一部分在b对象中If a Partly WithIn b ThenEntirely WithIna对象全部在b对象中If a Entirely WithIn b ThenIntersectsa对象同b对象相交If a Intersec

21、ts b Then MapBasic允许用等号(=)运算符完成两个对象的逻辑比较(如If object_a=object_b Then)。例如:If Parcel_Objet Within Residential_Zone_Obj Then Note“Your Property is zoned residential End if 也可以把比较运算符用于Select语句的Where子句中作为一个条件: Select * From wetlands Where Obj Contains Part myproject6.关系表达式关系表达式用来比较两个表达式值的大小,或表示相等,其结果为逻辑值T

22、RUE(-1)或FALSE(0),如表2-4所示。表2-4 关系表达式及其含义运 算 符返回TRUE的情况例 子=相等If a=b Then不相等If ab Then小于If a大于If ab Then =小于或等于If a=大于或等于If a=b ThenBetweenAnd值在范围之内If X Between a And b Then 在MapBasic中,字符串比较是不区分大小写的,如果希望在字体中比较时区分大小写,使用StringCompare(),例如: StringCompare(CHINA, china) 在比较定长字符串与变长字符串时,MapBasic自动对定长字符串的不足部分

23、用空格填充。所以在比较时,应把尾部的空格也考虑在内。7.运算符的优先级所谓运算符的优先级就是在一个包含多个运算符的复杂表达式中,MapBasic根据一定规则决定哪一个运算符首先执行,当然可用圆括号改变MapBasic默认的优先级次序。表2-5为运算符优先级表。表2-5 运算符优先级表分 类优 先 级运 算 符说 明算术0()括号1乘方2*、/乘、除3整除4Mod取余5+、-加、减字符串6&、+连接字符串关系7地理运算符各种地理运算=、=等于、不等于、小于小于等于、大于、大于等于Like逻辑8Not非9And与10Or或 由表2-5中的优先级可知,当一个表达式中有各类运算符时,先求算术表达式的值

24、,再求关系表达式的值,然后再求逻辑表达式的值。一般地,优先级相同的运算符从左到右依次处理,但对于乘方(),则是从右向左运算的。例如,x=223的值为256,而不是64。2.1.7 结束程序 End Program语句用于终止MapBasic应用程序,从内存中移去应用程序。2.1.8 结束程序并退出MapInfo End MapInfo语句可以终止MapBasic应用程序,同时退出MapInfo。2.1.9 Define及Include语句 为了使大型应用程序的开发变得更加容易,MapBasic还提供了两个特殊的语句。l Define语句,它可以定义一个容易记忆的标识符,在编译时,这个标识符被它

25、的实际值所代替。 通过Define语句可以定义一个标识符,它等价于一个特殊的值。例如:若程序要处理大量的对象及对象的颜色,例如:值16711680为红色,在程序中可以加入以下语句: Define MY_COLOR 16711680 这个语句定义了一个容易记忆的标识符(MY_COLOR),它对应于数值16711680。定义了该语句以后,在程序中任何需要输入16711680的地方用标识符MY_COLOR来代替。在编译时,MapBasic又会用16711680去代替MY_COLOR。 在MapBasic的标准定义文件mapbasic.def中包含了许多Define语句。其中包括许多常用的颜色(例如B

26、LACK、WHITE、RED、GREEN、BLUE、CYAN、MAGENTA和YELLOW),只要在程序中使用以下语句,就可以任意地使用这些颜色了: Include “mapbasic.def”l Include语句,它可以把两个或多个独立的程序文件组合成一个可编译的程序。 Include语句的语法如下: Include “filename” 这里的filename是一个包含有MapBasic语句的文本文件,而不能是目标文件。filename还可以包括一个目录路径。如果没有指定路径,则编译器在当前工作目录中寻找该文件,如果没有发现,则编译器又会在MapBasic安装目录下寻找。许多MapBas

27、ic应用程序用Include语句去包括一个标准的MapBasic定义文件mapbasic.def: Include “mapbasic.def” mapbasic.def中用Define语句定义了许多标准的MapBasic的标识符(例如TRUE、FALSE、RED、GREEN、BLUE和TAB_INFO_NAME等)。 当开发了越来越多的MapBasic程序时,使用Include语句还可以解决MapBasic编辑器的容量限制问题。2.2 流程控制语句2.2.1 GoTo语句 GoTo语句要使用一个标号。这个标号放在同一过程或函数中。标号是放在行首的名字,每个标号必须以一个冒号结尾。 If x0

28、 Then GoTo Label1 End if Label1: 虽然MapBasic提供了无条件转移语句GoTo,但一般不要使用。因为它使程序结构变得不易读懂,所以,除非万不得已,否则应尽量避免使用GoTo语句。2.2.2 条件语句IfThen使用IfThen条件语句时,可能有以下3种方式。(1) 条件语句1If x0 Then Note x小于0End if(2) 条件语句If x Then Notex小于0Else Notex不小于0End if(3) 条件语句3If x0 Then Note x小于0Else If x10 Then Note x小于10Else Note x大于等于1

29、0End if 从上面的举例中可以看出,IfThen语句中可包括一个或多个Else If语句,一个Else语句。如果想测试多于两个或3个以上不同的条件,使用下面将要介绍的Do Case语句将会更方便。2.2.3 Do Case语句 IfThen语句可以实现多分支结构的程序。它是在执行过程中,逐一测试条件,决定程序的执行路线,显然效率会受到影响。对于测试一个条件,实行多分支转向的情况,Do Case语句更有效。Do Case x Case 1 Case 2,3,4 Case 5,6,7 Case Else Endd Case2.2.4 ForNext语句 ForNext语句建立一个执行特定次数的

30、循环。每执行一次循环,MapBasic执行For与Next语句之间的全部语句;每执行一次循环,MapBasic自动使计数器增加一个步长值,默认的步长是1。为了使用不同的步长,可以在ForNext语句中增加可选的Step语句。(1) 默认的步长1For I=1 to 12 Next I(2)给定步长For I=1 to 12 Step 2 Next I2.2.5 DoLoop语句 在程序设计中,当循环次数不能事先确定,而必须在程序执行过程中根据判断某一条件的成立与否来决定是否重复执行或退出循环时,使用DoLoop可以很好地解决此类问题,其格式有两种:1.在循环项部进行判断时的格式 其格式是:Do

31、While|Until条件表达式 语句块 Exit Do 语句块Loop其中:l 条件表达式:是一逻辑表达式,表示循环执行的条件。l Exit Do: 与Exit for类似,这是一个只能用于DoLoop结构中的句子,它为跳出Loop循环提供一种方法,通常根据某一条件的成立与否来决定是否跳出循环。Exit Do语句常与IfThen语句联合使用。执行Exit Do语句后,将控制转移到紧接在Loop语句之后的语句上。Exit Do语句是可选的,并且可以放在DoLoop循环中的任何位置。 Do while条件表达式Loop语句是当条件成立时,执行循环体内的语句,直到条件不成立时终止循环。而Do Un

32、til条件表达式Loop语句恰好与此相反,是条件不成立时执行循环体语句,直到条件成立时退出循环。所以:Do Until条件表达式语句块 Loop等价于Do while Not条件表达式语句块Loop2.在循环底部进行判断时的格式其格式是: Do 语句块 Exit Do 语句块 Loop while|Until条件表达式 同样,它分别可写成: Do 语句块Loop while条件表达式与 Do 语句块Loop Until条件表达式 While条件表达式与Until条件表达式在逻辑流程上正好相反,所以 Do 语句块Loop Until条件表达式等价于Do 语句块Loop while Not条件表达

33、式2.3 函数与过程 在MapBasic程序中,过程分为事件过程和通用过程两类。当窗体或控件上某一事件发生时,相应的事件过程就会被激活。事件过程还可以调用其他过程(包括通用过程或事件过程)通用过程只有在当前应用程序调用它时才执行。 通用过程中包括以Sub开头的过程和以Function开头的函数。2.3.1 过程1.主过程与子过程 每一个MapBasic程序至少有一个主过程,一个或多个子过程。当运行一个MapBasic应用程序时,MapBasic自动调用该应用程序的主过程。 Sub过程的具体结构与句法如下。 Sub 过程名(参数表) 变量声明语句 可执行语句块 Exit Sub 可执行语句块 E

34、nd Sub 语句Sub过程名(参数表),声明了一个过程的开始。End Sub语句表示一个Sub过程的结束。每个Sub过程都必须以语句Sub过程名开始,以End Sub结束。 过程名由用户给定。过程名的组成规则同变量名的组成规则一样。给过程取一个具有相应意义的名字,以提高程序的可读性。 Declare Sub Main Sub Main Note Hello一无所有! End SubDeclare Sub语句告诉MapBasic下面将定义一个主过程或子过程。程序中的每一个过程都必须有一个Declare Sub语句,并且Declare Sub语句必须出现在过程实际定义之前。一般Declare语句

35、出现在程序的开始处。2.过程的调用 Declare Sub Main Declure Sub HaveNo Declare Sub HareMoney (nMorey as integer) Sub Main Dim Money as integer Money=0 Call HaveNO Money=100 Call Have Money (Money) End Sub Sub HaveNo Note 你一无所有!End SubSub Have Money (nMoney as Integer) Note 你有 nMoney 万!End Sub2.3.2 函数 MapBasic支持多种不同的

36、函数。有标准Basic函数(例如ASC()、Format()、Val()等)以及MapInfo或MapBasic特有的函数(例如Distoncel()、ObjectGoography()等)。除此之外,MapBasic还可以让用户自定义函数,一旦定义,就可以像MapBasic标准函数一样使用。用户函数是用FunctionEnd Funetion结构来定义的,其具体结构及语法如下:Function函数名(形式参数表)as类型 变量声明语句 可执行语句块 函数名=表达式 Exit Function 可执行语句块 函数名=表达式End Function 其中:l 语句Function函数名(形式参数

37、表)As类型和语句End Function分别表示函数过程的开始与结束。l 形式参数表与Sub过程相同。l 函数名由用户给定。l As类型语句说明函数的返回值的类型。如果省略,则其返回值的类型为Variant(可变类型)。l 在函数体的可执行语句中,至少一定要有一句如下形式的赋值语句: 函数名=表达式 以便将函数体执行或求得的最终函数值,通过这一赋值语句传递给调用程序。Declare Sub MainDeclare Function HareNoDeclare Function HareMoney (nMoney as integer) as integerSub MainDim Money

38、as integerMoney=HaveNoMoney=HaveMoney(100)End SubFunction HaveNO() as integerHaveNO=0End FunctionFunction HaveMoney (nMorey as Integer)as integer Have Money=nMoney10End Function2.3.3 参数的传递规则 MapBasic提供按引用传递和按值传递两种参数传递机制。1.形式参数传递在默认情况下,MapBasic过程参数是以形式参数的方法传递的。使用形式参数应遵循以下规则:l 在Call语句中必须指定一个变量名作为形式参数。

39、l 如果被调用的子过程赋了一个新的值给形式参数,那么这个新的值将自动保存到调用者的变量中。2.值参数传递MapBasic可以通过值参数而不是形式参数来传递过程参数,为了说明参数是按值传递的,必须在Declare语句和SubEnd Sub语句中使用关键词ByVal,使用按值参数传递应遵循以下规则:l 在Call语句中不一定要为参数指定一个变量名。可以指定一个变量名、常量值或是其他的表达式。l 如果在子过程中赋予一个新的值给值参数,将不影响调用者。也就是说,子过程不能通过值参数把一个值返回给调用者。下面的例子显示一个含有两个日期型值参数的过程:display_date_rangeDeclare S

40、ub MainDeclare Sub display_date_rang (ByVal start_date As Date, By Val end_date As Date)Sub MainCall display_date_range(1/1/, CurDate()End SubSub display_date_range(ByVal start_date As Date, Byval end_date As Date)Note The report date range will be:+Str$(start_date)+through+Str$(end_date)=.End Sub 在

41、这个例子中两个参数都是值参数,因此当主过程调用过程display_date_range时, Call display_date_range(1/1, CurDate()两个参数都不需要一个日期型变量。第一个参数(“1/1”)是一个日期型常量表达式,第二个参数也是一个日期型函数构成的表达式。2.3.4 事件处理程序有些过程名有特殊的含义,如Main,这是因为MapBasic在运行应用程序时会自动调用主过程Main()。除Main以外,MapBasic还有许多特殊的过程,例如:EndHandler、ForegroundTaskSwitchHandler、RemoteMsgHandler、SelCh

42、angedHandler、ToolHandler、WinClosedHandler,以及WinChangedHandler等。l EndHandler:在应用程序中断时或用户退出MapInfo时被调用。l ForegroundTaskSwitchHandler: 当MapInfo由在后台执行转为在前台执行时,或由在前台执行转为在后台执行时被调用。l RemoteMsgHandler: 在一个进程对话中,当应用程序正作为服务器方,而远端的客户机送出了一个执行指令时被调用。l SelChangedHandler:当选择表改变时被调用。l ToolHandler :当用户用鼠标在地图窗口、浏览窗口或

43、布局窗口中单击时被调用。l WinChangeHandler: 当用户平移、滚动或复位在地图窗口中显示的区域时被调用。l WinClosedHandler:当用户关闭地图窗口、浏览窗口、统计窗口或布局窗口时被调用。l WinFocusHandler:当一个窗口被激活为活动窗口时被调用。一般情况下,我们不需要用Call语句去专门调用以上特殊过程。如果程序中包含有这样的过程,当某一类型的系统事件发生时,MapBasic将会自动调用相应的过程。 在下面的例子中定义了一个特殊的事件处理程序ToolHandler。在这个程序中不包含任何Call语句,一旦运行这个程序段,并且当用户选择了MapBasic工

44、具在地图窗口、浏览窗口或布局窗口中单击时,MapBasic自动调用过程。ToolHandlerInclude mapbasic.def Declare Sub Main Declare Sub ToolHandler Sub Main Note 选择MapBasic工具(+),在地图上点击输出该点坐标End SubSub ToolHandlerIf WindowInfo(Front Window WIN_INFO_TYPE)=WIN_MAPPER ThenPrint X:+str$(CommandInfo(CMD_INFO_X)Print Y:+str$(CommandInfo(CMD_INF

45、O_Y)End IfEnd Sub 在一个系统事件处理程序中,可以调用CommandInfo函数以获得更多的影响MapInfo事件的信息。例如,在上例中就是用CommandInfo()函数得到鼠标单击处的坐标。2.4 文件的输入与输出 文件的输入/输出是指从一个文件中读取信息或把信息写到文件中的过程。 MapBasic有种不同类型的文件用于访问,它们是顺序文件、随机文件和二进制文件。l 使用顺序文件的输入/输出语句可以访问一个可变长文本文件。l 使用随机文件的输入/输出语句可以访问固定长度的文本文件。如果一个文件的每一行都固定为某一长度,这种文件为固定长文件,可以用随机文件的输入/输出语句访问

46、该类文件。l 使用二进制文件的输入/输出语句可以访问一个二进制文件(非文本文件)的数据。如果使用二进制文件方式存储数据到一个文件中,MapInfo将把这些数据以更有效的存储格式存储。二进制文件的数据不能用文本编辑器来浏览和编辑。但比起文本文件来,它提供了更为有效的存储方式,同时其读取效率更高。2.4.1 顺序文件的操作 在Visual Basic中,提供下列语句和函数对顺序文件进行读/写操作。l 输入(读):Input #语句,Line Input #语句和Input$函数。l 输出(写):Print #语句和Write #语句。1. 顺序文件的写操作 对于顺序文件,可用Print #语句和W

47、rite #语句进行写(文件)的操作。通常,对于各类数据的输出用Write#语句,而Print#语句则适合用于输出文稿。(1)Write #语句 Write #语句的格式如下: Write #文件号,表达式其中:l 文件号是由Open语句以Output,Append模式打开顺序文件时的文件号。文件号前的“#”不能省略。l 表达式是以逗号“,”分隔的数字与/或字符串表达式。如果在Write #语句中省略了表达式,则它向文件输出一空行。 Write #语句将表达式表中指定的数据写到文件中去,并自动在各数据项之间插入一个逗号”,”在字符串的前后各加一双引号(”)。当写完最后一数据项后,插入一个换行字

48、符。(2)Print #语句 Print #语句的格式如下: Print #文件号,Spc(n)|Tab(n)表达式;|, 其中:l 文件号是由Open语句打开顺序文件时的文件号,它可以是一个整型数或一整型表达式。文件号前的数字符号#不能省略。l Spc(n)是Basic函数名,可选择使用,它在输出序列中插入n个空格。l Tab(n)是Basic函数名,可选择使用,它把表达式置于第n列输出l 表达式是以“;”或“,”分隔的数字和/或字符串表达式。l ;|,中分号(;)或逗号(,)是决定下一个表达式的字符输出的位置。分号(;)表示下一表达字符紧接在上一项的最后一个字符之后输出;逗号(,)表示下一

49、项输出到下一个区之中,如果既无“;”也无“,”则下一个字符输出到下一行之中。 如果省略表达式,则输出一空行,但文件号后的一个逗点(,)必须有。因为Print #语句是直接将数据写到文件上的,所以为了使其输出正确,适合Input #语句输入,用户必须人为地在各数据项之间加上分隔符。例如: A$=Name:A$=English:B%=5 Print#1,Chr$(34); A$;Chr$(34);,;Chr$(34);B$;Chr$(34);,;B% 其结果为 Name,English,52.顺序文件的读操作对于顺序文件常用Input #语句和Line Input #语句进行读操作。Input #

50、语句可与Write #语句匹配,读入由Write #语句建立的数据文件中的数据。而Line Input#语句适合于读一行文本文件。(1)Input #语句 Input #语句从顺序文件中读入数据并分别赋给相应的变量。其格式如下: Input #语句文件号,变量表其中:l 文件号是由Open语句以Input模式打开的顺序文件的文件号。它可以是整型常数或整型表达式,文件号前的号码符#是必须的。l 变量表是用逗号“,”分隔的变量名。变量表中的变量不能是数组名,但可以是数组元素;不能是用户定义类型的变量名,但可以是其中的一个成员名。除对象类型变量外,可允许其他各种类型的变量名。变量表中的变量类型与文件

51、中数据项的类型必须一一对应匹配。如果两者不匹配,则将产生不可预计的结果。 对于数字型变量,在文件中第一个遇到的非空字符被认为是数字的开始,而遇到空格或逗号“,”或行结束符,则表示数字结束。空行按零处理。如果遇到无效数据,则将零赋给变量。 对于字符串类型的变量,在文件中遇到第一个非空字符被认为是字符串数据的开始。如果第一个非空字符是双引号,那么这一双引号被忽略而其后的所有字符,包括空格字符在内都作为字符串变量的数据读入字符串变量之中,直至遇到另一个双引号为止。不用双引号括起来的字符串,以空格、逗号或行结束符表示字符串结束。遇到空行则输入一空串(长度为0的字符串)。输入文件中的数据应按下列规则保存

52、:l 数字型数据之间用空格或逗号或行结束的分隔。l 字符串数据之间也用空格、逗号或行结束符分隔。如果字符串中包含有空格、逗号等字符,那么这个字符串数据可用双引号括起来,以保证空格、逗号作为字符串中的一个字符输入,而不是作为分隔符。l 遇到空行,对于数值类型变量则输入一个零值;对于字符串类型变量则输入一个长度为零的字符串。由上述规则可见,用Write #语句输出而构成的数据文件,正是用Input #语句读入数据文件的格式。所以这一对语句可以用来作为处理顺序文件的数据输入/输出使用。(2)Line Input #语句Line Input #语句从顺序文件中读入一行并赋给字符串变量。其格式如下:Li

53、ne Input #文件号,变量名其中:l 文件号是用Open语句打开的顺序文件的文件号,可以是整型数或整型表示式。文件号前的#是必须的。l 变量名是能接纳一行文本的字符串变量名。Line Input #语句一次读入一行文本。3. 顺序文件的输入/输出示例l 输出文件 Dim TXT as string, x as float, y as float TXT=Beijing x=35.0 y=115.0 Open C:Test.dat For output As #1 Write #1, txt, x, yClose(1)l 追加文件 Dim TXT as string, x as flout

54、, y as flout TXT=WuHan x=32.1 y=114.5275 Open C:Test.dat For Append As #1 Write #1, TXT, x, y Close(1)l 读入文件 Dim TXT as string, x as flout y as flout Open C:Test.dat For Input As #1 Input #1, TXT, x,y Close(1)2.4.2 随机文件和二进制文件的操作随机存取文件和二进制文件都用Get和Put语句进行读/写。1. Open语句使用如下所示的语句打开随机存取文件:Open File cydata

55、.txt For RANDOM As #2 Len=42使用如下所示的语句打开二进制文件存取文件:Open File czdata.bin For BINARY As #3打开文件后,就可以用Get和Put语句对文件进行读写操作。2. Get语句 Get语句从磁盘文件读入数据并赋给变量。其格式如下:Get #文件号,记录号,变量名其中:l 文件号:是一由Open语句打开文件时的文件号,可以是整数型或整型表达式;l 记录号:其最大记录号为-1(即2147483647)。对于用Random模式打开的文件,记录号是被读入记录的号码; 对于用Binary模式打开的文件,记录号是开始读入的字节位置。Bi

56、nary模式文件的第一个字节的位置是1,第二个字节的位置是2,依此类推。如果Get语句中省略记录号,就对前一Get或Put语句之后的记录或字节位置进行Get操作。尽管可以省略记录号,但Get语句中的两个逗号“,”仍然必须保留。例如: Get #1,FileBufferl 变量名:用来接受从文件中读入数据的变量。除对象和数组名外,其他任何类型的变量都可以。3. Put语句 Put语句将变量的内容写(输出)到磁盘文件中。其格式如下:Put #文件号,记录号,变量名其中:l 文件号:是用Open语句打开文件时的文件号,可以是一个整型数或整型表达式。l 记录号:最大记录号为-1 (即2 147 483

57、 647)。对于用Random模式打开的文件,记录号表示被写出记录的号码;对于用Binary模式打开的文件,记录号表示开始输出的字节位置(见Get语句)。如果Put语句中省略记录号,就对前一Get或Put语句之后的记录或字节位置进行Put操作。尽管可以省略记录号,但Put语句中的两个逗号(“,”)必须保留。l 变量名:要写到文件中去的变量,除对象变量和数组名(整个数组)外,任何类型的变量名和数组元素名均可出现在Put语句中。2.5 MapBasic程序结构MapBasic程序中的语句必须以一个特定的方式被安排,而不是任意的。例如:Global语句不能放在SubEnd Sub结构中,下面给出MapBasic程序中由不同语句、函数及过程组成的典型示例:全局级的语句出现在程序的顶部Include “MapBasic.def”其他的Include语句TypeEnd Type语句Declare Sub语句Declare Function语句Define语句Global语句接下来是主程序定义Sub MainDim 语句End

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!