1、MapBasic编程1.1 制作菜单栏1.1.1 制作全新的菜单栏1.1.2 修改已有菜单栏1.2 菜单制作1.2.1 全新菜单的制作1.2.2 更改原有菜单1.3 对话框制作1.3.1 标准对话框1.3.2 自定义对话框制作1.3.3 控件的位置和大小1.3.4 控件类型1.3.5 控件的初值和终值1.4 窗口1.4.1 窗口的大小和位置1.4.2 地图窗口1.4.3 浏览窗口1.4.4 统计窗口1.4.5 布局窗口1.4.6 信息窗口1.4.7 消息窗口1.5 工具条1.5.1 工具条的类型1.5.2 工具条的操作1.5.3 创建触发式型按钮1.5.4 创建工具按钮1.5.5 向“主”工具
2、条添加一个按钮1.5.6 选择按钮图表1.5.7 运行MapBasic应用程序1.6 MapBasic过程1.6.1 MapBasic主过程1.6.2 MapBasic子过程1.7 MapBasic变量1.8 MapBasic的表达式1.8.1 MapBasic的函数1.8.2 MapBasic的运算符1.1 分支、循环和其他流程控制1.1.1 分支语句1.1.2 循环语句1.1.3 其他流程控制语句1.10 MapBasic的表操作1.11 习题1 1.1 制作菜单栏菜单栏是MapInfo工作区域顶部的水平条,初始状态下的MapInfo的菜单栏包括“File”,“Edit”,“Objects
3、”,“Query”等。1.1.1 制作全新的菜单栏语法:CreateMenuBarAs菜单名 或ID菜单号,菜单名 或ID菜单号.【例1-1】制作一个全新菜单栏,包含“File”,“Edit”,“Query”,“Map”,“Browse”菜单。代码如下:Create Menu Bar As?汩履尬摅瑩?兜敵祲?灡?潲獷履图1-1 全新菜单栏1.1.2 修改已有菜单栏1.删除菜单语法:AlterMenuBar Remove菜单名 或ID菜单号,菜单名 或ID菜单号.【例【例1-2】在原有菜单栏的基础上,删除】在原有菜单栏的基础上,删除“Windows”,“Help”菜单。菜单。代码如下:Alte
4、r Menu Bar Remove ID 6,ID 7 图1-2 删除菜单2.增加菜单语法:Alter Menu Bar Add菜单名菜单名 或或 ID 菜单号,菜单名 或或 ID 菜单号菜单号.【例1-3】在原有菜单栏的基础上,增加“DataEntry”菜单。代码如下:Alter Menu Bar Add DataEntry 图1-3 增加菜单图1-4 在菜单栏中间增加菜单3.恢复菜单语法:CreateMenuBarAsDefault若放弃对菜单栏的修改,恢复原有菜单样式,可以运行以下代码:Create Menu Bar As Default1.2 菜单制作1.2.1全新菜单的制作语法:Cr
5、eate Menu 新菜单名ID菜单号As菜单项1ID菜单号 Calling handler|As菜单名,菜单项2.【例1-4】制作全新菜单“DataEntry”。代码如下:Create Menu?瑡?瑮祲As制作“DataEntry”菜单?摤,菜单有三个菜单项?楤屴,?汥瑥履Alter Menu Bar Add?瑡?瑮祲将菜单添加到菜单栏中图1-5 制作全新菜单1.2.2 更改原有菜单语法:CreateMenu新菜单名ID菜单号As菜单项1ID菜单项 Callinghandler|As菜单名,菜单项2.【例1-5】更改原有菜单“File”的内容。代码如下:Create Menu?楆敬As?敎
6、屷,?灏湥,?汃獯履,?慓敶,?牐湩屴,?硅瑩图1-6 更改原有菜单1.3 对话框制作1.3.1标准对话框1.消息对话框语法:Note消息图1-7 消息对话框【例1-6】例如显示一个“查询成功!”的消息对话框。代码如下:Note 查询成功!2.询问对话框询问对话框语法:Ask(提示信息,确定文本,取消文本)【例1-7】下面的例子用生成一个简单询问对话框。Dim more As Logicalmore=Ask(Do you want tocontinue?,OK,Stop)运行结果如图1-8所示。图1-8 询问对话框3.选择文件对话框语法:FileOpenDlg(路径,文件名,文件类型,标题)【
7、例1-8】下面的程序用 FileOpenDlg()函数显示提示用户打开一个文件的对话框。Dim s_filename As Strings_filename=FileOpenDlg(,TAB,OpenTable)运行结果如图1-1所示。图1-1 选择文件对话框1.3.2 自定义对话框制作【例1-1】下面是生成一个自定义对话框的代码:Dialogtitle 按省份名Control Statictexttitle 请输省份名尺Control EdittextControl OkbuttonTitle 确定Control CancelbuttonTitle 取消图1-10 自定义对话框图1-11 指
8、定位置和大小1.3.3 控件的位置和大小控件的大小由Width(宽)和Height(高)控制。位置和大小采用对话框单位为单位,每个对话框单位表示一个字符宽度的 1/4或一个字符高度的1/8,以对话框的左上角为原点,它的位置是(0,0)。【例1-10】下面的例程指定了控件的位置及大小。DialogTitle 按省份名Control StaticTextTitle 请输省份名尺Control EditTextControl OkButtonWidth 20Height 12Title 确定Position 60,32Control CancelButtonWidth 20Height 12Titl
9、e 取消Position 100,32运行结果如图1-11所示。1.3.4 控件类型1.静态文本控件语法:ControlStaticTextPositionx,yWidth宽度Height高度ID控件号Title标题【例1-11】下面是生成一个静态文本控件的代码:DialogControl StaticTextTitle Enter map 楴汴?Position 5,10Control OkButton图1-12 静态文本控件Control CancelButton运行结果如图1-12所示。2.输入文本控件输入文本控件语法:ControlEditTextPositionx,yWidth宽度H
10、eight高度ID控件号Value初始值Into变量【例1-12】下面是生成一个输入文本控件的代码:DialogControl EditTextControl OkButtonControl CancelButton运行结果如图1-13所示。图1-13 输入文本控件3.组合框控件语法:ControlGroupBoxPosition x,yWidth宽度Height高度Title标题【例1-13】下面是生成一个组合框的代码:DialogControl GroupBoxTitle Level of Detail Position 5,30Height 40Width 70Control OkBut
11、tonControl CancelButton运行结果如图1-14所示。4.单选项组合控件语法:Control RadioGroup图1-14 组合框控件 Position x,y ID控件号 Calling过程 Title 字符串表达式 或 From Variable字符串变量 Value初始选项 Into变量【例1-14】下面是生成一个单选项组合控件的代码:DialogControl RadioGroupTitle&Full Details;&Partial 敄慴汩屳Position 15,42Control OkButtonControl CancelButton运行结果如图1-15所示
12、。5.Picker选取对象类控件语法:ControlPenPicker或或BrushPicker或或SymbolPicker 或或 FontPicker Position x,y Width 宽度 Height 高高度度 ID控件号Calling过程过程Value样式表达式Into样式变量【例1-15】下面是生成一个文本选取控件的代码:DialogControl FontPickerPosition 140,42Control OkButtonControl CancelButton运行结果如图1-16所示。图1-16 文本选取控件6.ListBox列表框控件语法:Control ListBo
13、xPositionx,yWidth宽度Height高度ID控件号Calling过程Title字符串表达式 或FromVariable字符串变量Value初始选项Into变量【例1-16】下面是生成一个列表框控件的代码:DialogControl ListBoxTitle st Quarter;2ndQuarter;3rd Quarter;4th畑牡整屲Position 10,12Height 40Control OkButtonControl CancelButton运行结果如图1-17所示。图1-17列表框控件7.多重列表框控件多重列表框控件语法:ControlMultiListBoxPos
14、itionx,yWidth宽度Height高度ID控件号Calling过程Title字符串表达式 或FromVariable字符串变量Value初始选项Into变量【例1-17】下面是生成一个多重列表框控件的代码:DialogControl MultiListBoxTitle 卜牴敥獴?杩睨祡?潔湷?潃湵牴敩?瑓瑡獥Position 10,12Width 65Height 35Control OkButtonControl CancelButton运行结果如图1-18所示。图1-18 多重列表框控件8.下拉列表框控件语法:ControlPopupMenuPositionx,yWidth宽度ID
15、控件号Calling过程TitleTitle 字符串表达式或FromVariable字符串变量Value初始选项Into选项变量【例1-18】下面是生成一个下拉列表框控件的代码:DialogControl PopupMenuTitleTown;County;Territory;Region;Entire瑳瑡履Position 10,150Control OkButtonControl CancelButton图1-11 下拉列表框控件1.复选框控件语法:ControlCheckBoxPositionx,yWidth宽度ID控件号Calling过程Title标题Value逻辑值Into逻辑变量【
16、例1-11】下面是生成一个复选框控件的代码:DialogControl CheckBoxTitle Include?来湥層Position 115,155Control OkButton图1-20 复选框控件Control CancelButton运行结果如图1-20所示。10.按钮控件MapBasic包含两个按钮:OkButton和CancelButton。1.3.5 1.3.5 控件的初值和终值控件的初值和终值大部分控件都有一可选的 Value从句,这个从句定义了对话框第一次显示时该控件的状态。大多控件都有一Into从句,这个从句后面有一个变量,MapInfo用这个变量存储对话框的数据。如
17、果有Into从句,用户通过单击“Ok”按钮确认该对话框后,MapInfo会用Into后的变量存储控件的最终值。1.4 窗口MapBasic应用程序能够控制所有的MapInfo窗口,包括标准窗口、地图窗口、浏览(Browse)窗口、布局(Layout)窗口、专题图(Graph)窗口、信息窗口。1.4.1窗口的大小和位置窗口的大小和位置可以通过两种方法控制:在打开的窗口的同时指定窗口的大小和位置。【例1-20】下面的语句指定地图窗口及布局窗口的位置及大小:Open Table 睜牯摬Open Table 捜獵?尴As customersMap from customers,worldPositio
18、n(1,1)Width 3Height 2Layout Position(0,0)Width 2Height 4 在打开窗口后调整窗口的位置和大小。使用Set Window语句。语法:SetWindow窗口号Position(x,y)Units纸面单位 Width窗口宽度 Units纸面单位 Height 窗口高度窗口高度 Units 纸面单位纸面单位 1.4.2地图窗口1.图层的操作增加图层的语法为:AddMapWindow窗口号Layer表1,表2.AutoAnimate 2.设置地图投影可以使用Set Map CoordSys.语句改变地图投影,若要保存投影,使用 Commit Tabl
19、e.As.CoordSys.语句。3.制作专题图专题图有六种形式。每种都可以用相应的MapBasic语句实现。(1)范围值范围值(rangesofvalues)语法:ShadeWindow窗口号图层号 或 图层名With表达式Ignore忽略的数值RangesApply Color或Size或All 【例1-22】下面的例子是根据美国 1110年人口生成的范围值图,总共有三个范围,每个范围用不同颜色、样式填充。Open TablestatesMap FromShade states With Pop_1110 Ranges4827000:21280000 Brush(2,0,201326511
20、),1783000:4827000 Brush(8,0,16777215),441000:1783000 Brush(5,0,16777215)(2)独立值(individual values)语法:ShadeWindow窗口号图层号 或 图层名With表达式Ignore忽略的数值Values字段 1Pen.Line.Brush.Symbol.,字段2Pen.Line.Brush.Symbol.【例 1-23】下面的例子假定“uk_sales”表中有“Sales_Rep”字段,该字段代表在英国销售代理的名字。根据销售商来制作独立值图。Open Table 甥彫慳敬屳Map From uk_sa
21、lesShade 1 With Proper$(Sales_Rep)Ignore ValuesAlan,Amanda,Bob,?湡(3)点密度(dotdensity)语法:ShadeWindow窗口号图层号 或 图层名With表达式Density数值:点的尺寸Color颜色号【例1-24】下面的例子根据人口制作点密度图,60000个人用一个4个像元大小的点表示。OpenTable卜慴整屳MapFromstatesShadestatesWithNum_HH_10Density 60000:4(4)等级符号等级符号(graduated symbols)语法:ShadeWindow窗口号图层号 或
22、图层名With表达式Graduated最小值:符号大小最大值:符号大小Symbol.InflectSymbol.Vary Size By屻屻 佌屇佌屇或卜剑屔卜剑屔或CONST【例1-25】下面的例子建立等级符号表示利润和亏损。商店盈利则用绿色上三角表示,商店亏损则用红色下三角表示。Shade stores With Net_ProfitGraduated0.0:0 15000:24Symbol(36,GREEN,24)Inflect Symbol(37,RED,24)Vary Size By 卜剑屔(5)饼图饼图(piecharts)语法:ShadeWindow窗口号图层号 或 图层名 或
23、选择集With表达式1,表达式2.Half PieAngle角度Counter Fixed Max Size饼尺寸 Units单位名称 At Value 最大值 Vary Size By LOG|SQRT|CONST 【例1-26】下面的例子产生的饼图为同一尺寸。Shade sales_15 With phone_sales,retail_salesPie Fixed慍?楓敺?金 湕瑩?据屨【例1-27】下面的例子创建一个变化大小的饼图。如果记录的总和为85000,它对应的饼图为0.25英寸,记录的值越小,饼图也越小。Shade sales_15 With phone_sales,retail
24、_salesPieMax Size 0.25 Units?据屨At Value 85000【例1-28】下面的例子创建专题图,将饼图放置在图形对象中央。Shade sales_15 With phone_sales,retail_salesPieAngle 180Max Size 0.5 Units?据屨At Value 85000Vary Size By 卜剑屔Border Pen(1,2,0)Position Center AboveStyle Brush(2,RED,0),Brush(2,BLUE,0)(6)直方图直方图(barcharts)语法:ShadeWindow窗口号图层号 或
25、图层名 或 选择集With表达式1,表达式2.BarNormalized或StackedBarFixed Max Size最大尺寸 Units单位名称At Value最大值 Vary Size By屻屻佌屇佌屇或 卜剑屔卜剑屔或CONST 【例1-21】下面的例子创建直方图,并将直方图定位在地图对象中心点上方,Shade sales_13With phone_sales,retail_salesBarMax Size 0.4 Units?据屨 At Value 1245000Vary Size By CONSTBorder Pen(1,2,0)Position Center AboveStyl
26、e Brush(2,RED,0),Brush(2,BLUE,0)1.4.3浏览窗口语法:语法:Browse表达式列表From表Position(x,y)Units纸面单位 Width窗口宽度Units纸面单位 Height窗口高度Units纸面单位 Row行号Column列号Min或Max【例1-21】下面的例子仅显示省份和人口。Browse 省份,人口 from 政区图1-21 显示所有字段图1-22 显示选择字段【例1-31】下面的例子将第十九行和第二列显示在浏览窗口的左上角。Browse*from WorldRow 11Column 2图1-23 浏览窗口【例1-32】下面的例子指定了表
27、达式,用人口除以面积得到密度这一项,并将该表 达 式 的 名 称 改 为“Density”(“密度”)。Open Table 睜牯摬Browsecountry,population,population/area(obj,sq km)?湥楳祴From world1.4.4统计窗口语法:Graph标注列,表达式1,表达式2.From表Position(x,y)Units纸面单位 Width窗口宽度Units纸面单位 Height窗口高度Units纸面单位 Min或Max【例1-33】下面的例子创建人口统计图。Graph人口From 政区运行结果如图1-24所示。图1-24 统计窗口1.4.5布局
28、窗口语法:LayoutPosition(x,y)Units纸面单位 Width窗口宽度Units纸面单位Height窗口高度Units纸面单位 Min 或 Max 【例1-34】例如下面的例子选择布局窗口中所有的对象。Select*From Layout1【例1-35】下面的例子创建一个布局窗口。Layout Position(0,0)Width 2 Height 4运行结果如图1-25所示。图1-25 布局窗口1.4.6信息窗口【例1-36】下面的例子创建一个信息窗口。Include?灡慂楳?敤屦Open Table 坜牯摬 InteractiveSelectCountry,Capital,
29、Inflat_Rate+0?普慬楴湯From World Into World_QuerySet Window InfoTitle Country 慄慴Table World_Query Rec 1Font MakeFont(Arial,1,10,BLACK,WHITE)Width 3 Units 楜屮Height 1.2 Units 楜屮Position(2.5,1.5)Units 楜屮Front1.4.7 消息窗口语法:Print 消息消息在窗口信息中实现换行,可以用下面的语句:图1-26 消息窗口的换行Print Map 慌敹獲尺+Chr$(10)+World,慃楰慴獬运行结果如图1-2
30、6所示。图1-27设置消息的字体及颜色【例1-37】下面的例子创建一个消息窗口,设置了大小和字体样式。Include?偁?屆 needed for color nameBLUEOpen Window Message open Message windowSet Window MessageFont(Helv,1,10,BLUE)Helvetica bold.Position(0.25,0.25)place in upper leftWidth 3.0 make window 尳wideHeight 1.0 make window 就highPrint MapBasic Dispatcher n
31、ow on 楬敮运行结果如图1-27所示。1.5 工具条图1-28 标准工具条图1-21 绘图工具条图1-30 主工具条1.5.1工具条的类型1.PushButtons按钮这种叫做触发式按钮。当用户按下ToolButtons按钮后,按钮立即复位,并调用相应的处理程序。2.ToggleButtons按钮这种按钮叫做开关式按钮。当用户单击ToggleButtons按钮时,这种按钮会在按下与没按下之间切换。3.ToolButton按钮这种称为工具按钮。当用户单击这种按钮时,它处于活动状态,直到用户单击了另外的按钮。1.5.2工具条的操作1.创建工具条创建一个新工具条的语句为:CreateButton
32、Pad2.激活工具条创建一个工具条,并不能立刻显示在窗口中,需要使用下面的语句激活:AlterButtonPad3.激活按钮4.按钮的返回值1.5.3创建触发式型按钮1.5.4创建工具按钮1.5.5向“主”工具条添加一个按钮1.5.6选择按钮图表【例1-41】下面的语句定义了一个按钮,并为按钮选择了一个图标,图标代码定义为MI_ICON_INFO:Alter ButtonPad 主Add SeparatorAdd PushButtonIcon MI_ICON_INFOCalling procedure_name图1-31 图标例子窗口 运行图标示例程序“ICONDEMO.MBX”。显示图标例子
33、菜单,如图 1-31所示。单击图标示例菜单,选择一个菜单项,出现一个自定义图标按钮盒。如图 1-32所示。单击某个图标,出现如图 1-33所示的对话框。将对话框中的图标代码复制到剪贴板中。打开MapBasic程序,用Ctrl+V键将图标代码粘贴到应用程序中。图1-32 自定义图标按钮盒图1-33 图标代码对话框1.5.7运行MapBasic应用程序Startup是一个特殊的工作空间,如果该工作空间存在于用户的系统中,MapInfo将自动加载该工作空间,若Startup工作空间中有RunApplication语句,则 MapInfo将自动运行指定的程序。例如,用户要运行应用程序 Query,可以
34、创建如下Startup工作空间:!Workspace!Version 400!Charset NeutralRun Application 兜敵祲洮硢1.6 MapBasic过程1.6.1MapBasic主过程DeclareSubMain声明一个主过程SubMain主过程开始Note Testing,one two 桴敲?显示一个消息End Sub结束主过程1.6.2MapBasic子过程子过程的声明方法如下:DeclareSub子过程名图1-34 查询菜单图1-35 ProvinceName子过程1.7 MapBasic变量MapBasic变量包括全局变量(Global)和局部变量(Dim)
35、。全局变量在整个程序中起作用,而局部变量仅在声明该变量的过程中其作用。变量的类型有短整型(SmallInt)、整型(Integer)、浮点型(Float)、定长字符型(String)、可变长字符型(String*n)、布尔型(Logical)、日期型(Date)、对象型(Object)、列变量(Alias)、线型(Pen)、填充(Brush)、字体(Font)、符号(Symbol)。1.8 MapBasic的表达式1.8.1 MapBasic的函数MapBasic支持许多不同的函数。每一个函数都有不同的作用,如 Sqr()函数计算正方形的面积,而Ucase$()函数将文本字符串改成大写。在表达
36、式中引用函数时,程序就调用该函数并返回函数值。1.8.2MapBasic的运算符1.数字运算符操作符用途相加相减*相乘/相除整除Mod取余乘方2.字符串运算符字符运算符有“+”、“&”、“Like”。3.日期运算符表1-3 MapBasic的日期运算符表达式结果date+integer日期型值,表示以后的日期date-integer日期型值,表示以前的日期date-date整型数,表示过去的天数4.比较运算符表1-4 比较运算符运算符返回TRUE值=相等不相等大于=大于等于Between.And.在范围内5.逻辑运算符表1-5 逻辑运算符运算符返回TRUE值举例And两操作数为真If aAnd
37、 b ThenOr任一操作数为真If a Or b ThenNot操作数为假If Not a Then6.图形运算符图形运算符表1-6 图形运算符运算符返回TRUE值举例Contains目标A包含目标B中心点If a Contains b ThenContains Part目标 A包含目标 B的一部分If a Contains Part b ThenContains Entire目标A包含目标B的全部If a ContainsEntirebThenPartly Within目标 A的一部分在目标 B内If a Partly Within b ThenEntirely Within目标A的全部在
38、目标 B内If a EntirelyWithinbThenIntersects目标A和目标B相交If a Intersects b Then7.运算符的优先级包含多个运算符的复杂表达式,MapBasic会按运算符的优先级规则来确定运算的先后。优先级最高的是“()”,其次指数、取反、乘法、除法、取余、取整运算、加法、减法、字符连接符、图形运算符、比较运算符、Like、Not、And,最低的是“Or”。1.1 分支、循环和其他流程控制1.1.1 分支语句1.If语句(1)If.Then(2)If.Then.Else(3)If.Then.ElseIf.Then【例1-45】下面的例子用来判断当天的日
39、期,若是1月1日,则系统显示一个消息窗“新年好”;若是2月14日,则系统显示一个消息窗“情人节好”;若是12月25日,则系统显示一个消息窗“圣诞节好”;若是12月25日,则系统显示一个消息窗“圣诞节好”;否则,则系统显示一个消息窗“好日子”。2.DoCase语句语句语法:DoCase表达式Case结果表1语句体1Case结果表2语句体2CaseElse语句体nEndCase3.Goto语句语句语法:Goto 标号1.1.2 循环语句1.For.Next语句语法:For循环变量=初始值To终值Step步长循环体ExitFor循环体Next2.While.Wend语句语句语法:While条件循环体
40、Wend 3.Do.Loop语句语句语法:Do循环体Loop Until或While条件或Do Until或While条件循环体Loop1.1.3 其他流程控制语句1.EndProgram语句语法:EndProgram2.Terminate Application语句语法:Terminate Application应用程序名3.EndMapInfo语句语法:EndMapInfo1.10 MapBasic的表操作1.创建新表创建新表语法:Create Table表(column字段数据类型,.)File保存位置 Type NATIVE|Type DBFCharSetchar_set|Type A
41、ccess Database 数据库文件格式2.打开表打开表语法:OpenTable表 As别名 Interactive 3.关闭表关闭表语法:CloseTable表 Interactive 4.删除表删除表语法:DropTable表5.查询表查询表语法:Select表达式列表From表1,表2,.Where表达式条件Into结果表GroupBy字段OrderBy字段5.修改表数据(1)Insert语句语句语法:Insert Into表(字段)Values(字段表达式)或或Select字段From表6.修改表结构语法:AlterTable表(Add 字段1 类型1,字段2 类型2,.Modif
42、y 字段1 类型1,字段2 类型2,.Drop字段1,字段2.Rename旧字段1 新字段1,旧字段2 新字段2,.Order字段1,字段2.)Interactive 1.11 习题1一、思考题1.MapBasic的语句和VB、QB的异同?2.MapBasic的特点在什么地方?3.控件有哪些类型?说明各有什么用途。4.如何读取控件的终值?二、上机练习1.制作一个全新的菜单栏,包含若干菜单和菜单项。2.制作一个简单对话框,并指定它的位置和大小。3.用各种打开窗口的语句打开一个窗口,并指定它的位置和大小。4.用添加、删除工具条的语句自定义一个工具条,里面要包含一个新按钮。5.编辑一段小程序,实现主过程对子过程的调用。6.用表的操作语句,实现对表的创建、修改、删除、重命名、修改表结构等操作。