460 likes | 622 Views
其它控件介绍 表单管理 多表单应用程序 类 建立工具栏. 表单设计的基本步骤为:. 打开表单设计器 向表单添加控件 设置表单及控件的属性 添加表单及控件的事件代码 保存表单 运行及调试表单。. 其它控件介绍. 控件的通用属性 命令按钮组控件 编辑框 复选框和单选框 列表框和组合框 微调控件 表格和页框 超级连接 ActiveX 控件和 ActiveX 绑定控件. 控件的通用属性. Enabled 属性 Visible 属性 以 Font 打头的一组属性 为多个对象设置共同属性.
E N D
其它控件介绍 表单管理 多表单应用程序 类 建立工具栏
表单设计的基本步骤为: • 打开表单设计器 • 向表单添加控件 • 设置表单及控件的属性 • 添加表单及控件的事件代码 • 保存表单 • 运行及调试表单。
其它控件介绍 • 控件的通用属性 • 命令按钮组控件 • 编辑框 • 复选框和单选框 • 列表框和组合框 • 微调控件 • 表格和页框 • 超级连接 • ActiveX控件和ActiveX绑定控件
控件的通用属性 • Enabled属性 • Visible属性 • 以Font打头的一组属性 • 为多个对象设置共同属性 • FontSize:定义字的大小; • FontName:定义文本的字体; • FontColor:定义字的颜色; • Fontbold:定义文字是否粗体; • FontItalic:定义文字是否斜体; • 这组属性是许多可有文字的对象都有的属性,如:表单、标签控件、命令按钮控件、文本框控件、表格控件、列表框控件等等。 • 这一属性是除“超级连接”之外的所有控件及表单都有的属性,其值可设置为:.T.-真或.F.-假,指定表单或控件能否响应由用户引发的事件。只有“计时器”控件的这一属性的含义不同,请参阅6.6.3节。 • 这一属性是除“超级连接”和“计时器”之外的所有运行时可见的控件及表单都有的属性,其值可设置为:.T.-真或.F.-假,指定运行时对象是可见还是隐藏。 • 按住Shift健分别单击若干对象,用来选取需设置属性的对象,属性窗口的对象组合框中将会显示“多重选定”文本,此时便可在属性窗口为这些对象设置共同属性,例如:设置FontSize属性改变文字大小。
命令按钮组控件 • 命令按钮组控件是一个容器控件,它可包含若干个命令按钮,并能统一管理这些命令按钮,命令按钮组与组内的各命令按钮都有自己的属性,事件和方法程序,因而既可单独操作各命令按钮,也可对组控件进行操作。 • 命令按钮组的生成器 • 命令按钮组及其命令按钮的操作 • Click事件的判别 • 容器中对象的引用 • 容器及其对象的编辑 • 常用命令按钮组的属性有: • ButtonCount:设置组中命令按钮的数目。 • BackStyle:设置命令按钮的背景是否透明。 • BorderStyle:定义命令按钮组的边框。 • 按钮选项卡 (1)微调控件:指定命令按钮组中的按钮数,对应于命令按钮组的ButtonCount属性 (2)表格:包含标题和图形两列。 • 标题列对应于命令按钮的Caption属性,命令按钮可以具有标题或图象,或两者都有。图形列对应于命令按钮的Picture属性。 • 命令按钮会自动调整大小,以容纳新的标题和图片,组容器也会自动调整大小。 (2)单击某命令按钮时,组控件的Value属性就会获得一个数值或字符串:当Value属性为1(默认值)时,将获得命令按钮的顺序号,它是一个数值;而当Value属性设置为空时,将获得命令按钮的Caption值,它是字符串。于是在命令按钮组的Click事件代码中便可判别出单击的是哪个命令按钮,并决定执行的动作。 (1)若命令按钮组及其所含的各命令按钮分别设置了Click事件代码,Visual FoxPro将以命令按钮的Click事件代码优先。 • 布局选项卡 (1)按钮布局:指定命令按钮组内的按钮按竖直方向或水平方向排列。 (2)按钮间隔:指定按钮之间的间隔。 上述两项将影响命令按钮组的Height和Width属性。 (3)边框样式:指定命令按钮组有单线边栏或无边框。 例如引用命令按钮组中的命令按钮,Thisform.Commandgroupl.Commandl 或This.Commandl。 (1)容器本身的编辑:设计时若在表单上选定容器,就可编辑该容器的属性、事件代码与方法程序,但不能编辑容器中的对象。 (2)容器中对象的编辑:要编辑容器中的对象,须先激活容器。激活的方法是选定容器的快捷菜单中的【编辑】命令,容器被激活的标志是其四周显示一个斜线边框,如图所示。容器激活后,用户便可选定其中的对象进行编辑。
[例5-1] 用命令按钮组设计计算器。 • 操作步骤如下: • 计算器的按钮部分用命令按钮组控件进行设计。向表单添加一个命令按钮组控件,在命令按钮组控件上单击右键,选择【生成器】,在按钮选项卡中设置按钮数目为16,并设置标题 。然后在“布局”页面中设置“按钮布局”为:水平。单击【确定】按钮,关闭生成器。设置命令按钮组控件的Height属性值为140,在命令按钮组控件上单击右键,选择【编辑】,移动命令按钮,将所有命令按钮的height和Widdth均设置为:25,设置成 的状态。其它部分外观的设计同[例6-10],可以从[例6-10]的表单中复制过来。 • 设置命令按钮组控件Commandgroup1的Value属性值为:=“” • 这一步骤非常重要,如没有这一步,计算器的设置要复杂得多。 • 在命令按钮组控件Commandgroup1的Click事件添加下列代码: IF Thisform.t AND (asc(This.Value)>=45 AND ASC(This.Value)<=57) Thisform.Text1.Value="" &&清空文本框内容 ENDIF IF This.Value="=" &&如果单击了“=”按钮 x=Thisform.Text1.Value Thisform.Text1.Value=str(&x,50,6) Thisform.t=.T. ELSE &&如果单击了除“=”以外的按钮 Thisform.Text1.Value=Thisform.Text1.Value+This.Value Thisform.t=.F. ENDIF 如图所示 如图所示
编辑框 • 在编辑框中可以编辑长字符字段或备注字段中的文本。编辑框中允许输入多段文本,也可以使用方向键、PageUp键、PageDown键、滚动条来移动文本。编辑框只能处理字符型数据。 • 编辑框的常用属性有: • SelStart:返回控件的文本输入区域中用户选择文本的起始点。当没有选定文本时,指示插入点的位置。另外,它还可以指定控件的文本输入区域中选择的文本起始点。 • AllowTabs:设置用户是否可以在编辑框中用Tab 键前后移动。如果允许,应明确地指出用户可以通过按Ctrl+Tab移到下一个控件。 • SelText:返回用户选定的文本,如果没有选定任何文本,则返回空字符串 ("")。或指定包含选定文本的字符串。 • HideSelection:当编辑框没有焦点时选定文本是否以选定状态显示。 • SelLength:返回用户在控制的文本区域中选定的字符数目,或指定要选定的字符数目。 • ReadOnly:设置用户是否可以改变编辑框的文本。 • ScrollBars:设置是否显示垂直滚动条。 • ControlSource:设置将哪一个数据库的表的那个字段的值显示在编辑框中。
[例5-2] 建立一个表单,其外观 如图所示 • 并完成下列功能: • 编辑框与某表文件的的备注型字段绑定; • 执行表单后,用户选择编辑框的内容,单击【确定】按钮,选定的内容将在右边的文本框中出现。 • 操作步骤如下: • 先作准备工作,建立一个名为WBKLB.DBF的表文件,包含一个字段,字段名为:NR,类型为:M,并输入一条记录的内容,内容可从某个已有的文件或帮助中复制过来。 • 新建一个表单,设置表单的Caption属性值为:编辑框实例;为表单设置数据环境,在数据环境中添加表WBKLB.DBF;在表单中添加一个编辑框控件,一个文本框控件,设置编辑框的ControlSourc属性为:WBKLB.NR;再在表单中添加一个命令按钮控件,设置该控件的Caption属性为:确定;Click事件代码为: • Thisform.Text1.Value=Thisform.Edit1.Seltext
复选框和单选框 • 复选框与选项按钮(又译单选框)是对话框中的常见对象,复选框允许同时选择多项,选项按钮则只能在多个选项中选择其中的一项。所以复选框可以在表单中独立存在,选项按钮只能存在于它的容器选项按钮组中。 • 复选框控件 • 选项按钮组控件
复选框控件 • 复选框控件用于指定布尔状态:真或假,开或关,打开或关闭。 • 复选框的常用属性有: • Caption:该属性的值用来定义复选框的标题,即说明该复选框的功能。 • ControlSource:该属性值指定与该复选框对象绑定的数据源。 • Value:指定复选框的状态。 • Value 属性的设置有: 设置 说明 0 (默认值)未选定。 1 选定。 2 灰色,该设置只在代码中可用。 • Style:该属性的值用来定义复选框的外观,有:0-标准、1-图形两种可选值。
选项按钮组控件 • 选项的常用属性有: • Caption:定义选项的说明。 • Value:设置选项是否被选中,1表示选中,0表示未选中。 • Style:该属性的值用来定义单选框的外观,有:0-标准、1-图形两种可选值。 • 选项按钮组控件也有生成器,用法同命令按钮组类似。这里不再详述,请看下面的例题。 • 选项按钮组常用来表示在一组可选的项目中,同一时刻有且仅有一项可以被选中。 • 在选项按钮组控件上单击鼠标右键,然后选择【编辑】,可以对选项组中的每一个选项按钮进行属性和事件代码的设置。 • 选项组常用的属性有: • ButtonCount:设置组中选项的数目。 • BackStyle:设置选项组的背景是否透明。 • BorderStyle:定义选项组的边框。 • Value:表示被选中的按钮序号,默认值为1。
[例5-3]建立一个表单,其外观 x=DOW(DATE()) &&用DOW()函数获取当前日期的星期数 DO CASE CASE x=1 &&如果是星期日 y="日" CASE x=2 &&如果是星期一 y="一" CASE x=3 &&如果是星期二 y="二" CASE x=4 &&如果是星期三 y="三" CASE x=5 &&如果是星期四 y="四" CASE x=6 &&如果是星期五 y="五" CASE x=7 &&如果是星期六 y="六" ENDCASE This.Parent.Text1.Value=DTOC(DATE())+" 星期"+y 如图所示 • 在计时器控件的time事件中添加以下代码: IF This.Parent.check1.Value=1 DO CASE CASE This.Parent.Optiongroup1.Value=1 SET DATE TO YMD CASE This.Parent.Optiongroup1.Value=2 SET DATE TO MDY CASE This.Parent.Optiongroup1.Value=3 SET DATE TO DMY ENDCASE ELSE DO CASE CASE This.Parent.Optiongroup1.Value=1 This.Parent.Text1.DateFormat=12 CASE This.Parent.Optiongroup1.Value=2 This.Parent.Text1.DateFormat=10 CASE This.Parent.Optiongroup1.Value=3 This.Parent.Text1.DateFormat=11 ENDCASE This.Parent.text1.Value=DATE() ENDIF • 并完成下列功能: • 表单被执行时按图所示的格式显示日期和时间; • 当用户改变格式设置时,立刻按用户设置的格式显示日期和时间; • 操作步骤如下: • 新建一个表单,添加五个标签控件、两个文本框控件、两个选项按钮组,两个复选框控件、两个形状控件、一个计时器控件,并设置相应属性,使其外观如图5-6所示,两个形状控件必须设置为“置后”。 • 设置控件的关键属性,设置计时器控件的Interval属性值为:10;设置两个文本框的TabStop属性值为:.F.-假;上面文本框的Width属性值为:240;下面文本框的Width属性值为:210;其它属性值读者可参照已确定的属性值及图5-6的相对位置自定。 IF This.Parent.Optiongroup2.Value=1 SET HOURS TO 12 This.Parent.text2.Width=210 *根据当前时间确定是上午,还是下午 IF hour(DATETIME())>12 This.Parent.label5.Caption="下午" ELSE This.Parent.label5.Caption="上午" ENDIF ELSE &&如果用户选择24小时制 SET HOURS TO 24 This.Parent.text2.Width=241 ENDIF IF This.Parent.check2.Value=1 This.Parent.text2.Value=SUBSTR(TTOC(DATETIME()),10,5) ELSE &&如果用户选择不显示秒 This.Parent.text2.Value=SUBSTR(TTOC(DATETIME()),10,5) ENDIF
列表框和组合框 • 列表框与组合框都有一个供用户选项的列表,但两者之间有两个区别: (1)列表框任何时候都显示它的列表,而组合框平时只显示一个项,待用户单击它的向下按钮后才能显示可滚动的下拉列表。若要节省空间,并且突出当前选定的项时可使用组合框。 (2)组合框又分下拉组合框与下拉列表框两类,前者允许键入数据项;而列表框与下拉列表框都仅有选项功能。
列表框控件 • 生成器 • 列表框生成器含有列表项、布局、样式、值等4个选项卡,用于为列表框设置各种属性。 • 列表项选项卡 • 样式选项卡 • 布局选项卡 • 值选项卡 • 控件值源的类型 • 列表框的常用属性 • 列表框的常用属性 • MoverBars:设置列表框的左侧是否显示移动按钮。 • MultiSelect:设置用户是否可以同时在列表中选择多项。 • Value:返回列表框中选定的项,如果有多列,返回由BoundColumn属性指定的列的内容。 • DisplayValue:返回列表框中选定的项第一列的内容。 • 列表项选项卡 • 该选项卡用于指定要填充到列表框中的项。 • 填充项可以是3种类型数据之一:表或视图中的字段、手工输入的数据或数组中的值。 • 表或视图中的字段 • 手工输入数据 • 数组中的值 • 样式选项卡 • 该选项卡用于指定列表框的样式,所显示的行数,要否递增搜索。下面仅说明显示行数的设置。 • “要显示的行数”微调控件用来调整列表框的显示行数,但是仅在文本选取7号字时所设置的行数与实际项数相符。原因是该微调控件的设置实际上改变了列表框的Height属性,而Visual FoxPro则按象素来指定高度。 • 布局选项卡 • 布局选项卡含有1个复选框和1个表格,用于控制列表框的列宽和显示。 1)“调整列表框的宽度来显示所有列”复选框:该选项自动设置了Width属性,能根据列表项选项卡中微调控件指定的列数自动调整列表框的宽度。 2)表格:表格中显示了在列表项选项卡中定义的列,并可用鼠标拖动列标头右边的列间隔线来调整列宽,相当于修改了Co1umnWidths属性。双击列标头还可隐藏该列,使得表单执行时该列不显示,但其数据仍起作用。 • 值选项卡 • 值选项卡包含两个组合框,分别用来指定返回值的列以及存储返回值的字段。 1)“从哪一列中返回值”组合框:该组合框的操作对应于BoundColumn属性。组合框列表中包含字段名或表示列号的选项,供用户决定列表框返回值的字段或列。 2)字段名组合框:该组合框的操作对应于ControlSource属性,用来指定存储返回值的字段。 • 控件值源的类型 • 列表框和组合框的列表中可以填充各类数据,在上述的列表框生成器中,已涉及值,数组和字段3种类型,实际上共有9类.它们均由RowSourceType属性来指定,RowSourceType 属性的可取值如表5-1所示:
如图所示 [例5-4]设计一个表单,实现 的简易数学用表。 FOR i=1 to 100 n=STR(i,3) This.AddListItem(n,i,1) n=STR(i*i,5) This.AddListItem(n,i,2) n=STR(SQRT(i),7,4) This.AddListItem(n,i,3) n=STR(LOG(i),7,4) This.AddListItem(n,i,4) n=STR(EXP(i),17,4) This.AddListItem(n,i,5) ENDFOR • 原数取1~100。 • 操作步骤如下: • 新建一个表单,向表单添加五个标签控件,一个列表框控件,并设置相关属性。 • 设置列表框控件List1的属性ColumnCount的值为5,说明含有5列;属性ColumnWidth的值为:30,40,50,50,150,确定5列各自的宽度。 • 在控件List1的Init事件中添加如下代码:
组合框控件 • 格式:Control.ListIndex[=nIndex] • 功能:返回或设置组合框(列表框)列表显示时选定项的顺序号。 • 说明: (1)本属性用顺序号来表示某项已被选定。nIndex则代表要设置的顺序号,可取1到ListCount之间的整数之一。 nIndex的缺省值是0,表示没有选定列表项。对于下拉组合框,当列表中没有与键入值相同的项时就返回0。 (2)本属性设计时不可用,运行时可读写。 • Value属性 • DisplayValue属性 • ListCount属性 • ListIndex属性 • List属性 • Selected属性 • 格式: • control.Selected(nIndex)[=IExpr] • 功能:用于分辨组合框或列表框中某一列表项是否被选中。当选中时Selected属性返回.T.,否则返回.F.。 • 说明: (1)nIndex表示列表项的显示顺序号; (2)IExpr可取.T.或.F.之一,用来设置属性值; (3)本属性设计时不可用,运行时可读写。 • 组合框是列表框和文本框的组合。组合框有两种类型: • 下拉式组合框, Style属性的值是0时 • 下拉式列表框,Style属性的值是2时 • 组合框控件也有生成器,用法与列表框完全相同 • 除了生成器提到的属性外,组合框的常用属性还有: • 功能:返回组合框中选定的项,如果有多列,返回由BoundColumn属性指定的列的内容。 • 功能:返回组合框中选定的项第一列的内容。也可返回用户输入的内容。 • 功能:返回组合框或列表框中列表项的个数。 • 说明:该属性在设计时不可用,运行时为只读属性。即仅可取用属性值,不可进行设置。 • 格式:Control.List(nRow[,nCol] ) • 功能:返回组合框或列表框第nRow行,nCol列的内容。
微调控件 • 微调控件的常用属性有: • Increment:用户点按向上或向下按钮时每次增大或减小的值。 • KeyboardHighValue:能输入到微调控件文本框中的最大值。 • KeyboardLowValue:能输入到微调控件文本框中的最小值。 • SpinnerHighValue:用户按向上按钮时能达到的最大值。 • SpinnerLowValue:用户按向下按钮时能达到的最小值。 • Value:返回用户设置的值。
[例5-5] 设计新增人事数据的表单 • 要求充分利用新学的知识,设计表单时尽量为用户着想,为用户提供方便。 • 设计步骤如下: • 利用数据环境向表单快速添加控件:用鼠标指向RSB表的字段行,按下鼠标左键拖曳到表单的左上角,释放鼠标则产生如图所示的表单,默认表单不够大,可拖曳表单边框到足够大,就可以看到所有的控件。 • 对于性别字段的输入,只有两种可取值,没有必要让用户输入“男”或“女”,可利用选项按钮组控件,如图5-12所示,由用户单击鼠标就可选定“男”或“女”。所以需将已有的与性别绑定的文本框删除。 • 删除与“出生日期”和“工作日期”绑定的文本框,保留相应的标签,添加两个微调控件、一个组合框控件、一个形状控件和三个标签控件,并调整成第二行的外观。提示:形状控件要置后。在组合框上单击鼠标右键,选择【生成器】,对“列表项”页面设置,表格中的数一直输入到12,其它三个页面不变,最后单击【确定】确认设置。并设置两个微调控件的属性示 • 操作如下:在表单空表处单击鼠标,取消对所有控件的选择,选择与性别绑定的文本框,按Delete键删除。添加一个选项按钮组,设置成如图5-13右上角所示的外观。 • 对于“相片”字段,也需作处理,为美观起见,添加一个形状控件,使其置后,并设置成三维。为给用户提供更方便的输入界面,添加一个命令按钮,将命令按钮的外观设置成如图5-13所示,相片标签下的命令按钮形状,并设置该命令按钮的Click事件的代码为: • 新建一个名为RSBWH的表单,向表单添加数据环境,数据环境中添加RSB.DBF和BMDM.DBF两个表文件。注意:必需删除两表间的关系。并向BMDM表添加一条空记录。 • 对于“部门代码”字段的值要利用BMDM表的内容,删除与“部门代码”绑定的文本框,添加一个组合框控件,在组合框上单击鼠标右键,选择【生成器】,对“列表项”页面设置成如图5-14所示,对“值”页面设置成如图5-15所示,其它两个页面不变,最后单击【确定】确认设置。 • 对于“职称”字段,也需作处理,为给用户提供更方便的输入界面,删除与“职称”绑定的文本框,添加一个组合框控件,在组合框上单击鼠标右键,选择【生成器】,对“列表项”页面设置成如图5-15所示,对“值”页面设置成如图5-19所示,其它两个页面不变,最后单击【确定】确认设置。 • 调整各控件的位置如图5-13所示,添加两个线条控件、两个命令按钮控件,线条的颜色一条设置成深灰、一条设置成白色,两条紧埃着,形成立体效果。 • 添加控件代码: • Init事件代码 • “保存”按钮的Click事件代码 • “取消退出”命令按钮的Click事件代码 • 四个组合框控件的Init事件代码 • 选项按钮组的Click事件的代码 • 与职称绑定组合框控件的LostFocus事件的代码 • 选定输入年月日的所有控件,如图5-17所示。单击“复制”按钮,再单击“粘帖”按钮,这样就有了两个输入日期的控件,再将Spinner1、Spinner2、Spinner3、Spinner4的Value属性分别设置为:1960,1,1949,1作为默认值。 • filename=GETPICT() &&利用getpict()函数打开选择图片的对话框 • APPEND GENERAL 相片 FROM &filename &&将选取的图片放到当前记录的相片字段中 • Thisform.Refresh() &&刷新表单的显示,目的是让刚选的图显示出来
表格控件 • 表格属性 • ChildOrder:与父表的主关键字相连接的子表的外部关键字。 • ColumnCount:列数。如果ColumnCount设置为-1,表格的列数与RecordSource中的字段数相同。 • LinkMaster:在表格中显示的子记录的父表。 • RecordSource:显示在表格中的数据源。 • RecordSourceType:显示在表格中的数据类型。 • AllowAddNew:该属性为.T.时允许用户向表格中的表添加记录。该属性为.F.(默认值)时,只能用APPEND BLANK或INSERT命令来添加记录。 • 调整表格的行高与列宽 • a. 调整列宽:表格激活后,将鼠标指针置于表格两列标题之间,这时指针变为带有左右双向箭头的竖条,便可左右拖动列线来改变列宽.另一种方法是设置列的Width属性,例如令Thisform.Gridl.Columnl.Width=50 • b. 调整行高:标题栏行和内容行的调整方法略有不同。表格激活后,若调整标题栏高度,可将鼠标指针置于表格标题栏行首按钮的下框线处,当指针变成带有上下双向箭头的横条后,即可上下拖动行线来改变高度。调整内容行高度时,应将鼠标指针置于表格内容第1行行首按钮的下框线处,然后上下拖动行线来改变行高。此时,所有内容行的高度将统一变化。 • 表格的组成 • 在表单窗口添加表格控件 • 表格编辑 • 表格的常用属性 • 用表格控件建立一对多表单 • Visual FoxPro提供了一个强大的工具来显示和操作多行数据,这就是表格。表格是一个容器对象,像表单集能包含多个表单一样,它可以包含多个列。另外,列可以包含表头和控件,并且每一部分都有自己的属性、事件和方法。 • 从数据环境创建 • 利用表格生成器创建 • 表格项选项卡 • 样式选项卡 • 布局选项卡 • 关系选项卡 • 交互式创建 • 修改列标题 • 前已提到,在表格生成器的标题文本框中可以修改列标题。此外还有下面两种方法。 • a. 用代码修改:例如Thisform.Gridl.Column2.Headerl.Caption=”名称”,可将表格中第2列的标题修改为:名称。 • b. 在属性窗口对象列表中按照从容器到对象的次序,找到Headerl对象后,选择该对象作为当前对象,然后修改其Caption属性。 (1)表格(Grid):由一或若干列组成. (2)列(Column):一列可显示表的一个字段,列由列标题和列控件组成。 (3)列标题(例如:Headerl):默认显示字段名,允许修改。 (4)列控件(例如:Textl);一列必须设置一个列控件,该列中的每个单元格都可用此控件来显示字段值。列控件默认为文本框 • 列属性 • ControlSource:指定某表的某字段作为本列的数据源。 • CurrentControl:为列指定控件。 • Spares:取值为.T.(默认值)时,在列表中只有选中的单元格以CurrentControl指定的控件显示,其它单元格仍以文本框显示。取值为.F.时,该列的所有单元格均以CurrentControl指定的控件显示。 • 列的增删 a. 在表格的ColumnCount属性中设置表格的列数,从而改变表格的列数。 b. 打开表格生成器,在表格项选项卡中可增加或减少字段。 c. 要删除列,可在属性窗口中选定某列后按Del健。 • 若要禁止用户在运行时擅自改变表格标题栏的高度,可将表格的AllowHeaderSizing属性设置为.F.;若表格的AllowRowSizing属性为.F.,则禁止改变表格内容行的高度。 • 在数据环境中建立一对多表单的步骤如下: • 从数据环境设计器的父表中把期望的字段拖动到表单里。 • 从数据环境设计器中把相关的子表拖动到表单里。
[例5-6] 设计一个按部门浏览人事表记录的表单。 IF This.Value=1 &&如果用户单击了“上一条”命令按钮 SKIP -1 &&让表指针向前跳一步 ELSE &&如果用户单击了“下一条”命令按钮 SKIP &&让表指针向后跳一步 ENDIF DO CASE CASE RECNO()=1 &&如果表指针指向第一条记录 This.Command1.Enabled=.f. &&设置“上一条”命令按钮为不可用 CASE RECNO()=RECCOUNT() &&如果表指针指向最后一条记录 This.Command2.Enabled=.f. &&设置“下一条”命令按钮为不可用 OTHERWISE &&如果表指针指向中间某条记录 This.Command1.Enabled=.t. &&设置“上一条”命令按钮为可用 This.Command2.Enabled=.t. &&设置“下一条”命令按钮为可用 ENDCASE Thisform.Refresh &&刷新表单的显示 • 设计步骤如下: • 最后以fzbd.scx为文件名保存表单。然后执行表单,当用户单击下一条或上一条时,对于文本框中显示的一个父表的部门名称,在子表中将列出所有属于该部门的职工记录信息,如图5-21所示。这是由于我们在两个表之间建立了一对多的关系。 • 在表单中添加一个命令按钮组控件,并设置相应属性使其外观如图5-20所示,注意需将“上一条”命令按钮的Enabled属性设置为.F.。设置命令按钮组的Click事件的代码为: • 建立一个新表单,为该表单添加数据环境,在数据环境中添加表BMDM和表RSB,将表BMDM的“部门名称”字段从数据环境中拖到表单中,在表单中将出现一个文本框控件,该控件的ControlSource属性将自动设置为BMDM.部门名称。在RSB的标题处按下鼠标拖到表单中,将出现一个表格控件,该控件的RecordSourceType属性自动被设置为1-别名,RecordSource属性自动被设置为:RSB。
页框控件 • 页框是一个包含页面的容器对象,用户可在页框中定义多个页面,以生成带选项卡的对话框。 • 在表单中添加页框控件的步骤为: • 在表单控制工具栏中单页框控件按钮; • 移动鼠标指针到表单中,单击并拖拽到合适的大小; • 页框的常用属性有: • PageCount:设置页框中页面的个数。 • 页面的常用属性有: • Caption:设置页面的名称。 • 在页面中加入控件的步骤如下: • 选中要加入控件的页面; • 在表单控制工具栏中单击所需控件,移动鼠标到所选页面中,单击并拖拽到合适大小。 • 在页框中选择不同页面的步骤如下: • 在页框中单击鼠标右键,选择编辑,则页框呈现出选中状态,边框变粗; • 单击要选择的页面标签。
如图1 图2 [例5-7] 建立一个 及 所示含有两个页面的增加及浏览人事数据的表单。 • 设计步骤如下: • 创建一个新表单,向新表单中添加一个页框控件,向表单添加数据环境,数据环保中添加RSB.DBF和BMDM.DBF两个表文件。注意:必需删除两表间的关系。 • 打开RSBWH表单,选中所有控件,单击常用工具栏的【复制】按钮,在页框控件上单击鼠标右键,选择【编辑】菜单项,单击常用工具栏的【粘贴】按钮,并调整控件到合适的位置,如图1所示。并将RSBWH表单的Init事件的代码复制到当前表单的Init事件中;将RSBWH表单数据环境的Opentables和Closetables事件的代码复制到当前表单的相应事件中。 • 将数据环境窗口显示出来,单击页框的第二个页面。拖拽RSB表(鼠标指针指向RSB的标题行,然后单击并拖拽)到页框的第二个页面上,并调整表格到合适的位置,如图2所示。 • 添加Page1的Click事件的代码为: • GO BOTTOM &&确保回到页面1时表指针指向最后一条记录。 • 以ykbd为文件名保存该表单,然后执行表单,将出现如图1所示的表单,在表单中单击第二个页面,将显示一个表格,如图2所示。表格中列出表的记录。
超级连接 • 超级链接对象含有一个NavigateTo方法程序,它允许用户指定一个网址,执行该方法程序时Visual FoxPro就会启动因特网浏览器,并根据指定的网址进入网络的站点来显示网页。
[例5-8] 在表单上创建一个命令按钮,要求表单运行时单击该命令按钮即可显示搜狐网站的主页。 如图所示 • 在表单上添加超级链接控件和命令按钮控件各一个。 • Commandl的Caption属性设置为:搜狐 • Commandl的Click事件代码编写如下: • Thisform.Hyperlinkl.NavigateTo(“http://www.sohu.com”) &&Hyperlinkl为超级链接控件的Name,括号内为搜狐网站的网址 • 保存表单并运行,表单名称为“cjlj”。
ActiveX控件 • 基本概念 • 向表单添加控件或对象 • “新建”选项按钮 • “由文件创建”选项按钮 • “创建控件”选项按钮 • 向表单控件工具栏添加AttiveX控件 • 添加步骤 • 显示方法 • 删除方法 • 选定“新建”选项表示将在表单上新建一个对象,这种对象是某种文件类型的文档。在插入对象对话框的对象类型列表中包含文档,图象、声音等多种文件类型,用户选定其中一项并按确定按钮后,Visual FoxPro将自动打开这种类型的应用程序,供用户输入文档的内容。 • 对话框中有一个【显示为图标】复选框,可用来确定新建的对象以图标显示,还是直接显示文档的内容。若选定该复选框,该文档在表单上显示成一个图标,表单运行时若双击图标,Visual FoxPro会调用相应的应用程序来打开文档,清除该复选框,表示在表单上直接显示文档内容。 • OLE对象和ActiveX控件添加到表单控件工具栏后,还须进行表单控件工具栏显示转换才能显示出来。 • 转换方法如下:在表单控件工具栏中选定查看类按钮,并在随后弹出的菜单中选定【ActiveX控件】命令,表单控件工具栏就会自动转换成显示OLE对象和ActiveX控件按钮的工具栏,此后用户就可使用这些按钮在表单上创建对象。图中显示了新增的Microsoft Word文档和Microsoft公式3.0两个按钮。 • 若要恢复到原状态,仍须选定查看类按钮,并在弹出菜单中选定【常用】命令即可。 • 选定【工具】【选项】命令,在如图5-26所示的“选项对话框”的【控件】选项卡中选定【ActiveX控件】选项按钮,在列表中选定所要添加的若干OLE对象和ActiveX控件复选框(例如选定Microsoft Word文档和Microsoft 公式3.0),单击“设置为默认值”按钮,单击【确定】按钮退出选项对话框。 • 注意,在图5-26中,【可插入对象】和【控件】两个复选框默认为选定,此时在选定列表框中同时显示可供插入的对象与ActiveX控件。若清除了某一复选框,列表中便将去掉相应部分的选项。 • ActiveX原来是微软公司提出的一组技术标准,其中也包括控件的技术标准。所谓ActiveX控件,就是指符合ActiveX标准的控件,其数量现已超过了1000种,例如在Windows的SYSTEM文件夹中含有大量带.OCX扩展名的文件,就都属于ActiveX控件。在本章前几节介绍的控件,仅是ActiveX控件中常见于Visual FoxPro界面的一小部分。 • 为了使Visual FoxPro能够在需要时利用更多的ActiveX控件,在“表单控件”工具栏中设置了一个英文名为Olecontrol的ActiveX控件按钮“”。 • 要删除表单控件工具栏中的OLE对象按钮或ActiveX控件按钮,可通过【工具】菜单的【选项】命令来打开“选项对话框”,并在其【控件】选项卡的列表中清除有关复选框便可。 • 选定【创建控件】选项按钮表示可由用户指定一个ActiveX控件并放置在表单上。选定该选项按钮后,插入对象对话框中将显示【添加控件】按钮,单击该按钮,弹出浏览对话框,指定Visual FoxPro的主目录的文件FPOLE.OCX,然后选择【打开】,“对象类型”列表中将出现大量ActiveX控件选项,这些都是表单控件工具栏以外可供用户选用的控件,用户选定一项后并按确定按钮,指定的ActiveX控件就会出现在表单上。 • 选定【由文件创建】选项按钮表示用户须指定一个存在的文档,并作为对象放置在表单上。 • 选定该选项按钮后,插入对象对话框中将显示一个浏览按钮和一个文本框,用户可通过浏览按钮选一文件,或在文本框中直接输入路径及文件名。按确定按钮后表单窗口内即产生一个文档对象,该文档是以图标显示,还是文件内容显示,可由显示为图标复选框指定。 • 从“表单控件”工具栏中选定ActiveX控件按钮“”,在表单中单击鼠标,屏幕上将弹出一个如图5-25所示的“插入对象”对话框。该控件的功能主要由对话框中的3个选项按钮决定,【新建】与【由文件创建】选项按钮用于添加OLE对象,【创建控件】选项按钮则用于在表单中添加一个ActiveX控件。
ActiveX绑定控件 • 显示通用型字段中的OLE对象时,应注意以下三点: • (1)在表单窗口所创建的OLE绑定型控件显示为一个含对角线的方框,用户可按需要将它拖至所期望的大小。创建的第1个OLE绑定型控件的Name属性默认为Oleboundcontrol1。 • (2)必须将控件与通用型字段绑定。就是说,应该在控件的ControlSource属性中设置通用型字段名。 • (3)表单运行时,仅当记录指针指向含有数据的通用型字段的记录时;OLE绑定型控件区域内才会显示数据。 • OLE绑定型控制可以用来显示通用字段。建立一个OLE绑定对象的步骤如下: • 在表单控制工具栏中,选择OLE绑定型控制按钮; • 移动鼠标到表单要插入控件的位置,单击鼠标;然后调整其大小; • 设置对象的ControlSource属性将OLE对象与通用字段连接起来。
表单管理 • 给表单传递参数的步骤如下: • 在表单上建立属性用来接受参数 • 例如ItemN和IremQ. • 在表单的Init事件代码中,写入接受参数语句: • PARAMETE cStr,nNo • 在表单的Init事件代码中,把参数赋给属性,如下列: • This.ItemN=cStr • This.ItemQ=nNo • 当运行表单时,在DO FORM命令中包含WITH从句。 • 如:DO FORM myform1 WITH "Ball",34 • 从表单中返回结果的步骤为: • 设置表单的WindowType属性为1,使表单具有模块化的性质。 • 在表单的Unload事件代码中,包含RETURN命令和返回值。 • 在运行表单的程序或方法的DO FORM命令中包含关键字TO。 • 如:DO FORM myform2 TO No1 • 表单参数的传递 • 表单结果的返回 • 操作表单控件 • 命名表单对象 • 操作表单对象 • 关闭一个活动的表单 • 如果在Command 窗口用DO FORM命令来运行表单,则表单对象变量是一个公共变量。可以用变量名来访问表单。 • 在程序中用DO FORM命令运行一个表单,在程序或过程结束之后,对象就消失了,但是表单仍然是可见的。 • 在DO FORM命令中使用NAME子句可以命名表单对象。 • 例如,以下两条语句运行同一个表单,但是建立了两个不同的表单对象变量: • DO FORM myform3 NAME stu1 • DO FORM myform4 NAME stu2 • 在命令窗口和程序中可用: • 表单名.Release &&表单名是由DO FORM … NAME <表单名>命令指定的表单名。 • 或 表单文件名.Release 来关闭并释放表单。
[例5-9] 在[例5-7]的表单中增加一个“选项”按钮,用来设置输入表单各项的默认值。 *将原系统的默认值保存在一组变量里 d1=2 d2=This.Parent.Optiongroup1.Value n1=This.Parent.Spinner1.Value r1=This.Parent.Spinner2.Value y1=This.Parent.Combo2.Value n2=This.Parent.Spinner3.Value r2=This.Parent.Spinner4.Value y2=This.Parent.Combo3.Value DO FORM cscdzb WITH n1,n2,a TO m &&调用子表单,传递参量n1、n2、a,返回值m IF m &&如果用户在“选项”对话框单击【确定】退出 *清除原系统默认的职称选项 FOR i=This.Parent.Combo4.ListCount TO 1 STEP -1 This.Parent.Combo4.RemoveListItem(i) ENDFOR *添加用户设置的职称选项 FOR i=1 TO ALEN(a,0) IF TYPE("a[i]")<>"C" EXIT ENDIF This.Parent.Combo4.AddListItem(a[i],i) ENDFOR *将用户设置的默认值存入表单 Thisform.d1=d1 Thisform.d2=d2 Thisform.n1=n1 Thisform.r1=r1 Thisform.y1=y1 Thisform.n2=n2 Thisform.r2=r2 Thisform.y2=y2 Thisform.szcs() &&调用自定义方法设置用户定义的默认值 ENDIF *按用户设置,设置默认值 IF This.d1=1 This.chk婚否.Value=1 ELSE This.chk婚否.Value=0 ENDIF This.Optiongroup1.Value=This.d2 This.Spinner1.Value=This.n1 This.Spinner2.Value=This.r1 This.Combo2.Value=This.y1 This.Spinner3.Value=This.n2 This.Spinner4.Value=This.r2 This.Combo3.Value=This.y2 PARAMETE n1,n2,zc &&接收参数说明语句 *将系统默认值带到选项设置窗口 This.Spinner1.Value=n1 This.Spinner3.Value=n2 FOR i=1 TO ALEN(zc,0) IF TYPE("zc[i]")<>"C" EXIT ENDIF This.List1.AddListItem(zc[i],i) &&将系统默认的职称选项添加到列表框 ENDFOR IF nKeyCOde=13 &&如果用户按了回车键 *判断输入项在列表中是否存在 t=.F. FOR i=1 TO This.Parent.List1.ListCount IF ALLTRIM(This.Value)==ALLTRIM(This.Parent.List1.List(i)) t=.T. &&列表中存在该项 EXIT ENDIF ENDFOR Thisform.t=.T. &&表明用户单击【确定】退出该对话框 *将用户设置的默认值保存在主从型变量中,从而带回主程序 d1=This.Parent.Optiongroup2.Value d2=This.Parent.Optiongroup1.Value n1=This.Parent.Spinner1.Value r1=This.Parent.Spinner2.Value y1=This.Parent.Combo2.Value n2=This.Parent.Spinner3.Value r2=This.Parent.Spinner4.Value y2=This.Parent.Combo1.Value *清空数组a原有的数据 FOR i=1 TO 100 a(i)=.F. ENDFOR *将用户设置的职称默认值保存在a数组中 FOR i=1 TO This.Parent.List1.ListCount a(i)=This.Parent.List1.List(i) ENDFOR Thisform.Release IF !t &&如果列表中不存在该项 This.Parent.List1.AddListItem(This.Value) &&将该项添加到列表中 ELSE MESSAGEBOX("该项已存在!请重新输入!") &&否则输出"该项已存在!请重新输入!" ENDIF This.Value="" &&清空文本框 Thisform.Refresh() ENDIF • 操作步骤如下: • 打开rsbwh表单,另存为cscdbd表单。在表单中添加一个“选项”命令按钮。并在该控件的Click事件中添加下列代码: • 属性设置:除了设置表单属性使外观如图所示外,还需设置列表框的属性MultiSelect的值为:.T.-真。并设置表单的属性WindosType的值为:1,这一点非常重要。定义一个表单属性,取名为:t 。 • 并在保存命令按钮的Click事件中增加一行代码: • Thisform.szcs() &&调用自定义方法设置用户定义的默认值 • 放在原代码倒数第一行的前面。 • 代码设置: • 设置表单Init事件的代码为: • 设置表单Unload事件的代码为: • 设置文本框的KeyPress事件的代码为: • 设置列表框的KeyPress事件的代码为: • 设置【确定】命令按钮的Click事件的代码为: • 设置“取消”命令按钮的Click事件的代码为: IF nKeyCOde=7 &&如果用户按了Del键 FOR i=1 to This.ListCount IF This.Selected(i) This.RemoveListItem(i) &&删除所有选中的项 ENDIF ENDFOR ENDIF • Thisform.t=.F. &&用户单击取消退出该对话框 • Thisform.Release DIME a(100) *取出系统默认的职称 FOR i=1 TO This.Parent.Combo4.ListCount a(i)=This.Parent.Combo4.List(i) ENDFOR • 定义上面代码用到的5个表单属性,和一个用户自定义方法szcs( )(请参阅6.5节),并设置属性值为:Thisform.d1:0;Thisform.d2:1;Thisform.n1:1960;Thisform.r1:1949;Thisform.y1:1;Thisform.n2:1;Thisform.r2:1;Thisform.y2:1。并设置方法szcs( )的代码为: RETURN Thisform.t &&表单的返回值 • 新建一个名为cscdzb的表单,并添加五个标签控件,一个文本框控件,两个单选框控件,一个列表框控件,两个命令按钮控件。并将cscdbd表单的输入日期的控件的组合复制过来,复制两次,设置成图5-25所示的外观。
5.3 多表单应用程序 5.3.1 MDI文档界面 • 多文档界面与单文档界面的概念 • 多文档界面(Multiple-Document Interface,简称MDI)是指应用程序主窗口中能包含多个应用程序窗口。 • 单文档界面(Single-Document Interface,简称SDI)是指应用程序窗口只允许显示和操作一个文档,此文档直接显示在应用程序窗口内。 • MDI文档界面的设计 • 表单类型:顶层表单、子表单和浮动表单 • 顶层表单:是一个没有父表单的独立表单。 • 子表单:用于创建MDI应用程序的文档窗口,它包含在另一个主窗口中。 • 浮动表单:是由子表单变化而来的,它属于父表单的一部分,但并不是包含在父表单中。
表单类型设定 1)顶层表单设定: 在“表单设计器”中将表单的 ShowWindow 属性设置为“2 - 作为顶层表单”。 2)子表单设定: 将表单的 ShowWindow 属性设置为下列值之一: 0 - 在屏幕中 (默认)。 1 - 在顶层表单中。 3)浮动表单设定: 先将表单的 ShowWindow 属性设为0或1(即子表单),然后设置Desktop属性值为.T.。
MDI应用程序的建立 建立MDI应用程序的步骤: 1)建立顶层表单; 2)建立相关的子表单; 3)在顶层表单中调用子表单。 • MDI窗口之间的参数传递 命令格式: DO FORM <子表单名> [WITH <实参表>] [TO <内存变量> ] 功能:主表单与子表单相互传递数据。 说明: (1)WITH <实参表>子句由主表单向子表单传递数据。 (2)TO <内存变量>子句从子表单返回的值存入到<内存变量>中。
(3)在子表单的Init事件代码中应该有如下代码来接受主表单中WITH <实参表>的数据: PARAMETERS <形参表> <实参表>和<形参表>中的参数用逗号分隔,<形参表>中的参数数目不能少于<实参表>中的参数数目。多余的参数变量赋值为.F.。 主表单带参数调用子表单,要求子表单WindowtType属性值要设为1-模式表单。 [例5-10]创建如下所示的顶层表单以及子表单,要求用户从子表单中输入的圆半径值,在主表单中求出相应的圆周长和圆面积。
主表单向子表单传递数据 设计步骤: • 设计主表单(circle.scx) 新建表单,进入表单设计器,增加4个标签,3个文本框和2个命令按钮。 编写程序代码: 编写【输入半径】按钮Command1的Click事件代码: bj=THISFORM.Text3.Value DO FORM radius WITH bj TO r THISFORM.Text1.Value=2*pi()*r THISFORM.Text2.Value=pi()*r^2 THISFORM.Text3.Value=r • 设计子表单(radius.scx) 新建表单,进入表单设计器,增加1个标签,1个文本框和1个命令按钮。 用户定义属性:R,初始值为0。 编写程序代码: radius.scx表单的Init事件代码: PARAMETERS bj
带参返回调用 radius.scx表单的Activate事件代码: THISFORM.Text1.Setfocus radius.scx表单的Unload事件代码: RETURN THISFORM.R 编写【确定】按钮Command1的Click事件代码: THISFORM.R=THISFORM.Text1.Value THISFORM.Release
5.3.2 表单集 表单集(Formset)是一个容器,其中可包含多个表单,并将这些表单作为一个组进行操作。 表单集具有以下优点: (1)可同时显示和隐藏表单集中的表单。 (2)能可视化地调整各个表单的相对位置。 (3)由于表单集及其所有的表单都存储在同一个.SCX文件中,因而共享一个数据环境,数据表关联后,在一个表单中的父表移动记录指针,在另一个表单中的子表的记录指针也相应移动。 (4)运行表单集时,将加载表单集中所有表单和表单的所有对象。
表单集的建立及相关操作 打开“表单设计器”,从【表单】菜单中,选择【创建表单集】命令,即可建立一个新的表单集Formset1,它在“属性”窗口的对象列表中。 • 添加新表单:主菜单的【表单】菜单,选择【添加新表单】命令 • 删除表单:首先选择要删除的表单,然后从主菜单的【表单】菜单,选择【移除表单】命令,删除选定的表单。 • 删除表单集:如果表单集中只剩一个表单,则可删除表单集。 • 表单集的释放:命令RELEASE THISFORMSET或设置为随最后一个表单的释放而自动释放,此时表单集的AutoRelease属性为.T.。
[例5-11]利用表单集建立如下所示增资情况查询表单zzcx.scx。[例5-11]利用表单集建立如下所示增资情况查询表单zzcx.scx。
步骤1:新建表单集zzcx.scx 步骤2:向表单集添加新表单 步骤3:设置数据环境 步骤4:设置Form1和Form2表单 (1)设置Form1:将数据环境中rsb.dbf窗口的标题栏拖放到Form1表单中,产生一个人事表表格。在表格的上方添加1个标签和1个命令按钮。 编写【结束】按钮Command1的Click事件代码: RELEASE THISFORMSET (2)设置Form2:将数据环境中zz.dbf窗口的标题栏拖放到Form1表单中,产生一个增加工资的表格。
5.4 类 5.4.1 基本概念 • 类的基本概念 • 类(class) :类是对一组具有相同属性和方法的对象的抽象,是对象的原型。 • 对象(object):是将数据和对该数据的所有必要操作的代码封装起来的程序模块,即对象是包含属性(数据)和行为(方法)的逻辑实体。 • 基类(base class) :基类是VFP系统定义的类,它是用户创建新类的基础。
父类(parent class)和子类(subclass):以某个类的定义为起点派生出来的新类称为子类,前者称为父类。子类将继承父类的全部特征。 • 用户定义类(user-defined class) : 是指由基类派生出来的子类,VFP还允许从用户定义类再派生出子类,因此用户定义类可以是子类,也可作为父类。 • 容器类(container classes)和控件类(control clases): • 类库(class library):类库是用来存储以可视方式设计的类的文件,其文件扩展名为.VCX。
类的特征 • 类的继承性:是指用户可以通过已经存在的类来构造出新类,新类继承该类的所有属性和事件,并加以扩充。 • 类的封装性 :封装就是指将对象的方法程序和属性代码包装在一起。类的封装性指类的内部信息对于用户是屏蔽的,内部的复杂性可以被隐藏起来,仅保留出封装的外部接口。 • 类的多态性:所谓类的多态性,指在类的层次结构中,各层中的对象对同名方法程序或属性的调用是不同的,进而产生完全不同的行为。
5.4.2 用户定义类 用户也可以在已有基类的基础上,创建自己的子类——用户定义类。 • 建立用户定义类 创建步骤: 步骤一:打开“新建类”对话框: 菜单【文件】→【新建】命令→在“新建”对话框中,选择【类】,然后单击【新建文件】按钮。 步骤二:在“新建类”对话框中设定新建类的类名、父类和类库: 步骤三:在“类设计器”窗口中进行设置操作:“类设计器”窗口与“表单设计器”窗口相同,在“属性”窗口中可以查看和编辑类的属性,在“代码”编辑窗口中可以编写各种事件和方法程序的代码。
指定新类从哪个类派生出来的。可以从列表框中选择系统给出的基类。 输入要创建的类名 用于输入新类库名或指定已有库类的名字。
[例5-12]新建一个带“退出”按钮的用户定义类,它继承命令按钮(CommandButton)基类,类名为“退出”,存于新类库名mylib.vcx中。 步骤一:打开“新建类”对话框:在命令窗口中使用命令:CREATE CLASS 步骤二:设置“新建类”对话框:在“类名”文本框中输入退出,在“派生于”下拉列表中选择CommandButton作为基类,在“存储于”文本框中输入mylib.vcx。 步骤三:设置“退出”类属性与事件:在“类设计器”中,设置退出类的Caption属性值由“Command1”改为“退出”,然后再双击这个“退出”按钮,打开代码输入窗口,为Click事件编写如下代码: THISFORM.Release