1、第9章 MapBasic编程,9.1 制作菜单栏9.1.1 制作全新的菜单栏 9.1.2 修改已有菜单栏 9.2 菜单制作 9.2.1 全新菜单的制作9.2.2 更改原有菜单 9.3 对话框制作 9.3.1 标准对话框,9.3.2 自定义对话框制作 9.3.3 控件的位置和大小9.3.4 控件类型 9.3.5 控件的初值和终值 9.4 窗口9.4.1 窗口的大小和位置 9.4.2 地图窗口 9.4.3 浏览窗口,9.4.4 统计窗口9.4.5 布局窗口 9.4.6 信息窗口 9.4.7 消息窗口 9.5 工具条 9.5.1 工具条的类型 9.5.2 工具条的操作9.5.3 创建触发式型按钮 9
2、.5.4 创建工具按钮 9.5.5 向“主”工具条添加一个 按钮 9.5.6 选择按钮图表 9.5.7 运行MapBasic应用程序,9.6 MapBasic过程 9.6.1 MapBasic主过程9.6.2 MapBasic子过程 9.7 MapBasic变量 9.8 MapBasic的表达式 9.8.1 MapBasic的函数9.8.2 MapBasic的运算符 9.9 分支、循环和其他流程控制 9.9.1 分支语句 9.9.2 循环语句 9.9.3 其他流程控制语句 9.10 MapBasic的表操作 9.11 习题9,9.1 制作菜单栏,菜单栏是MapInfo工作区域顶部的水平条,初始
3、状态下的MapInfo的菜单栏包括“File”,“Edit”,“Objects”,“Query”等。,9.1.1 制作全新的菜单栏,语法:Create Menu Bar As 菜单名 或 ID 菜单号 ,菜单名 或 ID 菜单号.,【例9-1】制作一个全新菜单栏,包含“File”,“Edit”,“Query”,“Map”,“Browse”菜单。代码如下:Create Menu Bar As “File“,“Edit“,“Query“,“Map“,“Browse“图9-1 全新菜单栏,9.1.2 修改已有菜单栏,1. 删除菜单 语法:Alter Menu Bar Remove菜单名 或 ID 菜
4、单号 ,菜单名 或 ID 菜单号. 【例9-2】在原有菜单栏的基础上,删除“Windows”,“Help”菜单。,代码如下: Alter Menu Bar Remove ID 6, ID 7 图9-2 删除菜单,2. 增加菜单 语法: Alter Menu Bar Add 菜单名 或 ID 菜单号 ,菜单名 或 ID 菜单号. 【例9-3】在原有菜单栏的基础上,增加“DataEntry”菜单。 代码如下: Alter Menu Bar Add “DataEntry“,图9-3 增加菜单 图9-4 在菜单栏中间增加菜单,3. 恢复菜单语法:Create Menu Bar As Default若放
5、弃对菜单栏的修改,恢复原有菜单样式,可以运行以下代码:Create Menu Bar As Default,9.2 菜单制作,9.2.1 全新菜单的制作语法: Create Menu 新菜单名 ID 菜单号As 菜单项1 ID菜单号 Calling handler | As 菜单名 ,菜单项2.,【例9-4】制作全新菜单“DataEntry”。代码如下:Create Menu “DataEntry“ As 制作“DataEntry”菜单“Add“ , 菜单有三个菜单项“Edit“ ,“Delete“ Alter Menu Bar Add “DataEntry“ 将菜单添加到菜单栏中图9-5 制
6、作全新菜单,9.2.2 更改原有菜单,语法: Create Menu 新菜单名 ID 菜单号As 菜单项1 ID菜单项 Calling handler | As 菜单名,菜单项2. 【例9-5】更改原有菜单“File”的内容。代码如下: Create Menu “&File“ As“&New“ ,“&Open“ ,“&Close“ ,“&Save“ ,“&Print“ ,“&Exit“,图9-6 更改原有菜单,9.3 对话框制作,9.3.1 标准对话框 1. 消息对话框语法: Note 消息 图9-7 消息对话框 【例9-6】例如显示一个“查询成功!”的消息对话框。代码如下:Note “查询成
7、功!“,2. 询问对话框语法: Ask (提示信息,确定文本,取消文本) 【例9-7】下面的例子用生成一个简单询问对话框。 Dim more As Logical more = Ask(“Do you want to continue?“, “OK“, “Stop“)运行结果如图9-8所示。 图9-8 询问对话框,3. 选择文件对话框语法:FileOpenDlg(路径,文件名,文件类型,标题) 【例9-8】下面的程序用FileOpenDlg()函数显示提示用户打开一个文件的对话框。Dim s_filename As Strings_filename= FileOpenDlg(“,“,“TAB“
8、,“Open Table“)运行结果如图9-9所示。,图9-9 选择文件对话框,9.3.2 自定义对话框制作,【例9-9】下面是生成一个自定义对话框的代码: Dialog title “按省份名“ Control Statictexttitle “请输省份名:“ Control Edittext Control Okbutton Title “确定“ Control Cancelbutton Title “取消“,图9-10 自定义对话框图9-11 指定位置和大小,9.3.3 控件的位置和大小,控件的大小由Width(宽)和Height(高)控制。位置和大小采用对话框单位为单位,每个对话框单位
9、表示一个字符宽度的1/4或一个字符高度的1/8,以对话框的左上角为原点,它的位置是(0,0)。【例9-10】下面的例程指定了控件的位置及大小。Dialog Title “按省份名“ Control StaticText,Title “请输省份名:“Control EditText Control OkButtonWidth 20Height 12 Title “确定“Position 60,32Control CancelButtonWidth 20Height 12 Title “取消“Position 100,32运行结果如图9-11所示。,9.3.4 控件类型,1. 静态文本控件 语法:
10、Control StaticText Position x , y Width宽度 Height高度 ID控件号 Title标题,【例9-11】下面是生成一个静态文本控件的代码:DialogControl StaticText Title “Enter map title:“ Position 5, 10Control OkButton 图9-12 静态文本控件 Control CancelButton运行结果如图9-12所示。,2. 输入文本控件语法:Control EditText Position x , y Width宽度 Height高度 ID控件号 Value 初始值 Into变量
11、 【例9-12】下面是生成一个输入文本控件的代码:DialogControl EditText,Control OkButtonControl CancelButton运行结果如图9-13所示。图9-13 输入文本控件,3. 组合框控件语法:Control GroupBox Position x , y Width宽度 Height高度 Title标题 【例9-13】下面是生成一个组合框的代码:DialogControl GroupBox Title “Level of Detail“,Position 5, 30Height 40 Width 70Control OkButtonContro
12、l CancelButton 运行结果如图9-14所示。 4. 单选项组合控件 语法:Control RadioGroup 图9-14 组合框控件 Position x , y ID控件号 Calling过程 Title 字符串表达式 或 From Variable 字符串变量, Value初始选项 Into变量 【例9-14】下面是生成一个单选项组合控件的代码:DialogControl RadioGroup Title “&Partial Details“ Position 15, 42 Control OkButtonControl CancelButton运行结果如图9-15所示。,5
13、. Picker选取对象类控件 语法:Control PenPicker 或 BrushPicker 或 SymbolPicker 或 FontPicker Position x , y Width 宽度 Height 高度 ID控件号 Calling过程 Value样式表达式 Into样式变量,【例9-15】下面是生成一个文本选取控件的代码:DialogControl FontPicker Position 140,42 Control OkButtonControl CancelButton运行结果如图9-16所示。图9-16 文本选取控件,6.ListBox列表框控件 语法:Contro
14、l ListBox Position x , y Width 宽度 Height 高度 ID控件号 Calling过程 Title 字符串表达式 或 From Variable 字符串变量 Value初始选项 Into变量 【例9-16】下面是生成一个列表框控件的代码:,Dialog Control ListBox Title “1st Quarter;2nd Quarter;3rd Quarter;4th Quarter“ Position 10, 92 Height 40 Control OkButton Control CancelButton运行结果如图9-17所示。图9-17列表框控
15、件,7. 多重列表框控件语法:Control MultiListBox Position x , y Width 宽度 Height 高度 ID控件号 Calling过程 Title 字符串表达式 或 From Variable 字符 串变量 Value初始选项 Into变量,【例9-17】下面是生成一个多重列表框控件的代码:DialogControl MultiListBox Title “Streets;Highways;Towns;Countries;States“ Position 10, 92 Width 65Height 35 Control OkButtonControl Can
16、celButton运行结果如图9-18所示。 图9-18 多重列表框控件,8. 下拉列表框控件 语法:Control PopupMenu Position x , y Width宽度 ID 控件号 Calling 过程 Title Title 字符串表达式 或 From Variable 字符串变量 Value 初始选项 Into 选项变量 ,【例9-18】下面是生成一个下拉列表框控件的代码:DialogControl PopupMenu Title “Town;County;Territory;Region;Entire state“Position 10, 150 Control OkBu
17、ttonControl CancelButton 图9-19 下拉列表框控件,9. 复选框控件语法:Control CheckBox Position x , y Width 宽度 ID 控件号 Calling过程 Title标题 Value逻辑值 Into逻辑变量 ,【例9-19】下面是生成一个复选框控件的代码:DialogControl CheckBox Title “Include &Legend“ Position 115, 155Control OkButton 图9-20 复选框控件 Control CancelButton运行结果如图9-20所示。,10. 按钮控件 MapBas
18、ic包含两个按钮:OkButton和CancelButton。 9.3.5 控件的初值和终值 大部分控件都有一可选的Value从句,这个从句定义了对话框第一次显示时该控件的状态。 大多控件都有一Into从句,这个从句后面有一个变量,MapInfo用这个变量存储对话框的数据。如果有Into从句,用户通过单击“Ok”按钮确认该对话框后,MapInfo会用Into后的变量存储控件的最终值。,9.4 窗口,MapBasic应用程序能够控制所有的 MapInfo窗口,包括标准窗口、地图窗口、浏览 (Browse)窗口、布局(Layout)窗口、专题图 (Graph)窗口、信息窗口。 9.4.1 窗口的大
19、小和位置窗口的大小和位置可以通过两种方法控制: 在打开的窗口的同时指定窗口的大小和 位置。,【例9-20】下面的语句指定地图窗口及布局窗口的位置及大小:Open Table “world“Open Table “cust1994“ As customersMap from customers, worldPosition (1,1) Width 3 Height 2Layout Position (0, 0) Width 2 Height 4, 在打开窗口后调整窗口的位置和大小。使用Set Window语句。语法:Set Window 窗口号 Position ( x , y ) Units
20、纸面单位 Width 窗口宽度 Units 纸面单位 Height 窗口高度 Units 纸面单位 ,9.4.2 地图窗口1. 图层的操作增加图层的语法为:Add Map Window 窗口号 Layer 表1 , 表2 . Auto Animate ,2. 设置地图投影可以使用Set Map CoordSys. 语句改变地 图投影,若要保存投影,使用Commit Table .As.CoordSys语句。3. 制作专题图专题图有六种形式。每种都可以用相应的 MapBasic语句实现。(1) 范围值 (ranges of values)语法:Shade Window 窗口号 图层号 或 图层名
21、 With 表达式, Ignore 忽略的数值 Ranges Apply Color或 Size或 All 【例9-22】下面的例子是根据美国1990年人口生成的范围值图,总共有三个范围,每个范围用不同颜色、样式填充。Open Table “ states “Map From Shade states With Pop_1990 Ranges4827000:29280000 Brush (2,0,201326591) ,1783000: 4827000 Brush (8,0,16777215) ,449000: 1783000 Brush (5,0,16777215),(2) 独立值 (ind
22、ividual values)语法:Shade Window 窗口号 图层号 或 图层名 With 表达式 Ignore 忽略的数值 Values 字段1 Pen. Line. Brush. Symbol. , 字段2 Pen. Line. Brush. Symbol. . ,【例9-23】下面的例子假定“uk_sales”表中有“Sales_Rep”字段,该字段代表在英国销售代理的名字。根据销售商来制作独立值图。Open Table “uk_sales“Map From uk_sales Shade 1 With Proper$(Sales_Rep) Ignore “ Values“Alan
23、“, “Amanda“,“Bob“, “Jan“,(3) 点密度 (dot density)语法: Shade Window 窗口号 图层号 或 图层名 With 表达式Density 数值 : 点的尺寸 Color 颜色号 【例9-24】下面的例子根据人口制作点密度图,60000个人用一个4个像元大小的点表示。 Open Table “States“ Map From states Shade states With Num_HH_90 Density 60000:4,(4) 等级符号(graduated symbols)语法: Shade Window 窗口号 图层号 或 图层名 With
24、 表达式Graduated 最小值:符号大小 最大值:符号大小 Symbol . . . Inflect Symbol . . . Vary Size By “ LOG“ 或 “SQRT“ 或 “CONST“ ,【例9-25】下面的例子建立等级符号表示利润和亏损。商店盈利则用绿色上三角表示,商店亏损则用红色下三角表示。Shade stores With Net_Profit Graduated 0.0:0 15000:24 Symbol(36, GREEN, 24) Inflect Symbol(37, RED, 24) Vary Size By “SQRT“,(5) 饼图 (pie char
25、ts)语法: Shade Window 窗口号 图层号 或 图层名 或 选择集 With 表达式1,表达式2. Half Pie Angle 角度 Counter Fixed Max Size 饼尺寸 Units 单位名称 At Value 最大值 Vary Size By “ LOG“ | “SQRT“ | “CONST“ ,【例9-26】下面的例子产生的饼图为同一尺寸。 Shade sales_95 With phone_sales, retail_sales Pie Fixed Max Size 0.25 Units “Inch“【例9-27】下面的例子创建一个变化大小的饼图。如果记录的
26、总和为85000,它对应的饼图为0.25英寸,记录的值越小,饼图也越小。 Shade sales_95 With phone_sales, retail_sales Pie Max Size 0.25 Units “Inch“ At Value 85000,【例9-28】下面的例子创建专题图,将饼图放置在图形对象中央。 Shade sales_95 With phone_sales, retail_sales Pie Angle 180 Max Size 0.5 Units “Inch“At Value 85000 Vary Size By “SQRT“Border Pen (1, 2, 0)
27、 Position Center Above Style Brush(2, RED, 0), Brush(2, BLUE, 0),(6) 直方图 (bar charts)语法: Shade Window 窗口号 图层号 或 图层名 或 选择集 With 表达式1,表达式2. Bar Normalized 或 Stacked Bar Fixed Max Size 最大尺寸 Units 单位名称 At Value 最大值 Vary Size By “ LOG“ 或 “SQRT“ 或 “CONST“ ,【例9-29】下面的例子创建直方图,并将直方图定位在地图对象中心点上方, Shade sales_
28、93 With phone_sales, retail_sales Bar Max Size 0.4 Units “Inch“ At Value 1245000 Vary Size By CONSTBorder Pen (1, 2, 0) Position Center Above Style Brush(2, RED, 0), Brush(2, BLUE, 0),9.4.3 浏览窗口语法: Browse 表达式列表 From 表 Position ( x , y ) Units 纸面单位 Width 窗口宽度 Units 纸面单位 Height 窗口高度 Units 纸面单位 Row 行号
29、Column 列号 Min 或 Max ,【例9-29】下面的例子仅显示省份和人口。 Browse 省份,人口 from 政区图9-21 显示所有字段 图9-22 显示选择字段,【例9-31】下面的例子将第十九行和第二列显示在浏览窗口的左上角。Browse * from WorldRow 19Column 2图9-23 浏览窗口,【例9-32】下面的例子指定了表达式,用人口除以面积得到密度这一项,并将该表达式的名称改为“Density”(“密度”)。 Open Table “world“ Browsecountry, population,population/area(obj, “sq km
30、“) “Density“From world,9.4.4 统计窗口 语法: Graph 标注列, 表达式1,表达式2.From 表 Position ( x , y ) Units 纸面单位 Width 窗口宽度 Units 纸面单位 Height 窗口高度 Units 纸面单位 Min 或 Max ,【例9-33】下面的例子创建人口统计图。Graph 人口 From 政区运行结果如图9-24所示。图9-24 统计窗口,9.4.5 布局窗口 语法: Layout Position ( x , y ) Units 纸面单位 Width窗口宽度 Units 纸面单位 Height 窗口高度 Uni
31、ts 纸面单位 Min 或 Max 【例9-34】例如下面的例子选择布局窗口中所有的对象。Select * From Layout1,【例9-35】下面的例子创建一个布局窗口。Layout Position (0, 0) Width 2 Height 4 运行结果如图9-25所示。图9-25 布局窗口,9.4.6 信息窗口 【例9-36】下面的例子创建一个信息窗口。 Include “MapBasic.def“ Open Table “World“ Interactive Select Country,Capital,Inflat_Rate+0 “Inflation“ From World I
32、nto World_Query Set Window InfoTitle “Country Data“Table World_Query Rec 9Font MakeFont(“Arial“,1,10,BLACK,WHITE)Width 3 Units “in“ Height 1.2 Units “in“Position (2.5,1.5) Units “in“ Front,9.4.7 消息窗口 语法:Print 消息 在窗口信息中实现换 行,可以用下面的语句: 图9-26 消息窗口的换行 Print “Map Layers:“ + Chr$(10) + “ World, Capitals“运
33、行结果如图9-26所示。图9-27设置消息的字体及颜色,【例9-37】下面的例子创建一个消息窗口,设置了大小和字体样式。 Include “MAPBASIC.DEF“ needed for color name BLUE Open Window Message open Message window Set Window Message Font (“Helv“, 1, 10, BLUE) Helvetica bold.Position (0.25, 0.25) place in upper left Width 3.0 make window 3“ wide Height 1.0 make
34、window 1“ high Print “MapBasic Dispatcher now on line“运行结果如图9-27所示。,9.5 工具条,图9-28 标准工具条 图9-29 绘图工具条 图9-30 主工具条,9.5.1 工具条的类型 1. PushButtons按钮这种叫做触发式按钮。当用户按下ToolButtons按钮后,按钮立即复位,并调用相应的处理程序。 2. ToggleButtons按钮这种按钮叫做开关式按钮。当用户单击ToggleButtons按钮时,这种按钮会在按下与没按下之间切换。 3. ToolButton按钮这种称为工具按钮。当用户单击这种按钮时,它处于活动状
35、态,直到用户单击了另外的按钮。,9.5.2 工具条的操作1. 创建工具条创建一个新工具条的语句为:Create ButtonPad2. 激活工具条创建一个工具条,并不能立刻显示在窗口中,需要使用下面的语句激活:Alter ButtonPad3. 激活按钮 4. 按钮的返回值,9.5.3 创建触发式型按钮 9.5.4 创建工具按钮 9.5.5 向“主”工具条添加一个按钮 9.5.6 选择按钮图表 【例9-41】下面的语句定义了一个按钮,并为按钮选择了一个图标,图标代码定义为MI_ICON_INFO:Alter ButtonPad “主“Add SeparatorAdd PushButtonIco
36、n MI_ICON_INFOCalling procedure_name,图9-31 图标例子窗口, 运行图标示例程序“ICONDEMO.MBX”。显 示图标例子菜单,如图9-31所示。 单击图标示例菜单,选择一个菜单项,出现 一个自定义图标按钮盒。如图9-32所示。 单击某个图标,出现如图9-33所示的对话框。 将对话框中的图标代码复制到剪贴板中。 打开MapBasic程序,用Ctrl+V键将 图标代码粘贴到应用程序中。,图9-32 自定义图标按钮盒 图9-33 图标代码对话框,9.5.7 运行MapBasic应用程序Startup是一个特殊的工作空间,如果该工 作空间存在于用户的系统中,M
37、apInfo将自动加 载该工作空间,若Startup工作空间中有Run Application语句,则MapInfo将自动运行指定的程 序。例如,用户要运行应用程序Query,可以创 建如下Startup工作空间:!Workspace!Version 400!Charset NeutralRun Application “Query.mbx“,9.6 MapBasic过程,9.6.1 MapBasic主过程 Declare Sub Main 声明一个主过程 Sub Main 主过程开始Note “Testing, one two three.“ 显示 一个消息 End Sub 结束主过程,9.
38、6.2 MapBasic子过程子过程的声明方法如下: Declare Sub 子过程名图9-34 查询菜单,图9-35 ProvinceName子过程,9.7 MapBasic变量,MapBasic变量包括全局变量(Global)和局部变量(Dim)。全局变量在整个程序中起作用,而局部变量仅在声明该变量的过程中其作用。变量的类型有短整型(SmallInt)、整型(Integer)、浮点型(Float)、定长字符型(String)、可变长字符型(String*n)、布尔型(Logical)、日期型(Date)、对象型(Object)、列变量(Alias)、线型(Pen)、填充(Brush)、字体
39、(Font)、符号(Symbol)。,9.8 MapBasic的表达式,9.8.1 MapBasic的函数 MapBasic支持许多不同的函数。每一个函数都有不同的作用,如Sqr()函数计算正方形的面积,而Ucase$()函数将文本字符串改成大写。在表达式中引用函数时,程序就调用该函数并返回函数值。,9.8.2 MapBasic的运算符 1. 数字运算符,2. 字符串运算符 字符运算符有“+”、“&”、“Like”。 3. 日期运算符,表9-3 MapBasic的日期运算符,4. 比较运算符,表9-4 比较运算符,5. 逻辑运算符,表9-5 逻辑运算符,6. 图形运算符,表9-6 图形运算符,
40、7. 运算符的优先级包含多个运算符的复杂表达式,MapBasic会按运算符的优先级规则来确定运算的先后。优先级最高的是“( )”,其次指数、取反、乘法、除法、取余、取整运算、加法、减法、字符连接符、图形运算符、比较运算符、Like、Not、And,最低的是“Or”。,9.9 分支、循环和其他流程控制,9.9.1 分支语句 1. If语句(1) If.Then (2) If.Then.Else (3) If.Then.ElseIf.Then 【例9-45】下面的例子用来判断当天的日期,若是1月1日,则系统显示一个消息窗“新年好”;若是2月14日,则系统显示一个消息窗“情人节好”;若是12月25日
41、,则系统显示一个消息窗“圣诞节好”;若是12月25日,则系统显示一个消息窗“圣诞节好”;否则,则系统显示一个消息窗“好日子”。,2. Do Case语句语法: Do Case 表达式Case 结果表1语句体1Case 结果表2语句体2 Case Else 语句体n End Case,3. Goto语句语法: Goto 标号 9.9.2 循环语句 1. For.Next语句 语法: For 循环变量=初始值 To 终值 Step 步长 循环体 Exit For 循环体 Next,2. While.Wend语句语法: While 条件 循环体 Wend 3. Do.Loop语句语法: Do 循环体
42、 Loop Until 或 While 条件或 Do Until 或While 条件 循环体 Loop,9.9.3 其他流程控制语句 1. End Program语句语法: End Program 2. Terminate Application语句语法: Terminate Application 应用程序名 3. End MapInfo语句语法: End MapInfo,9.10 MapBasic的表操作,1. 创建新表语法: Create Table 表 ( column 字段数据类型 , . . . ) File 保存位置 Type NATIVE | Type DBF CharSet
43、char_set | Type Access Database 数据库文件格式,2. 打开表语法: Open Table 表 As 别名 Interactive 3. 关闭表语法: Close Table 表 Interactive 4. 删除表语法: Drop Table 表,5. 查询表语法: Select 表达式列表From 表1,表2, . Where 表达式条件 Into 结果表 Group By 字段 Order By 字段 ,5. 修改表数据 (1) Insert语句语法: Insert Into 表 ( 字段 ) Values (字段表达式) 或 Select 字段 From
44、表 6. 修改表结构 语法: Alter Table 表 ( Add 字段1 类型1,字段2 类型2, . Modify字段1 类型1,字段2 类型2, . ,Drop字段1,字段2. Rename 旧字段1 新字段1,旧字段2 新字段2 , . Order字段1,字段2. ) Interactive ,9.11 习题9,一、 思考题1. MapBasic的语句和VB、QB的异同?2. MapBasic的特点在什么地方?3. 控件有哪些类型?说明各有什么用途。4. 如何读取控件的终值? 二、 上机练习1. 制作一个全新的菜单栏,包含若干菜单和菜单项。2. 制作一个简单对话框,并指定它的位置和大小。,3. 用各种打开窗口的语句打开一个窗口,并指定它的位置和大小。4. 用添加、删除工具条的语句自定义一个工具条,里面要包含一个新按钮。5. 编辑一段小程序,实现主过程对子过程的调用。6. 用表的操作语句,实现对表的创建、修改、删除、重命名、修改表结构等操作。,