登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

你的世界是否有我?

幸福就是你爱的人正爱着你!

 
 
 

日志

 
 

VF表单设计  

2008-08-05 16:03:13|  分类: 学习资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

设置菜单的SDI属性

通过设置用户菜单的顶层表单(SDI)属性,可以扩大用户菜单的使用范围。对于没有设置顶层表单属性的菜单,一般只允许在VFP 6页框中使用,设置后的用户菜单系统不仅能够在页框中使用,也可以在用户定义的顶层表单中使用。

对用户菜单设置SDI属性,其操作步骤如下:

⑴单击“显示”菜单中的“常规选项”命令,弹出“常规选项”对话框。

⑵在“常规选项”对话框中,选中“顶层表单”复选框,然后单击“确定”按钮。

如果在一个SDI表单里使用SDI菜单,应在“表单设计器”窗口中把表单的“ShowWindow”属性设置为“2-顶层表单”,然后在表单的Init事件里调用SDI菜单程序。例如,某一SDI菜单名为MyMenul.mpr,在表单的Init事件里包含下列语句即可调用SDI菜单:

Do MyMenul.mpr With This, .T.

 

例如:设计了一个表单集(NAME值为FORMSET1),文件名为FORM1.SCX,里有两个表单(NAME值分别:FORM1和FORM2)。  

  在FORM1中设计两个按钮COMMMAND1和COMMAND2,其CLICK事件分别为:  

  *COMMAND1.CLICK  

  THISFORM.PARENT.FORM2.HIDE  

   

  *COMMAND2.CLICK  

  THISFORM.PARENT.FORM2.SHOW  

   

  运行表单集FORM1  

   

  DO   FORM   FORM1  

   

  这时表单集中的FORM1   和FORM2均运行了。  

   

  然后单击表单集中FORM1的COMMAND1,FORM2隐藏,单击COMMAND2,FORM2显示  

     设计了一个表单集(NAME值为FORMSET1),文件名为FORM1.SCX,里有两个表单(NAME值分别:FORM1和FORM2)。  

   

  在FORM1中设计1个“打开”按钮,其CLICK事件分别为:  

  THISFORM.HIDE  

  THISFORM.PARENT.FORM2.SHOW  

   

  在FORM2中设计1个“关闭”按钮,其CLICK事件分别为:  

  THISFORM.HIDE  

  THISFORM.PARENT.FORM1.SHOW  

   

  表单集(FORMSET1)的INIT事件:  

  THIS.FORM2.HIDE  

   

  运行表单集FORM1:  

  DO   FORM   FORM1  

   

  这时只有表单集中的FORM1运行,然后单击FORM1中的“打开”按钮,FORM1隐藏,FORM2显示,  

  再单击FORM2中的“关闭”按钮,FORM2隐藏,FORM1显示。

thisformset.form1.hide()   &&隐藏第一个表单  

  thisformset.form2.show()   &&显示第二个表单  

   

 在VFP中我们可以用run来调用由VFP自身生成的.exe文件。命令格式:      

run    c:\..\*.exe      

    当调用非VFP自身生成的.exe文件时,需要加上绝对路径和参数。      

一般来说,用VFP运行非VFP自身生成的可执行文件时,会有一个黑色的窗口显示一下。可以通过加上/n来隐藏这个窗口。例如运行Windows下的扫雷游戏,命令格式如下:      

RUN/n    C:\Windows\Winmine.exe      

可以调用Windows的文件关连来打开文件。即所有的文件都用系统默认的程序来打开。这就要调用Windows的Win32 API函数。调用方式如下:  

DECLARE INTEGER ShellExecute IN shell32.DLL    INTEGER    HWND,;          

STRING    lpszOP,;          

STRING    lpszFile,;          

STRING    lpszParams,;          

STRING    lpszDir,;          

INTEGER   fsshowcmd          

DECLARE INTEGER GetDesktopWindow  IN  win32api          

HWND = GetDesktopWindow()          

lpszOP = "open"          

*指定要打开的文件名      

lpszFile="d:\极品时刻\jpskb.exe"      

lpszParams = ""          

lpszDir= "d:\temp"          

fsshowcmd =1      

*执行ShellExecute命令          

LNRETURN =ShellExecute(HWND,lpszOP,lpszFile,lpszParams,lpszDir,fsshowcmd)   

run/n C:\WINDOWS\system32\calc.exe

run/n c:\windows\system32\winmine.exe

run/n C:\Program Files\AutoCAD 2004\acad.exe

 

第一章:

1.数据管理经历了以下几个阶段:手工管理,文件系统,数据库系统,分布式数据库系统,面向对象的数据库系统.其中数据开始独立于程序的阶段是:数据库系统,数据库系统的高级阶段是面向对象的数据库系统.

2.数据库是相关的数据的集合,管理的是表及表间联系,一个具体的数据库就是一个实际的关系模型.

3.实体:客观存在,而又相互区别的事物.可以是具体的事物,也可以是抽象的概念.

例如:学生,学生选课.

实体型:抽象实体的外型,是属性的集合,是一种实体类型.相当于表的结构.

实体集:同类实体的集合,相当于一个表中的所有的记录.

4.实体或称表之间的联系的类型分为三种:一对一,一对多,多对多.

要建立两个表多对多的关系,只需要建立第三方表--纽带表,来实现两个一对多的关系.

5.关系术语:

a.关系:二维表.在vfp中,表现为一个扩展名为.dbf的表文件.

b.关系模式:对应于关系的结构,相当于表结构.

c.元组:二维表水平方向的行.在vfp中,又叫记录

d.属性:二维表垂直方向的列,又叫字段.

e.域:属性的取值范围.例如逻辑型字段的域:逻辑真或者是逻辑假.

f.关键字:能够唯一标记一个元组的属性或者是属性的组合.(字段或者是字段组合) ,分为两种:主关键字和

候选关键字.主关键字不仅可以体现关键字的特征,而且还用于和其它表发生联系.

g.外部关键字:不是本表的关键字,却是另外一个表的关键字(主关键字或者是候选关键字).这个字段就是外部关键字,一般用外部关键字来保证表之间的联系.

6.关系的特点:

a. 关系必须规范化.(关系模式必须满足一定的要求.),最基本的要求是表中的属性不可分割,即表中不能再包含表

b. 关系中不能有相同的元组或者是属性(重复记录或者重名的字段)

c. 关系中的元组和属性的次序无关紧要.(对表中排序体现了关系的特点------表中的记录的顺序无关紧要)

7.数据模型分为三种:层次模型,网状模型,关系模型(用二维表来描述实体与实体之间的联系)

8.关系的基本运算有两类:传统的集合运算(并,交,差),专门的关系运算(选择,投影,联接)

传统的集合运算:并,交,差.要求参于运算的两个关系(表)必须具有相同的关系模式(表结构)

并:包含两个表中的所有的记录.(查询的并运算的优先级为union)

交:两个关系(表)中都有的元组(记录)

差:从一个关系中去掉另一个关系中也有的元组,剩下的元组.(记录)

专门的关系运算:选择,投影和联接.

选择:从关系(表)中找出条件满足的元组(记录).在sql select中主要用where 条件来实现选择操作.

投影:从关系(表)中找出若干属性(字段).在sql select 中用select 来实现关系的投影操作.

联接:两个或者是多个关系的模向组合,即形成一个更大的关系.在sql select 中主要用join来实现其操作.

等值联接:两个表根据公共字段相等进行的联接.(inner join)

自然联接:去掉重复属性值的等值联接.

9.数据库设计的步骤:

需求分析,确定所需要的表,确定所需的字段,确定表之间的联系.设计求精.

10.visual foxpro是一个32位关系数据库管理系统,是一个可运行于windows95,windows98,windows NT的可视 化,面向对象的编程语言.

第二章:

1.Visual Foxpro有三种工作方式:1.用菜单或者是工具栏.2.在命令窗口直接输入命令.3.利用各种生成器来自动产生程序,或者是编写foxpro程序(命令文件)来执行它.

2.菜单项后面有"...",表示会弹出一个菜单.

3.用dir命令可以显示当前目录下的表的信息.用clear命令表示清除主屏幕的内容.

4.ctrl+F2表示显示命令窗口.ctrl+F4表示隐藏命令窗口.

5.项目管理器的各个选项卡的功能:

数据:管理数据库,自由表,查询.

文档:管理表单,报表,标签

代码:管理程序,API库,应用程序.

其它:管理菜单,文本文件和其它文件.

6.有关工具栏的操作:均在显示菜单下的工具栏实现.

a.显示和隐藏工具栏.b.可以新建一个用户自己的工具栏.

c.可以修改(定制)用户和系统的工具栏d.可以删除用户自己的工具栏.但是不能删除系统的工具栏.

e.可以重置系统的工具栏.

7.可以定制vfp的运行环境,通过工具/选项下进行.

区域选项卡:设置日期和时间的显示方式,小数位以及货币的符号.

表单:可以设置表单的默认大小.

语法着色:可以设置程序代码的颜色.

文件位置:可以设置默认目录和帮助文件.

这种设置可以是永久的,也可以是临时的.当设置完毕后,直接按确定,这种设置只在本次运行vfp时有效,因为它是保存在内存中,内存在每次退出vfp时自动释放.当设置完毕后,设置为默认值后,再按确定,这种设计永久有效,因为它保存在windows注册表中.

8.vfp新增了很多向导,有新的应用程序向导,新的连接向导,新的数据库向导,新的Web发布向导,新的示例向导.

9,打开不同文件时,系统会自动调出相应的设计器.

第四章:

1.表分别两种:数据库表,自由表.

数据库表可以设计长表名,长字段名,可以设置字段有效性规则,违反规则时的提示信息,默认值,格式,输入掩码以及在浏览时显示的标题和记录级规则.

数据库长表名可以长达128个字符,字段名长达128个字符,自由表的字段名和表名最长只能为10个字符.

2.记录查找的命令:

locate for ....定位到条件满足的第一条记录

continue...定位到条件满足的下一条记录

seek 值---索引查找.

都可以用found()函数来测试是否找到结果.

3.索引分为四种:主索引,候选索引,唯一索引,普通索引.

主索引:体现主关键字的功能,索引字段不能重复.一般用于和其它表建立联系.自由表没有主关键字,因此自由表不能建立主索引.

候选索引:体现候选关键字的功能.索引字段也不能重复.

唯一索引:索引字段值重复的记录,在索引项中只出现第一条记录.(一般用来统计类别)

普通索引:一般默认情况下建立的索引,都是普通索引,索引字段可以重复.一般用于建立一对多联系的体现外部关键字的功能.

4.索引根据参与索引的字段的多少,又可以分为单项索引,复合字段索引.

单项索引:参与索引的字段只有一个,可以通过选择字段之后的一种索引顺序,然后转到索引选项卡中去

改其索引的类型和索引名。

复合字段索引:参与索引字段有多个。建立索引时,必须在索引选项卡中输入,而且索引表达式是:

字段1+字段2+字段3...(要求字段1,字段2,字段2具有相同的类型,如果不是同种类型,必须将其转换为

同种类型。

5.索引文件: 存放索引的文件。根据其中索引的个数,可以将其分为单索引文件,复合索引文件(又分为

结构索引文件和非结构索引)

单索引文件(里面只包含一个索引),扩展名为.idx,这种文件不会随表文件打开与打开.

复合索引文件:扩展名为.cdx ,文件名和表文件名同名的索引文件为结构索引文件.这种文件会随着表文件的打开而打开.另一种文件名和表文件名不同名,扩展名为.cdx.这种文件不会随表文件打开而打开.

单索引文件和非结构复合索引文件在使用其中的索引项时,必须首先用命令打开.

set index to 索引文件名(单索引文件名或者是非结构复合索引文件名)

6.如何设置当前索引:

set order to 索引名

7:使所有的索引项都不成为当前索引:

set order to

8.建立索引: (新建的索引自动成为当前索引)

index on 索引表达式 tag 索引项名[unique ][candidate]

unique 表示建立的索引为唯一索引.

candidate :表示建立的索引为候选索引.

没有这两个选项表示建立的索引为普通索引,用命令的方式不能建立主索引.自由表不能建立主索引.

9.删除索引项

delete tag 索引名 &&删除指定的索引

delete tag all &&删除表中的所有的索引.

10.数据完整性分为三种:实体完整性,域完整性,参照完整性.

实体完整性:即保证表中的记录的唯一性.主要通过关键字来保证的.关键字的功能通过索引来实现.

域完整性:表中的字段在哪些范围内有意义.一般来说,表中有关字段的定义(类型,宽度,小数位,规遇等)

都属于域完整性.

参照完整性:建立了联系的表之间在进行某些操作(更新,删除,插入)时,必须满足的条件.主要分为更新规则,删除规则和插入规则.(更新规则,删除规则又分为级联,限制,忽略.插入规则又分为限制和忽略)

11.工作区:

总共有32767个工作区,一个工作区同一时刻只能打开一个表,因此同一时刻可以打开32767个表.

工作区号从1--32767,每个工作区都有一个工作区别名 1--10:工作区别名为A-J,11-32767工作区别名为W11-W32767

12.可以通过set relation 命令建立两个表之间的临时关联,通过这种关联可以实现A表的指针带动B表指针的移动。

第五章:

1.sql语言的全称:structured query language (结构化查询语言),它有四种功能:

数据查询:(select 语句),数据定义(create,alter,drop ),数据操作(insert, update,delete ),数据控制.其中sql的核心是查询.

2.集合的并运算的运算符为union.

3.能够表示存在结果的谓词是exists

4.量词any和some 是同一种意思,表示任意一个.而all代表所有.

5.利用空值查询应该是: 字段 is null

6.超联接查询:(vfp自身联接)有四种内联接(inner join ),左联接(left join),右联接(right join ),全联接(full join),这种联接条件是出现在on 短语中.

7.查询去向有:表(into table <表名>),临时表(into cursor 临时表名),文本文件(to file 文本文件名),

屏幕(to screen),数组(into array 数组名).

当to 短语和into 短语同时出现时,优先考虑into 短语,即忽略to 短语.

8.要查询前几条记录:使用top n短语,当查询前n%的记录,用 top n percent ,注意:top n [percent ] 必须与order by 连用.

9.删除表的命令是: drop table 表名

删除视图的命令是: drop view 视图名

第六章:

1.查询是一个预先定义好的select 语句,扩展名为.qpr, 是一个只读文件.

2.视图是一个由基本表导出的虚表,只是作为视图的一个浏览窗口,实际并不存储数据,在磁盘上没有文件,因此在对视图进行任何操作时,必须首先打开数据库.视图可以像表一样用use 命令打开,可以用use 命令关闭,可以用browse命令浏览,可以用select 语句检索,但是不能用modify structure修改结构.

3.视图不仅可以查询基本表,还可以更新基本表,(通过更新条件)但是必须发送sql更新.

4.查询设计器不能设计所有的查询.(它只能建立简单查询和多个表之间的联接查询,但是不能设计嵌套等查询)

5.查询和视图的区别:

查询有查询去向,视图没有.视图有更新条件,而查询没有.(视图更新基本表,查询不能更新)

第七章:

1. 注释行以NOTE或*开头,在命令行后面添加注释用&&

2. set talk off ---关闭人机对话.

3.cancel: 强行终止程序执行,返回到命令窗口.

return:结束当前程序的执行,返回到调用点.

quit:退出vfp(释放内存)

4.用do 命令执行程序文件时,如果没有指定扩展名,系统执行程序文件的先后顺序是:.exe(可执行文件),.app(应用程序文件),fxp(程序编译文件),.prg(程序文件)

5.简单的输入输出命令有三种:

input ,accept ,wait

input 可以接受所有类型的数据.因此在输入时,必须加上相应的数据类型的定界符.

accept :只能接受字符型的数据.在输入时,不需要加定界符,系统会自动为其加上字符型的定界符.

如果输入的数据中含有字符型的("",'',[]),系统会将其认为是字符串本身的一部分.

wait :只能接受单个字符.

如果要求一个命令接受一个字符型的数据(不是单个字符),这时优先考虑用accept.

6.程序的基本结构:顺序结构,选择结构,循环结构.

选择结构:if...else ...endif,do case....case ...endcase ,选择结构本身也是一种顺序结构

循环结构: do while ......enddo

for....endfor(计数循环)

scan for....endscan (扫描循环)

在for ...endfor中当步长缺省为1,循环变量,初值,终值只在循环最初被计算一次.

当步长为正数时,循环变量小于等于(<=)终值时,循环条件为.t.

当步长为负数时,循环变量大于等于(>=)终值时,循环条件为.t.

在循环体中可以有loop,exit

loop:是提前结束本次循环,进入下一次循环(即在本次循环中不执行loop后面的语句,而是直接转到do while 处重新判断条件是否为.t.

exit :表示强制性的终止(跳出)循环,转到enddo 的后面.

7.参数传递,变量的作用域:请大家看笔记

第八章:

请大家在上机过程中总结,并且看一下有关控件的一些属性和一些方法,以及一些常用的事件.

第九章:

1.vfp的菜单分为两种:条形菜单和弹出式菜单.无论是哪一种类型的菜单,当选择其中的某个菜单项时,会有一定的动作(结果):可以是执行一条命令,可以是执行一个过程,激活子菜单.

2.典型的菜单系统一般是一个下拉式菜单,由一个条形菜单加一组弹出式菜单组成.其中条形菜单为主菜单,弹出式菜单作为子菜单.

快捷菜单是由一个或一组弹出式菜单组成.

3.可以通过set sysmenu 命令可以允许或者是禁止在程序执行时访问系统菜单,也可以重新配置系统菜单.

set sysmenu on 允许程序执行时访问系统文件.

set sysmenu off 禁止程序执行时访问系统菜单.

set sysmenu to default :恢复系统菜单.

set sysmenu save:将当前菜单设置成系统菜单.

set sysmenu nosave:系统菜单恢复成标准配置.

要想返回到vfp的系统菜单的标准配置,可以首先执行set sysmenu nosave然后执行set sysmenu to default 命令.

4.在菜单设计器的窗口.可以定义一个菜单.其中有三列:菜单名称,结果,选项.

菜单名称列:指定菜单项的名称,也就是标题.可以为菜单设置一个热键(即在菜单名称的前面或者是后面加上\<字母)

可以为菜单之间添加分组线:即在两个菜单项之间插入新菜单项,菜单项名称列中输入"\-"

结果列:选择菜单项时引发的结果:子菜单(submenu),菜单项(pad name ),过程(procedure),命令(command)

选项列:可以为菜单项设置快捷键.(选中键标签,按下相应的快捷键即可),可以为菜单项设置跳过条件(即当此条件为.t.时,菜单项为灰色,不可使用),可以为菜单项设置在状态栏上的功能提示.

5. 如何从下级返回到上一级,选择菜单级中的菜单栏,如何从上级进入下级,选择子菜单,编辑即可.

6.如何插入一个标准系统菜单命令:(插入栏)

选中某个菜单项,选择"插入栏"按钮,在其中选择菜单命令,确定即可.(只能在弹出式菜单中插入栏)

7.如何为顶层表单添加菜单:(假设菜单,表单都已建立)

a.在菜单设计器中,将"显示"菜单下的"常规选项"中的"顶层表单"复选框选中,使其归顶层表单调用.

b.将表单的showwindow属性设计为2,使其作为顶层表单.(即作为单独的一个窗口)

c.在表单的init事件中调用菜单

do 菜单程序文件名.mpr with this

d.在表单的destroy事件中书写释放(清除)菜单的命令:

release menu 菜单文件名

8.快捷菜单一般在对象(控件)的rightclick事件中调用:

do 快捷菜单程序文件名.mpr

9.释放快捷菜单是在菜单设计器中的"显示"菜单下"常规选项"的"清理"事件中书写:

release popups 快捷菜单程序文件名.mpr

10.数据环境的对象会随着表单或者是报表的打开而打开,关闭而关闭.

第十章:

1.报表设计主要包括两部分内容:数据源和布局

报表数据源:可以是数据库表或者是自由表,视图,查询或者是临时表.

常用报表布局有四种:列报表,行报表,一对多报表和多栏报表.

2.如何为报表设计数据源:只需要将报表的数据源添加到数据环境中即可.

2.报表中用于排序和分组字段(表达式)必须建立了索引,而且要成为当前索引.

要想成为当前索引,只需要在数据环境设计器中右键单击表,选属性,再选order属性,将order属性设置为 当前索引的索引项.

3.标签:用于在报表上显示一些不需要改变的文字.

域控件:用于显示字段,内存变量或者是表达式的值.

图片/activex绑定控件:用于显示图片或者是通过型字段的内容.

4.如何设计分栏报表:"文件"菜单下的"页面设置",将列数改为>1,列数及栏数.

或者是用向导建立报表时,改变列数.

 

 

VF中通过菜单调用一个按钮的click事件代码是怎么实现? 比如,我点“录入数据”菜单选项,直接调用表单上的“添加”按钮的click事件。

 

可以建立一个窗口的菜单选项,过程如下:

在窗体上右键-->菜单编辑器

然后在标题这儿输入菜单显示的名字(就相当于caption,如录入数据)

然后名称是这个菜单的名字

确定

回到窗体,就会多出一个菜单,单击这个菜单,就会有这个菜单的click事件了.然后就可以编辑写代码了

为顶层表单添加下拉式菜单的方法和过程如下。

  (1)在“菜单设计器”窗口中设计好下拉式菜单。

  (2)打开“常规选项”对话框,选中对话框右下角的“顶层表单”复选框。

  (3)将表单的ShowWindow属性设置为2,使之成为顶层表单。

  (4)在表单的Init事件中添加调用菜单的程序代码:

        DO<文件名>WITH This[,“<菜单名>”]

  此处的<文件名>是指被调用的菜单程序文件(MPR),<菜单名>是为被添加的下拉式菜单的条形菜单指定的一个内部名字。

  (5)在表单的Destroy事件中添加清除菜单的程序代码:

        RELEASE MENU<菜单名>[EXTENDED]

  其中EXTENDED表示在清除条形菜单时一起清除其下属的所有子菜单。

9.3 快捷菜单设计

考点7 快捷菜单的建立与执行

  与下拉式菜单相比,快捷菜单没有条形菜单,只有弹出式菜单。建立快捷菜单的方法和过程如下。

  (1)打开“新建”对话框二

  (2)在“新建”对话框中选择“菜单”选项.单击“新建文件”按钮。

  (3)在“新建菜单”对话框中选择“快捷菜单”选项,打开“快捷菜单设计器”窗口。

  (4)用与设计下拉式菜单相似的方法,在“快捷菜单设计器”窗口中设计快捷菜单,生成菜单程序文件。

  (5)在快捷菜单的“清理”代码中添加清除菜单的命令,使得在选择、执行菜单命令后能及时清除菜单,释放其所占用的内存空间,格式为:

        RELEASE POPUPS<快捷菜单名>[EXTENDED]

  (6)在设计器环境下,选定需要添加快捷菜单的对象。

  (7)在选定对象的RightClick事件代码中,添加调用快捷菜单程序的格式为:

          DO<快捷菜单程序文件名>

    此处的文件扩展名MPR不能默认。

第8章 表单设计与应用考点归纳

     8.1 面向对象的概念

     一、对象与类

     1.对象(Object)

     客观世界里的任何实体都可以被看作是对象。对象可以是具体的物体,也可以指某些概念。

     2.类(Class)

     类和对象关系密切,但并不相同。类是对一类相似对象的性质描述,这些对象具有相同的性质:相同种类的属性以及方法。类好比是一类对象的模板,有了类定义后,基于类就可以生成这类对象中任何一个对象。这些对象虽然采用相同的属性来表示状态,但它们在属性上的取值完全可以不同。这些对象一般有着不同的状态,且彼此间相对独立。

     二、子类与继承

     在面向对象的方法里,继承是指在基于现有的类创建新类时,新类继承了现有类里的方法和属性。之外,可以为新类添加新的方法和属性。这里,我们把新类称为现有类的子类,而把现有类称为新类的父类。

     一个子类的成员一般包括:

     ①从其父类继承的成员,包括属性、方法;

     ②由子类自己定义的成员,包括属性、方法。

     继承可以使在一个父类所作的改动自动反映到它的所有子类上。这种自动更新节省了用户的时间和精力。例如,当为父类添加一个属性时,它的所有子类也将同时具有该属性。同样,当修复了父类中的一个缺陷时,这个修复也将自动体现在它的全部子类中。

     8.2 Visual FoxPro基类简介

     在Visual FoxPro环境下,要进行面向对象的程序设计或创建应用程序,必然要用到Visual FoxPro系统提供的基础类,即Visual FoxPro基类。

     一、Visual FoxPro基类

     Visual FoxPro基类是系统本身内含的、并不存放在某个类库中。用户可以基于基类生成所需要的对象,也可以扩展基类创建自己的类。

     二、容器与控件

     Visual FoxPro中的类一般可分为两种类型:容器类和控件类。相应地,可分别生成容器(对象)和控件(对象)。

     控件是一个可以以图形化的方式显示出来并能与用户进行交互的对象,例如一个命令按钮、一个文本框等。控件通常被放置在一个容器里。容器是一种特殊的控件,它能包容其他的控件或容器,例如一个表单、一个表格等。这里把容器对象称为那些被包容对象的父对象。

     三、事件

     事件是一种由系统预先定义而由用户或系统发出的动作。事件作用于对象,对象识别事件并作出相应反应。事件可以由系统引发,比如生成对象时,系统就引发一个Init事件,对象识别事件,并执行相应的Init事件代码。事件也可以由用户引发,比如用户用鼠标单击程序界面上的一个命令按钮就引发了一个Click事件,命令按钮识别该事件并执行相应的Click事件代码。

     8.3 创建与管理表单

     一、创建表单

     创建表单一般有两种途径:(1)使用表单向导创建表单;(2)使用表单设计器创建、设计新的表单或修改已有的表单。

     二、管理表单属性和方法

     可以根据需要向表单添中任意数量的新属性和新方法,并像引用表单的其他属性和方法那样引用它们。

     三、常用事件与方法

     1.Init事件

     2.Destroy事件

     3.Error事件

     4.Load事件

     5.Unload事件

     6.GotFocus事件

     7.Click事件

     8.DblClick事件

     9.RightClick事件

     10.InteractiveChange事件

     11.Release方法

     12.Refresh方法

     13.Show方法

     14.Hide方法

     15.SetFocus方法

     8.4 表单设计器

     一、表单设计器环境

     表单设计器启动后,Visual FoxPro主窗口上将出现“表单设计器”窗口、“属性”窗口、“表单控件”工具栏、“表单设计器”工具栏以及“表单”菜单。

     二、控件的操作与布局

     1.控件的基本操作

     在表单设计器环境下,经常需要对表单上的控件进行移动、改变大小、复制、删除等操作。

     ①选定控件

     ②移动控件

     ③调整控件大小

     ④复制控件

     ⑤删除控件

     2.控件布局

     利用“布局”工具栏中的按钮,可以方便地调整表单窗口中被选控件的相对大小或位置。“布局”工具栏可以通过单击表单设计器工具栏上的“布局工具栏”按钮或选择“显示”菜单中的“布局工具栏”命令打开或关闭。

     3.设置Tab键次序

     当表单运行时,用户可以按Tab键选择表单中的控件,使焦点在控件间移动。控件的Tab次序决定了选择控件的次序。Visual FoxPro提供了两种方式来设置Tab键次序:交互方式和列表方式。

     三、数据环境

     可以为表单建立数据环境,数据环境中能够包含与表单有联系的表和视图以及表之间的关系。通常情况下,数据环境中的表或视图会随着表单的打开或运行而打开,并随着表单的关闭或释放而关闭。可以用数据环境设计器来设置表单的数据环境。

     1.数据环境的常用属性

     2.打开数据环境设计器

     3.向数据环境添加表或视图

     4.从数据环境移去表或视图

     5.在数据环境中设置关系

     6.在数据环境中编辑关系

     7.向表单添加字段

     8.5 常用表单控件

     一、标签(Label)控件

     标签是用以显示文本的图形控件,被显示的文本在Caption属性中指定,称为标题文本。标签的标题文本不能在屏幕上直接编辑修改,但可以在代码中通过重新设置Caption属性间接修改。标签标题文本最多可包含的字符数目是256。

     标签具有自己的一套属性、方法和事件,能够响应绝大多数鼠标事件。可以使用TabIndex属性为标签指定一个Tab次序,但标签并不能获得焦点,而是把焦点传递给Tab键次序中紧跟着标签的下一个控件。

     常用的标签属性:

     1.Caption属性

     2.Alignment属性

     二、命令按钮(CommandButton)控件

     命令按钮用来启动某个事件代码、完成特定功能,如关闭表单、移动记录指针、打印报表等。

     1.Default属性和Cancel属性

     2.Enabled属性

     3.Visible属性

     三、命令组(CommandGroup)控件

     命令组是包含一组命令按钮的容器控件,用户可以单个或作为一组来操作其中的按钮。

     在表单设计器中,为了选择命令组中的某个按钮,以便为其单独设置属性、方法或事件,可采用以下两种方法:一是从属性窗口的对象下拉式组合框中选择所需的命令按钮;二是用鼠标右键单击命令组,然后从弹出的快捷菜单中选择“编辑”命令,这样命令组就进入了编辑状态,用户可以通过鼠标单击来选择某个具体的命令按钮。这种编辑操作方法对其他容器类控件(如选项组控件、表格控件)同样适用。

     1.ButtonCount属性

     2.Buttons属性

     3.Value属性

     四、文本框(TextBox)控件

     文本框是Visual FoxPro里一种常用的控件。用户利用它可以在内存变量、数组元素或非备注型字段中输入或编辑数据。所有标准的Visual FoxPro编辑功能,如剪切、复制和粘贴,在文本框内都可使用。文本框一般包含一行数据。文本框可以编辑任何类型的数据,如字符型、数值型、逻辑型、日期型和日期时间型等。如果编辑的是日期型或日期时间型数据,那么在整个内容被选定的情况下,按“+”或“-”,可以使日期增加一天或减少一天。

     1.ControlSource属性

     2.Value属性

     3.PasswordChar属性

     4.InputMask属性

     五、编辑框(EditBox)控件

     与文本框一样,编辑框也用来输入、编辑数据,但它有自己的特点:

     ①编辑框实际上是一个完整的字处理器,利用它能够选择、剪切、粘贴以及复制正文;可以实现自动换行;能够有自己的垂直滚动条;可以用箭头键在正文里面移动光标。

     ②编辑框只能输入、编辑字符型数据,包括字符型内存变量、数组元素、字段以及备注字段里的内容。

     1.AllowTabs属性

     2.HideSelection属性

     3.ReadOnly属性

     4.ScrollBars

     5.SelStart属性

     6.SelLength属性

     7.SelText属性

     六、复选框(CheckBox)控件

     一个复选框用于标记一个两值状态,如真(.T.)或假(.F.)。当处于“真”状态时,复选框中显示一个对勾();否则,复选框内为空白。

     1.Caption属性

     2.Value属性

     3.ControlSource属性

     七、选项组(OptionGroup)控件

     选项组又称为选项按钮组,是包含选项按钮的一种容器。一个选项组中往往包含若干个选项按钮,但用户只能从中选择一个按钮。当用户选择某个选项按钮时,该按钮即成为被选中状态,而选项组中的其他选项按钮,不管原来是什么状态,都变为未选中状态。被选中的选项按钮中会显示一个圆点。

     1.ButtonCount属性

     2.Value属性

     3.ControlSource属性

     4.Buttons属性

     八、列表框(ListBox)控件

     列表框提供一组条目(数据项),用户可以从中选择一个或多个条目。一般情况下,列表框显示其中的若干条目,用户可以通过滚动条浏览其他条目。

     九、组合框(ComboBox)控件

     组合框与列表框类似,也是用于提供一组条目供用户从中选择。上面介绍的有关列表框的属性、方法,组合框同样具有(除MultiSelect外),并且具有相似的含义和用法。组合框和列表框的主要区别在于:

     ①对于组合框来说,通常只有一个条目是可见的。用户可以单击组合框上的下箭头按钮打开条目列表,以便从中选择。所以相比列表框,组合框能够节省表单里的显示空间;

     ②组合框不提供多重选择的功能,没有MultiSelect属性;

     ③组合框有两种形式:下拉组合框和下拉列表框。

     十、表格(Grid)控件

     表格是一种容器对象,其外形与Browse窗口相似,按行和列的形式显示数据。一个表格对象由若干列对象(Column)组成,每个列对象包含一个标头对象(Header)和若干控件。这里,表格、列、标头和控件都有自己的属性、事件和方法,这使得用户对表格的控制变得更加灵活。

     十一、页框(PageFrame)控件

     页框是包含页面(Page)的容器对象,而页面本身也是一种容器,其中可以包含所需要的控件。利用页框、页面和相应的控件可以构建大家熟知的选项卡对话框。这种对话框包含若干选项卡,其中的选项卡就对应着这里所说的页面。

     页框定义了页面的总体特性,包括大小,位置、边界类型以及哪页是活动的等等。页框中的页面相对于页框的左上角定位,并随页框在表单中移动而移动

§7.1 基本概念

一、对象与类

⒈对象

对象(Object)是数据和对该数据的所有必要的操作的代码封装在一起的程序模块,即对象是包含属性(数据)和行为(又称方法)的逻辑实体。例如,现实生活中的计算机、电话机、电视等,Visual FoxPro中的窗口、命令钮、标签等均是对象。

⒉类

类(Class)是对一些具有相同属性和方法的对象的归纳和抽象。

类和对象是两个关系密切的概念,类包含了有关对象的特征和行为信息,是对象的蓝图和框架。简单的说,类就是将具有相同的结构、操作并遵守相同规则的对象聚合在一起,这组对象就被称为类。例如,工厂生产零件时,需要零件图作为依据,所生产的零件具有相同的特征和功能,零件图就是类,零件就是对象。

对象是类的具体化和实例化,所以对象又称为类的实例(Instance)。一个类可以实例化多个对象,各个对象都具有所属类描述的属性和方法,但每个对象的属性值可以不同。类是一个静态的概念,只有实例化对象才是可运行的实体。

例如,电视机可以看做一个类,具有相同的属性特征和功能,电视机具有显示图像、发音等功能,大小、颜色等属性。某一台电视机就是对象,是电视机类的实例。因此,具有电视机类描述的功能和属性,但其大小、颜色等属性值可能不同,电视机类描述的功能只有在具体某台电视机上才能实现。

⒊子类

子类(Subclass)是以一个类为起点而建立起来的新类。一个子类可以拥有派生它的类的全部功能,即具有继承性,并在此基础上,可添加其它控件或功能。派生该新类的类为其父类,该派生类为其子类。

由于父类和子类存在继承性,当某个类发现问题时,就不需要逐个修改它的子类,只需将这个类本身作适当修改即可。

⒋封装

封装(Encapsulation)是面向对象程序设计的术语,用于说明包含和隐藏对象信息,如内部数据结构和代码的能力等。封装将操作对象的内部复杂性与应用程序的其它部分隔离开来。例如,当对一个命令设置Caption属性时,不必了解标题字符串是如何存储的。

二、容器与控件

Visual FoxPro的类主要分为容器类和控件类两大类型,因此Visual FoxPro对象也相应分为两大类型。

基类是Visual FoxPro内部定义的类,它可以作为用户自定义类的基础,例如表单和所有控件就是基类,用户可以在此基础上创建新类,增添自己需要的功能。

对象基类分层结构

控 件 类 容 器 类 

复选框(Check Box) 容器(Container) 

组合框(Combo Box) 表单集(Form Set) 

命令按钮(Command Button) 表单(Form) 

控件(Control) 网格(Grid) 

定制(Custom) 网格列(Column) 

编辑框(Edit Box) 页框(Page Frame) 

列标题(Header) 页(Page) 

图像(Image) 工具栏(Toolbar) 

标签(Label) 选项组(Option Button Group) 

线条(Line) 命令组(command Button Group) 

列表框(List Box)  

OLE绑定控件(OLE Bound Control)  

形状(Shape)  

微调控件(Spinner)  

文本框(Text Box)  

计时器(timer)  

⒈容器类

容器类是包含相似类的基类,它可以容纳别的对象。例如,表单可以看成为一个容器,在表单类中可以放入命令按钮控件、复选框控件、编辑框控件、文本框控件等一组控件类,并将这些类作为一个整体进行操作。

Visual FoxPro中的容器类

容器类名称 能包含的对象 

列(Column) 可容纳表头等对象,但不能容纳表单、表单集、工具栏和计时器 

命令按钮组(command Button Group) 只能容纳命令按钮 

表单(Form) 可容纳页框、任意控件、容器或自定义对象 

表单集(Form Set) 可容纳表单、工具栏 

表格(Grid) 只能容纳表格列 

选项按钮组(Option Button Group) 只能容纳选项按钮 

页面(Page) 可容纳任意控件、容器和自定义对象 

页框(Page Frame) 只能容纳页面 

工具栏(Toolbar) 可容纳任意控件、页框和容器 

⒉控件类

控件类可以包含在容器中,但不能容纳其它对象,它的封装比容器类更为严密。

Visual FoxPro中的控件类

控件类名称 说    明 

复选框(Check Box) 创建一个复选框 

组合框(Combo Box) 创建一个组合框 

命令按钮(Command Button) 创建一个单一的命令按钮 

编辑框(Edit Box) 创建一个编辑框 

图像(Image) 创建一个显示BNP文件的图像控件 

标签(Label) 创建一个用于显示正文内容的标号 

线条(Line) 创建一个能够显示水平线、垂直线或斜线的控件 

列表框(List Box) 创建一个列表框 

选项按钮(Option-Button) 创建一个单一的选项按钮 

形状(Shape) 创建一个显示方框、圆或椭圆的形状控件 

微调(Spinner) 创建一个微调钮 

文本框(Text Box) 创建一个文本框 

计时器(timer) 创建一个能够规则地执行代码的计时器 

三、属性、事件和方法

⒈属性

对象的属性(Properity)标识了对象的特征和行为。例如,表单上的命令按钮具有如下性质:它在表单上的位置(Left和Top)、宽度(Width)、高度(Height)、按钮标识(Caption)、按钮名字(Name)等。我们可以通过控制对象的属性来操作对象,属性值既能在设计时刻也能在运行时刻进行设置,有些属性在运行时刻为只读无法设置。设置属性的语法为:

Form.Command.Caption=”退出”

⒉事件

事件(Event)是一种预先定义并由对象识别的特定动作,通过编写相应的代码响应此动作。例如,用户单击鼠标、移动鼠标、按键等都会触发事件;有时事件是由系统激活的,如每隔一段时间(Timer)、系统出错(Error)等。

⒋方法

方法(Method)是对象能够执行的操作,每个方法对应一个与对象相关联的过程(方法程序)。方法程序可以单独存在,通过显示调用执行其功能;也可以与对象的某个事件相关联,当改事件发生时被调用执行。例如,当单击鼠标左键时,发生Click事件,与事件相连接的方法代码就会被执行。

Visual FoxPro中的事件集合基本上是固定的,用户不能创建,而方法则可以无限扩充,可以在创建类时添加新的方法。

四、事件驱动机制

Visual FoxPro应用程序是一种基于事件驱动的程序。传统的过程化程序是按照程序流程沿固定的路线执行,而基于事件驱动的程序没有固定的执行路线,其执行取决于当前所发生的事件,什么事件发生了,就去执行相应的事件处理程序。设计基于事件驱动的程序的核心,就是编写事件的处理代码。

如前所述,当系统响应了用户的一个动作时,会自动触发对应的事件的处理代码。例如,用户在控件上做出单击动作时,系统自动执行该控件的Click事件的代码。事件代码也可以被系统事件触发,例如计时器的Timer事件。

⒈Visual FoxPro中的核心事件

每个类都有其固定的可识别默认事件集合,下面的表中是Visual FoxPro的核心事件,这些事件适用于大多数的控件。

核心事件列表

事   件 激发事件的动作 

Init 创建对象 

Destroy 从内存中释放对象 

Click 用户使用鼠标左键单击对象 

DblClick 用户使用鼠标左键双击对象 

RightClick 用户使用鼠标右键单击对象 

GotFocus 对象接收焦点,由用户动作引起,如按Tab键或单击,或在代码中使用SetFocus方法程序 

LostFocus 对象失去焦点,由用户动作引起,如按Tab键或单击,或在代码中使用SetFocus方法程序使焦点移动到新的对象上 

KeyPress 用户按下或释放键 

MouseDown 当鼠标指针停在一个对象上时,用户按下鼠标按钮 

MouseMove 用户在对象上移动鼠标 

MouseUp 当鼠标指针停在一个对象上时,用户释放鼠标按钮 

⒉容器事件和控件事件

在Visual FoxPro中,每个对象接收的事件都是独立的,即使是包含在容器类对象中的控件对象也是如此,即容器不处理包含的控件对象的事件。例如,在一个表单中有一个容器对象和一个命令组对象,表单是这两个对象的容器;容器对象又包含两个命令按钮,命令组对象也包含两个命令按钮。当用户单击“容器内按钮1”时,既不会触发表单的Click事件,也不会触发容器对象的Click事件,而是触发“容器内按钮1”自己的Click事件。

这条规则也有一个例外,若已为选项按钮组或命令按钮组编写了某事件代码,而组中个别按钮没有自己与该事件相关联的代码,则当这个按钮的事件发生时,将执行所在组的事件代码。比如,前例中假如命令按钮组对象和其中的“命令组按钮1”都有自己的Click事件代码,而“命令组按钮2”没有自己的Click事件代码,当单击“命令组按钮2”时,将执行命令按钮组的Click事件代码。

⒊类和控件事件

前面讲过Visual FoxPro中的类具有继承性,任何子类都可以继承其父类的属性、事件和方法,而且子类可以添加新的属性和方法,并且可以重载事件代码,即编写事件对应的处理代码。那么,用户触发子类对象的事件时,系统执行子类事件的代码还是执行父类的事件代码呢?

类的继承性形成了类的层次结构,当某控件的事件被触发时,Visual FoxPro在该控件所在的类层次结构中逐层向上查找与此事件对应的代码,只要在某层次找到对应的事件代码,就执行此事件代码,从而完成事件的响应。

例如,表单上的一个控件是基于一个用户自定义类,当事件发生时,Visual FoxPro首先在该控件中查看是否有与此事件相关联的代码。若找到,则执行它,否则继续沿类层次向上逐层检查。无论Visual FoxPro在类层次的哪个地方找到该事件代码,都执行它,而该层次以上的代码不会被执行。

当在一个子类的事件代码中需要执行其父类的该事件代码时,可以通过调用DODEFAULT()函数实现。

五、类的定义

在Visual FoxPro程序中可以直接使用Visual FoxPro的基类,也可以在基类的基础上,派生具有封装功能的子类。创建子类可以使用类设计器、表单设计器或以编程方式定义。

⒈类设计器

创建新类具体操作步骤如下:

⑴在“项目管理器”中选择“类”选项卡,然后单击“新建”按钮;或从“文件”菜单中选择“新建”命令,在弹出的“新建”对话框中,选择“类”再单击“新建文件”按钮;或使用Create Class命令。

⑵在弹出的“新建类”对话框中,指定新类的名称、新类基于的父类、保存新类的类库名。如果新建的类基于VF的基类,在“派生于”框用下拉框选择父类;如果新建的类基于子定义的类,则通过“派生于”框后的按钮选择。

⑶单击“确定”按钮,则弹出“类设计器”对话框。

⑷在“类设计器”中,通过“属性”窗口可以查看和编辑新类的属性;在“代码”编辑窗口中可以编写各种事件和方法程序的代码;使用“类”菜单的“新建属性”和“新建方法程序”命令,可以分别给子定义的类添加属性和方法程序。对于基于容器类的子类,还可以添加控件对象,例如在基于Container类的子类中加入两个复选框和一个命令按钮等。

若修改自定义的类,在“项目管理器”中单击“修改”按钮,或使用Modify Class命令。

若从类库中删除一个类,在“项目管理器”中选择这个类,并单击“移去”按钮,或使用命令:

Remove Class <类名> of <类库名>

“类设计器”的使用与“表单设计器”相同,详细使用方法可参考表单设计的内容。

⒉以编程方式定义类

用户除了可在“类设计器”或“表单设计器”中可视地定义类之外,还可以在程序文件中以编程的方式定义类。

⑴Define Class命令格式

Define Class ClassName1 AS ParentClass [Olepublic]

  [[Protected | Hidden PropertyName1,PropertyName2…]

  [Object.] PropertyName=eExpression…]

  [Add Object [Protected] ObjectName AS ClassName2[Noinit] 

  [With cPropertListy]]…

  [[Protected | Hidden] Function | Procedure Name [_Access| _Assign]

  [NoDefault]

  cStatements

 [EndFunc| EndProc]]…

EndDefine

其中,Define Class…EndDefine表示类定义的开始和结束,ClassName1是新定义的类的名称,ParentClass是基于的父类名,PropertyName表示类的属性并可以赋默认值。

例如:定义一个基于CommandButton的类Mycmdbtn。

Define Class Mycmdbtn AS CommandButton

  Height=25        &&设置属性值

  Width=80

Caption=”自定义按钮”

Name=”mycmdbtn”

EndDefine

在程序文件中,主程序代码必须出现在类定义之前,就如同主程序必须在过程或函数之前一样。

⑵保护和隐藏类成员

类的成员(包括属性和方法)具有三种可视性,即公共(Public)、保护(Protected)和隐藏(Hidden),可视性决定该成员在何处可以被引用。

·公共(Public):可以在该类定义的方法程序、事件代码以及该类的子类的方法程序、事件代码中引用,并且可以通过该类和子类的对象引用。

·保护(Protected):可以在该类定义的方法程序、事件代码以及该类的子类的方法程序、事件代码中引用,但不能通过对象引用。

·隐藏(Hidden):只能在该类定义的方法程序、事件代码中引用,不能在子类的方法程序、事件代码中以及通过该类的对象引用。

Protected关键字使类成员为保护的,Hidden关键字使类成员为隐含的,不加特别说明的类成员为公共的。

⑶添加属性

在类定义中可给基类的属性指定默认值,还可添加新的属性并指定默认值。当新属性为保护或隐藏时,必须分别用Protected或Hidden关键字说明。

举例:给自定义的类mycmdbtn添加保护属性str1和公共属性str2。

Define Class Mycmdbtn AS CommandButton

Protected str1    &&说明str1为保护属性

Height=25     &&为继承的属性和添加的属性指定默认值

  Width=80

Str1=”hello”

Str2=”goodbye”        &&公共属性不需要特殊说明

Caption=”自定义按钮”

Name=”mycmdbtn”

EndDefine

⑷指派方法程序和事件代码

在Visual FoxPro的子类定义中,可以扩展基类的方法程序集。但编写事件代码和方法程序必须遵守下列规则:

·Visual FoxPro基类的事件集合是固定的,不能进行扩充。

·每个类都可识别固定的默认事件集合,它的最小事件集包括Init、Destroy和Error事件。

·可在类定义中通过创建过程或函数向类中添加方法程序,并且可以指定方法程序的可视性(Protected或Public)。

·若类中创建的方法程序与基类所能识别的某个事件重名,则该方法程序实现对基类事件代码的重载,当该事件发生时,同名方法程序(即重载的事件代码)被执行。

·在重载的方法程序或事件代码中,通过DoDefault()函数可以调用基类的同名方法程序和事件代码。

·通过创建与类的某一属性同名的过程或函数,在过程或函数名后面追加_Access或_Assign,可为类创建Access和Assign方法程序。

类定义中定义过程和函数的格式见前面的Define Class格式,其中NoDefault关键字用于禁止父类代码的执行。

举例:给自定义的类Mycmdbtn添加新的方法程序Show (可视性为保护的),并为Click事件编写新的代码。

Define Class Mycmdbtn AS CommandButton

Protected str1    &&说明str1为保护属性

Height=25     &&为继承的属性和添加的属性指定默认值

  Width=80

Str1=”hello”

Str2=”goodbye”        &&公共属性不需要特殊说明

Caption=”自定义按钮”

Name=”mycmdbtn”

  Protected Procedure show     &&添加新的方法程序

    IF this.caption=this.str1 THEN

      this.caption=this.str2

    Else

      this.caption=this.str1

    EndIf

    Return

  EndProc

  Procedure Click      &&重载基类的Click事件代码

    This.show()

  EndProc

EndDefine

⑸在容器中添加对象

如果正在定义的类是一个容器类,则除添加属性、方法程序和事件代码外,还可以用Add Object子句向此类中添加对象作为其成员,对象成员同样可以指定可视性。

格式:

Add Object [Protected] ObjectName AS ClassName2[Noinit] 

    [With cPropertList]…

其中:ObjectName为添加的对象名,ClassName2为对象基于的类名,Protected指定此对象成员是保护的,该项缺省时对象成员是公共的,cPropertList是对象的属性及赋值列表。

举例:向新定义的基于表单的类中加入两个命令按钮。

Define Class Myform AS Form

Add Object cmdok AS commandbutton With; &&添加公共的命令按钮

       Top=10,Left=10,Height=20   && cmdok的属性赋值列表

Width=60,Caption=”确认”

&&添加保护的命令按钮

Add Object Protected cmdcancel AS commandbutton With;

       Top=40,Left=10,Height=20   && cmdcancel的属性

Width=60,Caption=””         赋值列表

EndDefine

对于基于容器类创建的容器对象,可以使用容器对象的Add Object方法程序向容器对象中加入对象。Add Object方法程序基本格式如下:

Object.AddObject(cName,cClass)

其中:cName是加入的对象名,cClass是对象基于的类。

举例:在表单对象中加入两个命令按钮。

Myform=CreateObject(‘FORM’)

Myform. AddObject(‘cmdok’,’ commandbutton’)

Myform. AddObject(‘cmdcancel’,’ commandbutton’)

五、对象的创建和引用

这里我们介绍如何以编程方式创建基于Visual FoxPro基类和自定义类的对象,如何访问对象的属性、方法程序以及如何触发事件。

⒈创建对象

使用CreateObject()函数可以创建对象。

格式:CreateObject(ClassName[,eParameter1, eParameter2,…])

其中:ClassName是创建对象所要基于的类,可以是Visual FoxPro基类,也可以是本程序中Define Class定义的类,还可以是某类库中的类;eParameter是创建对象时传递给Init事件的参数。该函数的返回值就是创建的对象。

举例:创建一个表单对象,并显示。

Myform= CreateObject(‘FORM’)    &&创建表单

Myform.show          &&显示表单

read events           &&等待事件

如果使用可视类库中的类,必须先用Set ClassLib To命令打开该类库:

格式:Set ClassLib To [ClassLibraryName[Additive]]

其中:ClassLibraryName为可视类库名,缺省时用于关闭所有打开的类库;Additive表示打开类库时不关闭其它打开的类库。

举例:创建基于自定义类Myform的对象,该类定义在myclass.vcx中。

Set ClassLib To ‘myclass’

Myform1= CreateObject(‘Myform’)

容器对象的AddObject方法也可以创建对象,其创建的对象放在容器对象中作为容器对象的成员,即它的Parent属性指向该容器。使用CreateObject()函数创建的对象没有父对象。

⒉引用对象

通过表单设计器或编程创建对象后,就可以在程序中访问对象的属性、调用其方法程序和触发其事件。

⑴容器的层次结构

Visual FoxPro的对象可以放在容器中,而容器是可以嵌套的,所以容器具有层次结构,我们引用对象时必须知道该对象在容器层次结构中的位置。

    

 

 

 

 

 

 

上图是一个假设的容器层次结构,若要引用表单中“选项1”的Enabled属性,则应按以下方式表示:

Formset.Form.OptionButtonGroup.OptionButton.Enabled

应用程序对象(_VFP)的ActiveForm属性,允许在不知道表单名的情况下,处理活动的表单。例如,下列代码可改变活动表单的背景颜色,而不考虑其所属的表单集。

_VFP.ActiveForm.BackColor=RGB(255,255,255)

同理ActiveControl属性允许处理表单的活动控件:

_VFP.ActiveForm. ActiveControl.Name

⑵相对引用

在容器层次中引用对象时,除使用上面的绝对引用方式外,还可以通过相对引用方式快捷地指明所要处理的对象。下面的表中列出了一些属性和关键字,这些属性和关键字允许更方便地从对象层次中引用对象。

用于相对引用的属性和关键字

属性和关键字 引用的对象 使用位置 

Parent 该对象的直接容器对象 不限,该属性前必须指明对象 

This 该对象 同对象的方法程序或事件代码中 

ThisForm 包含该对象的表单 同表单的任意控件的方法程序和事件代码中 

ThisFprmSet 包含该对象的表单集 同表单集的任意控件的方法程序和事件代码中 

举例:假设表单form1在表单集forms1中,表单上有两个命令按钮cmdbtn1和cmdbtn2。下面的代码说明对象的引用方法以及可以使用该引用的位置。

·程序的任何位置都可以使用绝对引用:

forms1. form1. cmdbtn1.caption=”ok”

·改变cmdbtn1的caption属性,只能用在cmdbtn1的方法程序和事件代码中:

This. caption=”ok”

·调用cmdbtn1的Click事件代码,只能用在form1、cmdbtn1或cmdbtn2的方法程序和事件代码中:

ThisForm.cmdbtn1. Click

·调用cmdbtn1的setfocus方法,只能用在forms1中任何控件的方法程序和事件代码中:

ThisFormSet. form1.cmdbtn1.setfocus

⑶访问对象的属性

无论采用绝对引用或相对引用,都可唯一地确定访问的对象,这样就可以进行对象属性的读取和赋值了。

引用对象的格式是:

Object.Property

举例:给表单集formset1中,form1表单上的命令按钮cmdbtn1的属性赋值。

formset1. form1. cmdbtn1.caption=”确认”

formset1. form1. cmdbtn1.top=80

formset1. form1. cmdbtn1.left=100

formset1. form1. cmdbtn1.height=25

formset1. form1. cmdbtn1.width=80

当同时引用某个对象的多个属性时,可以使用With… EndWith语句简化书写方式,上例可以写成下面的形式:

With formset1. form1. cmdbtn1

    .caption=”确认”

    .top=80

    .left=100

    .height=25

    .width=80

With…EndWith

⑷访问对象的方法程序

调用方法程序的语法格式:

Object.method

其中:Object是用绝对或相对的引用方式确定的对象,method为对象的方法名。

举例:给表单Myform1上的列表框Listbox1添加列表项,并将焦点设置到该列表框上。

Myform1. Listbox1.AddItem(“计算机”)

Myform1. Listbox1.Setfocus

注意:传递给方法程序的参数放在方法名后面的括号内,无参数时可以省略括号,但要使用方法的返回值时,方法名后的括号努可省略。

⒋触发事件

大多数事件是由用户的动作触发的,当事件被触发时,该事件的处理代码将被执行。当用户单击命令按钮时,命令按钮的Click事件代码将被执行。

用编程方式也可以触发部分事件:

·使用Mouse命令可以产生鼠标事件,如Click、DblClick、MouseMove、DragDrop等。

·使用Error命令可以产生Error事件。

·使用KeyBoard命令可以产生KeyPress事件。

除此之外,用户不能用编程方式产生其它事件,但是可以引用事件名,执行与此事件相关的过程代码,然而该调用并不触发相应的事件。例如,命令Form1.Activate可使Form1的Activate事件代码被执行,但并不激活这个表单。

 

 

§7.2 建立表单

Visual FoxPro为我们提供了一种新的“表单”文件,“表单”文件是Visual FoxPro中最为常用的数据显示和编辑方式,它包含有各种各样的控件,用户可以利用这些控件制作成不同的按钮、下拉框、选项框等,使用户通过美观友好的人机界面进行数据的接收、显示、编辑,实现与应用程序的连接。

一、用向导建立表单

⒈用向导建立单表表单

用向导建立单表表单的操作步骤如下:

⑴单击“文件”菜单中的“新建”命令,在弹出的“新建”对话框中选择“表单”,再单击“向导”按钮;或单击“工具”菜单的“向导”子菜单中的“表单”命令,弹出“向导选取”对话框。

⑵在“向导选取”对话框中选中“表单向导”选项,再单击“确定”按钮,弹出“表单向导”的“步骤1-字段选取”对话框,开始创建一个对一个数据表进行操作的表单。

⑶在“步骤1-字段选取”对话框中,选择用于表单的数据表,如“商品档案表”及相应的字段,然后单击“下一步”按钮,弹出“步骤2-选择表单样式”对话框。

⑷系统提供了9种表单样式和4种按钮类型,选择一种表单样式和按钮类型,如选择“标准式”和“文本按钮”,然后单击“下一步”按钮,弹出“步骤3-排序次序”对话框。

⑸记录排序:在“步骤3-排序次序”对话框中,选择一个字段(最多可选择3个字段),来定义表单中数据显示顺序,并选择“升序”或“降序”。如果不选,则记录显示按照原来的物理顺序。然后单击“下一步”按钮,弹出“步骤4-完成”对话框。

⑹在“步骤4-完成”对话框中,定义“表单”的标题,选择适当的单选按钮,单击“完成”按钮。文件以“商品档案表表单.scx”存盘。

在单击“完成”之前,可以单击“预览”按钮预览“表单”。

⒉用向导建立一对多表单

用向导建立一对多表单的操作步骤如下:

⑴单击“文件”菜单中的“新建”命令,在弹出的“新建”对话框中选择“表单”,单击“向导”按钮;或单击“工具|向导|表单”命令,弹出“向导选取”对话框。

⑵在“向导选取”对话框中,选中“一对多表单向导”,再单击“确定”按钮,弹出“一对多表单向导”的“步骤1-从父表中选定字段”对话框。开始创建一个能对两个相互关联的数据表进行操作的表单。

⑶在“步骤1-从父表中选定字段”对话框中,选择用于创建表单的父表,如“商品档案表”及相应的字段,然后单击“下一步”按钮,弹出“步骤2-从子表中选定字段”对话框。

⑷在“步骤2-从子表中选定字段”对话框中,选择用于创建表单的子表,如“商品销售表”及相应字段,然后单击“下一步”按钮,弹出“步骤3-建立表之间关系”对话框。

⑸在“步骤3-建立表之间关系”对话框中为父表和子表之间建立关联,然后单击“下一步”按钮,弹出“步骤4-选择表单样式”对话框。

⑹在“步骤4-选择表单样式”对话框中,选择表单样式,如“标准式”,并选择“按钮类型”,然后单击“下一步”按钮,弹出“步骤5-排序次序”对话框。

⑺选择排序依据字段,然后单击“下一步”按钮,弹出“步骤6-完成”对话框。

⑻在“步骤6-完成”对话框中,定义表单的标题,选择适当的单选按钮,单击“完成”按钮,并以文件名“商品销售情况表.scx”存盘。

在退出表单向导之前,可以单击“浏览”按钮预览表单。

二、用表单设计器建立表单

用表单向导创建的表单,可以用表单设计器修改,用表单设计器也可以设计一个空白表单。

用表单设计器创建一个空白表单具体操作如下:

⑴单击“文件”菜单中的“新建”命令,弹出“新建”对话框。

⑵在“新建”对话框中,选择“表单”,然后单击“新建文件”按钮,弹出“表单设计器”窗口,在该窗口中可以编辑、定制表单。

用表单向导创建的表单,所选择的数据表或视图的字段会自动出现在表单中,用表单设计器创建的空白表单,若想把数据表或视图中的字段放到表单中,需要设置表单的数据环境(在编辑表单中将要介绍)。

三、用表单生成器建立表单

用表单生成器则可以快捷地建立起一个简单的表单,其具体操作如下:

⑴在建立了空白表单,弹出“表单设计器”窗口后,单击“表单”菜单中的“快速表单”命令,弹出“表单生成器”对话框。

⑵在“表单生成器”对话框中,选择“字段选取”选项卡,然后指定需要创建表单的数据库表、视图或自由表,并选择所需字段。

⑶在“样式”选项卡中选择创建表单的样式,用户可以通过预览窗口看到表单样式的效果。

⑷单击“确定”按钮。

新建的表单将自动放在“表单设计器”中,此时的表单结构仅仅包含了显示添加字段的文本控件和标签控件。用户可以对其进行修改,加入相应的控件,如命令按钮、选项按钮等。如果要确认表单设计,可以选择“文件”菜单中的“保存”命令完成表单的创建。

四、表单的数据环境

当被设计的表单被用于显示一个或多个表或视图时,就必须设置表单的数据环境。在数据环境中包含的是表单中将要使用的一个或多个表、视图和表与表之间的关系。只有表或视图包含在表单的数据环境里,它们的字段及相关内容才能在表单里显示和编辑。当运行表单时数据环境能够自动打开或关闭表和视图。

当用“表单设计器”创建了一个空白表单后,就可以设置表单的数据环境了。打开表单数据环境有三种方法:

⑴在表单上单击鼠标右键,在弹出的快捷菜单中单击“数据环境”命令。

⑵在系统菜单中单击“显示|数据环境”命令。

⑶在“表单设计器”工具栏上选择“数据环境”按钮。

用上述任何一种方法,都可以打开表单的数据环境,屏幕将弹出“数据环境设计器”对话框。此时,系统增加了“数据环境”菜单,而“格式”和“表单”菜单消失。

⒈在数据环境中添加表或视图

如果数据环境已包含表或视图,则打开数据环境时会同时显示这些表和视图,以及表与表之间的关系。若数据环境是空的,则打开“数据环境设计器”时,若当前已打开一个数据库文件时,系统立即打开“添加表或视图”对话框,允许为数据环境添加表或视图;若当前未打开任何一个数据库或数据表文件时,系统立即弹出“打开”对话框,允许为数据环境添加表或视图。

也可以使用其它方法在数据环境中添加表或视图:

·在“数据环境设计器”中单击鼠标右键,在弹出的快捷菜单中单击“添加”命令。

·在系统菜单上单击“数据环境|添加”命令。

无论用哪种方法,都会弹出“添加表或视图”对话框,在其中选择你所需要的表或视图即可。

⑴将数据环境中的字段移到表单中

把表或视图添加到表单数据环境后,要想在表单中显示表或视图中的字段,必须先把数据环境中的字段移到表单中。

单个字段添加到表单中的方法是:在数据环境中选中该字段,并把它拖到表单中。此时,表单中将生成两个与该字段相关的控件,一个是用于显示字段标题的标签控件,另一个是用于显示字段数值的文本控件。

若在数据环境中,选择表的标题,则可以把整个数据表拖到表单中,此时,表单中将生成一个表格控件,以表格的方式显示数据表的内容。

⑵在数据环境里移去表或视图

在数据环境里,表、视图、关系都被当作一个对象处理。要在数据环境里移去表或视图时,则先选中表或视图,单击菜单上“数据环境|移去”命令,或按Delete键。如果移去的是表,则与该表相关联的关系也被移去。

在数据环境里打开表或视图的速度要比在表里的事件(如Load事件)中使用:

Use,

Set Ordet或Set Relation等命令快得多。

⒉设置数据环境的属性

数据环境是一个对象,它的对象名是Dataenvironment。它与其它对象一样具有自己的属性、事件和方法程序。

常用的数据环境属性及其作用如下:

·AutoCloseTables:当释放表单时,控制是否关闭表或视图,默认值为“真”。

·AutoOpenTables:当运行表单时,控制是否打开数据环境中的表或视图,默认值为“真”。

·InitialSelectedAlias:指定开始运行表单时,首先选定的表或视图。若不指定该属性值,运行表单时,将第一个加入到数据环境中的表或视图当做当前表或视图。

若要查看和设置数据环境的属性,可以使用“数据环境设计器”的快捷菜单中的“属性”命令,在打开的“属性”窗口中设置或修改对象Dataenvironment的属性。

⒊设置数据环境中表或视图的属性

数据环境中的表或视图具有对象名Cursor,在同一数据环境中各个表或视图对象分别以Cursor1、Cursor2等命名。

常用的表或视图的属性如下:

·Alias:表或视图的别名。

·Order:如果已为该表或视图建好索引,可以选择一个索引标记作为该属性的值,从而按索引关键字值的顺序显示表或视图中的记录。例如,将Order属性值设置为“商品编号”。

·ReadOnly:指明在运行表单编辑表或视图的记录时,是否允许修改记录数据。例如,将Cursor1的ReadOnly属性设置为“真”,则在运行表单时不允许修改表的记录。

·BufferModeOverride:指定表使用的缓冲类型,一般选择默认值1-使用表单设置。

五、设置表单的属性

Visual FoxPro为表单定义了多种属性、方法和事件,通过设置表单属性,可以确定表单本身特征;同时,通过设置表单的属性、方法和事件,为表单中的控件提供变量定义和初始数据。

要查看和设置表单的属性,可以用右键单击表单,在弹出的快捷菜单中选择“属性”命令打开“属性”窗口,然后设置和修改对象Form1(表单的默认对象名)的属性。如果要为表单添加代码,可以选择快捷菜单中的“代码”命令打开“代码”窗口,然后选择某个过程,并输入代码;在“属性”窗口中双击某个方法程序名,也可以打开“代码”窗口。

⒈设置表单属性,确定表单的外形特征

·设置表单的高度和宽度:可以直接用鼠标改变表单的高度和宽度,或设置表单的Height和Width属性。

·显示表单标题栏:设置TiteBar的值为.T.。

·设置表单的标题:默认标题是“Form1”,一般应为表单设置一个恰当的标题。例如,将表单的Caption属性设置为“商品档案表”。

·确定表单在执行时在屏幕居中:设置AutoCenter属性为.T.。

·指明在表单执行时不可调整表单边框:选择BorderStyle属性值为2-固定对话框。

·指明在表单执行时表单的关闭按钮有效:选择Closable属性值为.T.。

·指明在执行时刻不可移动表单:设置Movable为.F.。

·指明在表单的标题栏中不显示最大化和最小化按钮:将MaxButton和MinButton属性都设置为.F.。

⒉设置表单为子表单

在Visual FoxPro中,可以创建两种类型的应用程序界面:多文档界面(MDI)和单文档界面(SDI)。

·多文档界面(MDI):应用程序有一个主窗口,应用程序的其它窗口包含在主窗口中或浮动在主窗口顶端。

·单文档界面(SDI):应用程序由一个或多个独立的窗口组成,这些窗口均在Windows桌面上独立显示。

为了支持这两种类型的界面,Visual FoxPro允许创建三种类型的表单。

⑴顶层表单

是没有父表单的独立表单,用于创建SDI应用程序界面或用作MDI应用程序中其他子表单的父表单。顶层表单与其它Windows应用程序同级,并在Windows任务栏中显示。

⑵子表单

是包含在另一个窗口中的表单,用于创建MDI应用程序。子表单不可移到父表单(主表单)边界之外,当其最小化时将显示在父表单的底部;如果父表单最小化时,子表单也一同最小化。

⑶浮动表单

它属于父表单(主表单)的一部分,但并不包含在父表单中。浮动表单可以移至屏幕的任何位置,只是不能在父窗口的后台移动。当浮动表单最小化时,它将显示在桌面的底部;如果父表单最小化时,浮动表单也一同最小化。浮动表单也可用于创建MDI应用程序。

在“表单设计器”中编辑表单时,通过设置表单属性,可以形成上述三种类型的表单。

⑴形成顶层表单:将表单的ShowWindows属性设置为2。

⑵形成子表单:将表单的ShowWindows属性设置为0(默认),此时子表单的父表单是Visual FoxPro主窗口;若设置为1,此时子表单的父表单是活动的顶层表单。

如果希望子表单最大化时与父表单组合成一体,可设置表单的MDIForm属性为“真”;如果希望子表单最大化时仍保留为一个独立的窗口,可设置表单的MDIForm属性为“假”。

⑶形成浮动表单

将表单的ShowWindows属性设置为0或1,并将Desktop属性设置为“真”。

⒊为表单编写事件代码

表单有一些常用的方法和事件,需要时可以编写事件代码和调用方法。

·Init事件:是在创建表单时发生的事件。常在该事件的代码中写入给表单中其它控件提供的初始化代码,也可设置表单运行时所需的初始环境。

·Destroy事件:释放表单时发生的事件。

·Refresh方法:刷新表单。

·Release方法:释放表单。

六、添加控件

要形成所需要的用户界面,需要在表单上添加一些必要的控件。在Visual FoxPro中,可向表单中添加四种对象:控件、容器、自定义类和OLE对象。这些类型的对象集成在“表单控件”工具栏中,一般我们将“表单控件”工具栏中的各种对象统称为控件。

⒈为表单选择合适的控件

不同类型的控件具有不同的属性、事件和方法,因此也具有不同的特征、功能和用途。根据各类控件的主要用途我们可以把控件大致分为:

⑴选项按钮组、复选框、列表框和下拉列表:为用户提供一组预先设定的选择,以确保输入数据的有效性。

⑵命令按钮、命令按钮组:可以执行用户需要的特定操作,例如,移动记录、退出、运行查询、输出报表等。

⑶计时器:进行计时,或按设定的时间间隔周期的执行指定的操作。

⑷文本框、编辑框和组合框:接受不能预先确定的用户输入。

⑸文本框:在给定的范围内接受用户输入,但需要在文本框的Valid事件代码中加入对输入范围的判断。如果是输入一个序列的值,可以使用微调控件。

⑹图像、形状、标签、文本框、编辑框:用以显示提示信息以及其它需要在表单上输出的信息。

各种控件具有一定的通用性和灵活性,往往可以使用多种控件完成某一特定的功能。在考虑选用控件时,应使形成的表单与标准图形界面的风格和使用方法相一致,以便更容易让用户掌握和使用。

⒉向表单中添加控件

设计表单时,一般通过在“表单控件”工具栏上选择控件来添加新的控件,并把它放在“表单设计器”窗口中。

向表单中添加控件具体步骤如下:

⑴在“表单控件”工具栏上单击一个控件。

⑵在“表单设计器”窗口中,在要放置控件的地方拖动鼠标指针创建一个矩形框。此时,新的控件就出现在用户设定的位置上,其后可以在表单中把它移动到最终位置上,也可以根据需要调整它的大小。

如果要由数据环境中的表或表中的某个字段形成表单上的一个控件,可以用鼠标先选中该表或字段,然后拖动鼠标到表单上,则在表单上添加了一个表或字段的默认控件类型的控件。

当“表单控件”工具栏中“锁定按钮”处于按下状态时,可在表单上多次添加同种控件。

⒊设置控件属性和编写事件代码

表单控件的属性,有些可以用鼠标进行设置,例如命令控件的高度、宽度就可以用鼠标来调整。要对对象的所有属性进行设置,则必须在对象的属性窗口中进行。此外,也可以在运行时通过程序语句进行设计。

⑴通过“属性”对话框设置表单控件的属性

在表单中单击鼠标右键,在弹出的快捷菜单中选中“属性”命令,或单击“显示|属性”命令,则弹出“属性”窗口。

在“属性”窗口中,包含了选定的表单、数据环境、临时表、关系或控件的属性、事件和方法程序列表,用户可在设计或编程时对这些属性值进行设置或更改。

也可以选择多个对象,然后进入属性窗口,在这种情况下,“属性”窗口将会显示所有选定对象的共有属性。

在“属性”窗口的最上部的下拉列表框,用来显示当前选定的对象,单击右端的三角按钮,可以看到包含当前表单、表单集和全部控件的列表。如果打开了“数据环境设计器”,还可以看到在“对象”中包含有数据环境及数据环境的全部临时表和关系。用户可以从列表中选择要更改其属性的表单或控件。

“属性”窗口有五个选项卡,按不同分类显示对象的属性、事件和方法程序。

“属性”的选项卡说明

选项卡 说      明 

全部 显示全部属性、事件和方法程序 

数据 显示有关对象如何显示或怎样操纵属性的属性 

方法程序 显示方法程序和事件 

布局 显示所有的布局属性 

其它 显示其它和用户自定义的属性 

在属性设置框中,用户可以更改属性列表中选定的属性值。

·如果选定的属性需要预定义的设置值,则在右边出现一个三角按钮。

·如果属性设置要指定一个文件名或一种颜色,则在右边出现对话框,例如,背景颜色设置,可以通过打开一个对话框来设置属性。

单击“接收”(√)按钮,可以确认对属性的更改;单击“取消”(×)按钮,取消更改恢复以前的值。

单击“函数”(fx)按钮,可打开“表达式生成器”,属性可以设置为原义值或函数或表达式返回的值。

在属性列表中显示了所有可在设计时更改的属性和它们的当前值;对于有预定值的属性,在属性列表框中双击属性名可以遍历所有可选项;对于具有两个预定值的属性,在属性列表框中双击属性名可在两者之间切换。

⑵通过程序语句设计表单控件的属性

在运行时,可以通过程序语句来动态地对表单控件的属性进行设置和修改。

格式:Parent.Object.Property=Value

其中:Parent为容器对象,如表单、表单集等。

Object为设置属性的对象名。

Property为属性名。

Value为要设置的属性值。

例如,设置表单集My_formset中,表单My_form的部分属性:

·设置该表单是否活动:

My_formset. My_form.Enabled=.T.

·设置该表单的前景色:

My_formset. My_form.ForeColor=RGB(0,0,0)

·设置该表单的背景色:

My_formset. My_form.BackColor=RGB(192,192,192)

·设置该表单的标题:

My_formset. My_form.Caption=’My_form._testing’

在上面的例子中,My_formset是最高层的容器对象。

⑶编写事件代码

下节介绍

⒋设置控件的Tab键次序

在生成的表单中,如果有多个控件时,可以使用鼠标选择表单中的对象,还可以使用Tab键在这些对象间切换焦点。

设置控件的Tab键次序,可以单击“工具|选项”命令,在“选项”对话框中,选择“表单”选项卡,在“Tab键次序”框选择“交互”或“按列表”。选择“交互”则以交互方式设置Tab键次序;选择“按列表”则以按列表方式设置Tab键次序。

举例:以交互方式设置Tab键次序。

⑴单击“显示|Tab键次序”命令,或单击“表单设计器”工具栏上的“设置Tab键次序”按钮,则表单上的每个控件度显示一个次序框。

⑵若想使某一个控件顺序为1,则用鼠标单击该控件的次序框。

⑶逐个单击每个控件的次序框,则控件按2、3、…次序排列。

⑷单击表单的任何一处,保存所作的更改,并退出Tab键次序方式;或按ESC键退出并不保留更改。

运行该表单,并用Tab键及Shift和Tab组合键测试设置Tab的键次序。

⒌调整表单布局

⑴用“表单设计器”工具栏修改表单

“表单设计器”工具栏提供了“表单控件”、“布局”、“调色板”等对控件快速访问的工具,可以在设计或修改表单时使用。

⑵移动和缩放控件

在创建一个表单之后,可能需要调整表单上控件的位置和大小,若移动或调整控件的大小,必须先选定控件。

·选定控件:若选择一个控件,用鼠标单击该控件;若选择相邻的控件,在“表单控件”工具栏上选择“选定对象”按钮,然后拖动鼠标,在想选定的控件周围画一个框。

·移动控件:需要移动的控件选定后,在表单窗口中将改控件拖到新的位置,或用键盘上的箭头键重新定位。

·调整控件大小:选定控件后,拖动一个尺寸柄,即可以调整长度、宽度或整体尺寸。

⑶复制和删除表单控件

当设计或修改一个表单时,可能需要复制一个或多个已在表单上的控件,其具体操作步骤如下:

①用鼠标选择一个或多个控件。

②单击“编辑|复制”命令。

③单击“编辑|粘贴”命令。

④用鼠标把该控件重新定位到所需位置上。

删除不需要的控件,其具体操作步骤如下:

选定控件,单击“编辑|剪切”命令。

⑷对齐控件

使用“布局”工具栏上的按钮,很容易精确排列表单上的控件。例如,你想使一组控件水平对齐,或具有相同的高度等,均可在“布局”工具栏上选择一个布局按钮。也利用“格式”菜单中的相关命令来实现。

⑸改变文本的字体和大小

若改变表单中的文本,其具体操作步骤如下:

①在“表单设计器”中选择要更改的控件,选中后可在“属性”窗口中的“对象”列表框中见到该控件。

②在属性列表中找到更改字体的属性,如FontName、FontSize、FontBold等,并设定它的值。

⑹设置表单颜色

可以使用“调色板”改变表单和其中控件的前景或背景颜色,或“属性”窗口“布局”选项卡中“Color Source”属性设置表单颜色。

用调色板设置表单或控件前景或背景颜色,其操作步骤如下:

①单击“显示|工具栏|调色板”命令,或单击“表单设计器”工具栏上的“调色板”按钮。

②在“调色板”工具栏上,单击“前景颜色”按钮,或“背景颜色”按钮。

③选定想改变颜色的控件或表单。

④在“调色板”工具栏中选择想使用的颜色,如果希望有更多的颜色供用户选择,可选择“其它颜色”按钮。

此外,在控件位置有重叠时,可以使用“布局”工具栏中的“置前”、“置后”进行设置;使用“显示”菜单中的“网格线”控制是否在表单上显示网格线;使用“格式”菜单中的“设置网格刻度”,可以改变网格刻度,以便精确调整控件的位置以及对齐控件。

 

 

§7.3 使用表单控件

一、标签控件

单击“表单控件”工具栏上的“标签”按钮,然后将鼠标移到“表单设计器”上,鼠标变为十字型,在合适的位置单击,即可创建 “Label”标签控件。

标签(Label)控件主要用于显示一段固定的文本信息字符串,其中的文本不能直接更改。与文本框和编辑相比,最大的区别是标签没有数据源,而且不能对其中的文字进行编辑。因此,标签控件主要用于显示和输出文本信息,为表单提供一些信息说明。

使用标签控件时常用的属性有:“Caption”、“AutoSize”和“WordWrap”。

“Caption”属性用于设置标签显示的文本,它最大可包含256个字符,把要显示的字符串直接赋予标签的“标题”(Caption)即可。

“AutoSize”属性用于设置标签是否可以根据标题的文本长度,自动调整标签的大小,设置为“真”可自动调整。

“WordWrap”属性用于确定标签常显示的文本是否换行,当属性设置为“真”时,如果标签文本长度超过一行时,将自动实现多行显示。

二、文本框控件

文本框 (TextBox)控件用于创建一个文本框,在文本框中可以编辑内存变量、数组元素或字段的内容,所有标准的VF编辑功能,例如剪切、复制和粘贴,在文本框中都可以使用。因此,文本框可以接受任何数据类型的输入和输出;可以在程序中引用或更改文本框中显示的文本,还可以检验文本框中的数据是否有效。

可以用创建标签相同的办法,在表单中创建一个文本框。在“表单设计器”中,用鼠标右键单击“文本框”,在弹出的快捷菜单中选择“生成器”,可以进入“文本生成器”对话框,通过“文本生成器”对话框为文本框控件设置属性。

通过“格式”选项卡指定数据类型和各种格式选项,以及输入掩码;通过“样式”选项卡指定文本的外观、边框和字符对齐方式;通过“值”选项卡指定存入文本框的字段。

⒈文本框中文本的处理

⑴文本框中的文本

可以通过设置或引用Value属性来操作文本框中的文本。

例如:

My_form.text1.value=”My_textbox is working…”

该语句将文本框中的文本设置为“My_textbox is working…”

对于文本框控件,Value属性可以是当前选定的字符串、数值型值、日期型值、日期时间型值、货币型值或逻辑型值,默认设置为字符串,利用该属性可以为变量、数组直接赋值。

⑵文本框指定为变量或字段

对于文本框控件,ControlSource属性为文本框指定变量或字段,若ControlSource属性设置为字段或变量,则Value属性将与Control Source属性所设置的变量或字段具有相同的数值和数据类型。

例如:若当前变量为aaa,其值设置为3,在“属性”中将ControlSource设置为aaa之后,在运行表单时,文本框将显示值3,若把它的值修改为5,这时变量aaa的值也随之改变为5。

若将ControlSource设置为字段,在表单运行时,文本框将显示字段的值。

在程序中改变ControlSource的语法格式为:

Object.ControlSource=[cName]

对于控件来说,cName是一个变量或字段设置。

⒉在文本框中输入用户口令

在应用程序中,我们可以通过文本框的PasswordChar属性,来接收用户输入口令。一般情况下用户所输入的口令,不能直接显示在文本框中,而常常用“*”号来代替。

首先创建一个表单,该表单包含有五个控件:两个标签、两个文本框和一个命令按钮。第一个标签为“请输入口令:”,第一个文本框Text1用于接收用户输入的口令,第二个标签为“你所输入的口令是:”,命令按钮“显示输入口令”的作用是在第二个文本框Text2中显示输入的口令。

创建表单后,选中文本框Text1,在“属性”窗口中选中PasswordChar并设置属性为“*”。在“属性”窗口中选中Click Event,用鼠标右键单击命令按钮,在弹出的快捷菜单中选择“代码”,或鼠标双击命令按钮,弹出“Command1 Click”对话框,在对话框中输入程序:

Thisform.Text2.Value= Thisform.Text1.Value

运行表单,并在第一个文本框输入口令如cvyady,则在文本框中显示“******”,单击“显示输入口令”按钮,则在第二个文本框显示“cvyady”。

PasswordChar属性的语法格式为:

Textbox.PasswordChar=[cCharString]

其中,cCharString指定显示在文本框中的字符。

⒊其它常用属性

·InputMask属性:用于设置输入字符格式,例如,设置为999,999.99;如果是逻辑型数据,将属性设置为“Y”则只接受“Y”或“N”。

·Century属性:用于设置年份的前两位数字是否显示。

·Alignment属性:用于设置字符型数据的长度。

·ReadOnly属性:该属性设置为“.T.”时,文本框为灰色,表明不可编辑其中的数据。

·SelectOnEntry属性:确定当文本框得到焦点时,是否自动选中文本框中的内容。

·Valid事件:要检查输入文本框中的值,可以编写事件代码,利用代码来检查数据。例如,文本框只能键入正数,应在Valid事件代码中包含如下代码:

If this.Valid<=0

  =MessageBox(“请输入一个正数!”,1)    &&显示提示信息,并重新输入数据

  Return 0      &&结束事件代码的执行

EndIf

三、编辑框控件

编辑框(EditBox)控件可以用来编辑字符类型的内存变量、数组元素、字段或备注型字段,所有标准的VFP编辑功能,如剪切、复制和粘贴等,在编辑框中都可以使用。与文本框不同的是编辑框只能接受字符型文本的输入输出,而且它接受字符数据时不受编辑框大小的限制,它最多可接受2147483647个字符。

编辑框是编辑备注型字段的常用控件,因为备注型字段经常是一些介绍性的文字,输入的文本往往很多,但却一般不需要设置格式,而编辑框中可以容纳的字符量大,所以非常适合编辑备注型字段。将编辑框的ControlSource属性设置为备注字段,运行表单后就能在编辑框中编辑这个备注字段。

编辑文本文件也是编辑框常用的属性之一。(略)

编辑框的常用属性如下:

·ScrollBars属性:用于设置该编辑框是否具有垂直滚动条,默认为“有”

·ReadOnly属性:用于设置能否在编辑框中修改文本。

·SelLength”和“SelStart”属性组合:可以完成编辑框中的文字选定操作,其中“SelStart”属性用于规定选择文本的开始位置,“SelStart”属性用于规定选择文本的长度。

·SelText属性:可以访问编辑框中已经选定的文本,从而完成对选定文本的操作,如为选定文本改变字体、颜色和大小以及大小写转换等。

右键单击编辑框,在弹出的快捷菜单中选择“生成器”,会弹出“编辑框生成器”对话框,可以为“编辑框”控件设置属性。

在“格式”选项卡中,可以为编辑框指定多种格式选项,在“样式”选项卡中指定编辑框的外观形式、边框和对齐方式,通过“值”选项卡指定存储编辑框的字段。

四、命令按钮和命令按钮组控件

⒈命令按钮控件

命令按钮是表单最常用的控件之一,通常使用命令按钮进行某一操作。操作的代码通常放在命令按钮的“单击”事件(即Click Event)代码中。这样,运行表单时,当用户单击命令按钮时便会执行Click事件代码。若在表单运行中,某个命令按钮获得了焦点,则按下Enter键或空格键,也会执行这个按钮的Click事件代码。

例如,对于一个表的记录操作,可以设计四个命令按钮,分别执行“首记录”、“上一记录”、“下一记录”和“尾记录”等操作。当然也可以使用命令按钮执行其它操作,如“编辑”、“退出”、“打印报表”等操作。

⑴用表单设计器建立一个表单,然后在表单中添加“商品档案表”作为数据环境,用拖放的方法将数据表中的“商品编号”、“商品名称”、“产地”、“生产日期”等字段拖到表单中。

⑵单击“表单控件”工具栏上的“命令按钮”,在表单上创建一个命令按钮对象“Command1”,用相同的办法创建“Command2”、“Command3”、“Command4”。

⑶在“属性”窗口中,选择“布局”选项卡,设置Caption为命令按钮命名,分别命名为:“首记录”、“上一记录”、“下一记录”、“尾记录”。

⑷用鼠标右键单击按钮,在弹出的快捷菜单中选择“代码”命令,弹出“Command1. Click”对话框,在代码编辑区域内,输入事件功能的代码。

·“首记录”按钮的Click事件代码为:

go top

this.refresh

·“上一记录”按钮的Click事件代码为:

if !bof()

  skip -1

endif

thisform.refresh

·“下一记录”按钮的Click事件代码为:

if !eof()

  skip

endif

thisform.refresh

·“尾记录”按钮的Click事件代码为:

go bottom

thisform.refresh

最后一行语句的作用是调用表单的refresh方法来更新字段的显示,使它们显示移动记录指针后当前记录的值。

常用的命令按钮属性如下:

·Caption属性:用于设置按钮上显示的文本。

·Default属性:在表单运行时,若命令按钮以外的某控件获得焦点时,用户按下Enter键,将执行Default属性值为“.T.”的那个按钮的Click事件代码。

·Cancel属性:用户按下ESC键时,将执行Cancel属性值为“.T.”的那个按钮的Click事件代码。

·Enabled属性:指明按钮是否有效,即按钮是否可以被选择,当Enabled属性为“.F.”时,用户不能选择按钮。

·DisabledPicture属性:指定按钮失效时,在按钮上显示的.bmp文件。

·DownPicture属性:指定按钮被按下时,按钮上显示的.bmp文件。

·Visible属性:指明按钮是否可见。

·Picture属性:指定显示在按钮上的.bmp文件。

⒉命令按钮组控件

命令按钮组(CommandGroup)控件用于创建一组命令按钮,其中的按钮可以被当成一个整体控件使用,也可以作为单个按钮使用。

创建命令按钮组时,组中按钮个数的默认值为2,但是可以使用ButtonCount属性更改组中命令按钮的数目,若将ButtonCount设置为5,则命令按钮组有5个按钮。

命令按钮组的Value属性指明单击了哪个按钮,即Value属性值为按钮的序号,所以命令按钮组的Click事件代码中可以根据Value属性的值,执行相应的程序段。

Do Case

  Case This.Value=1

    Wait Window “按钮1的Click事件!”;

+This.command1.Caption NOWAIT  &&执行第一种动作

  Case This.Value=2

    Wait Window “按钮2的Click事件!”;

+This.command2.Caption NOWAIT  &&执行第二种动作

  Case This.Value=3

    Wait Window “按钮3的Click事件!”;

+This.command3.Caption NOWAIT  &&执行第三种动作

EndCase

选定命令按钮组并单击鼠标右键,在弹出的快捷菜单中选择“编辑”命令,便可为组中的任何一个按钮编辑Click事件代码。如果为组中的单个按钮定义了Click事件,则选中该按钮时,将优先执行该按钮自己的Click事件。

按钮组中的按钮可以根据需要进行排列组合,但前提是必须先在表单设计器中激活单个按钮,否则按钮组控件只能整体的移动。

命令按钮组的BackStyle属性,决定命令按钮组是否具有透明或不透明背景,该属性也可用于标签等其它控件。

五、列表框控件

列表框(ListBox)控件用于创建列表框,形成一个可滚动的数据项列表,该列表框可以是包括多行多列,但常用的是一列。运行表单时,在列表框的高度范围内,能够看到列表的多个行,用户可以使用鼠标和滚动条选中某一行,通过列表框的Value属性可以返回用户所选择的行。

⒈创建列表框

单击“表单控件”工具栏上的“列表框”按钮,在表单上的合适位置单击鼠标,即可建立一个列表框对象“List1”。

用鼠标右键单击列表框对象,在弹出的快捷菜单中选择“生成器”,则弹出“列表框生成器”对话框。单击“列表项”选项卡,选定表和字段;单击“样式”选项卡,选择“三维”和要显示的行数;单击“布局”选项卡,调整列表框的宽度;单击“值”选项卡,选择从哪一列中返回值。

⒉生成多列列表框

有时需要在列表框显示多列,比如一个大的“职工人事档案”表,需要在列表框中显示“部门名称”和“部门代码”,来方便记录的修改。

若要将列表框设置为2列,只需将列表框的ColumnCount属性设置为2即可。

⒊列表框中显示的数据

列表框中显示的数据,主要由它的RowSourceType属性和RowSource属性来确定。

其中,列表框的RowSourceType属性用于决定列表框的数据源类型,列表框的数据源类型有10种。

RowSourceType属性值

RowSourceType 列表框中列表项的来源 

0 空,在程序中用AddItem和AddListItem命令向列表中添加项 

1 值 

2 别名 

3 SQL语句,SQL SELECT语句创建的临时表 

4 查询,指定有.QPR类型的文件 

5 数组 

6 字段 

7 文件,用当前目录填充 

8 结构 

9 弹出式菜单,提供向下兼容性 

列表框的RowSource属性用于指定列表框的数据源,如指定RowSourceType属性为2,然后在RowSource属性中指定表的名称。

⑴空(none)

RowSourceType属性的默认值为0,系统不会自动填充列表框,可以通过AddItem命令向列表框中添加:

Form1.List1.AddItem(“北京”)

⑵值(Value)

若把RowSourceType属性设置为1,RowSource属性可以直接指定列表框中的列表项:

Form1.List1. RowSource=”one,two,three,four”

⑶别名(Alias)

若把RowSourceType属性设置为2,列表框可显示数据库表中的一个或多个字段。如果ColumnCount属性为1,则列表只能显示第一个字段的值,要想显示多个字段的值,应重新设置ColumnCount属性。

⑷SQL语句(SQL Statement)

若把RowSourceType属性设置为3,那么在RowSource属性中可用Select语句来获取列表框中的内容。从“商品档案表”中选择所有的字段和所有记录:

Select*FOM商品档案表 Into Cursor List1

如果用程序设置RowSource要注意用双引号括住Select语句。

注意:若没有Into Cursor子句,执行的结果会立即显示在浏览窗口,所以SQL语句都包含有该语句。

⑸查询(Query)

若把RowSourceType属性设置为4,则系统用查询结果来填充列表框,这时RowSource属性应设置为查询文件(.qpr)。

Thisform1.List1. RowSource=”region.qpr”

若未输入扩展名,则默认为.qpr。

⑹数组(Arrary)

若把RowSourceType属性设置为5,则用数组元素填充列表框。表单或表单集的数组可以作为RowSource,也可以使用应用的其它的数组。

⑺字段(Fields)

若把RowSourceType属性设置为6,列表框可以显示一个或多个字段。如果要在列表框中显示多个表中的字段,应设置RowSourceType属性为3。

⑻文件(Files)

若把RowSourceType属性设置为7,可以把RowSource设为准备显示在列表框中的某驱动器和某目录下的文件。

⑼结构(Structure)

若把RowSourceType属性设置为8,列表框显示的是设置RowSource时所指定的表中的字段。

⑽弹出式(Popup)

若把RowSourceType属性设置为9,则列表框显示系统预先定义的弹出组。

列表框的其它属性:

ControlSource属性:用于决定用户从列表框中选取值的保存去向。

MutiSelect属性:用于确定用户是否可以从列表框中选择多个值。

MoverBars属性:用于确定列表框左侧是否出现移动按钮。

Value属性:该属性可以返回用户选择的行。它默认为字符型,设计表单时,若将Value属性设置为空字符串,则运行表单时该属性返回用户所选择的行;若将Value属性设置为一个数值,则运行表单时返回用户所选择行的行号。

六、组合框控件

组合框(ComboBox)控件用于创建一个组合框。组合框有两种类型:一种是下拉组合框(Style属性设置为0),一种是下拉列表框(Style属性设置为2)。默认设置为下拉组合框,它结合了文本框控件和列表框控件的特性,允许用户从文本框部分输入信息,或从列表框部分选择一项;下拉列表框占用的空间很小,它仅显示一个选项,而其功能更像一个列表框,不允许输入数据。

从下拉组合框输入的新数据,可以增加到列表框部分,方法是在它的Valid事件中加入如下的代码:

This.AddItem(This.Text)

在增加选项之前,最好是先检查输入值是否已存在于列表框中:

ItemExists=.F.      &&假设列表中不存在该值

For I=1 to This.Text

  If This.List(i)=This.Text

    ItemExists=.T.

    Exit

  EndIf

EndFor

If ! temExists

  This.AddItem(This.Text)

EndIf

其它常用组合框属性:

ControlSource属性:指定用于保存用户选择或输入值的表字段或变量。

DisplayCount属性:指定在列表框中允许显示的数据项的项数。

RowSource属性:指定组合框中数据项的来源。

RowSourceType属性:指定组合框中数据源类型。

Value属性:返回用户选择的数据项。

七、选项按钮组控件

选项按钮组控件(OptionGroup)是包含选项按钮(Option Button)控件的容器,它用于创建一组选项按钮。选项按钮组允许用户从众多的选项按钮中选择一个,且只能选择一个,因此,选项按钮组常用来规范单一选择。选项按钮旁边的圆点指示当前的选择,每次选定某个选项按钮时将释放先前的选择,同时使用户的选择成为当前值。

⒈设置选项按钮的数量

在表单中创建一个选项组时,默认值将包含两个选项按钮,可以通过改变ButtonCount属性来设置选项按钮组中的选项按钮数目。

例如,要想使一个选项按钮组包含10个选项按钮,可将这个选项组的ButtonCount属性设置为10。

选项组的Value属性表明用户选定了哪一个按钮,例如用户选择了地七个按钮时,选项组的Value属性的值就是7。

⒉设置选项按钮标题

用鼠标右键单击选项按钮组,在弹出的快捷菜单中选择“编辑”,然后选中第一个选项按钮,将其Caption属性设置为“输出到打印机”;用同样的方法将第二、三个选项按钮标题设置为“输出到屏幕”、“输出到文件”。

⒊引用当前选定的按钮

当选项按钮组的三个按钮,按Caption属性分别设置了提示文本后,根据选项按钮组的Value属性,可以知道用户选定了哪个按钮。再选择选项按钮组的Valid事件,输入如下的处理代码,运行该表单即可看到其效果(注意:这只是一种示例,还不能真正完成打印定向)。

Do Case

  Case ThisForm.OptionGroup1.Value=1

    Wait Window “输出到打印机” NoWait

  Case ThisForm.OptionGroup1.Value=2

    Wait Window “输出到屏幕” NoWait

  Case ThisForm.OptionGroup1.Value=3

    Wait Window “输出到文件” NoWait

EndCase

⒋将选项按钮标题保存到字段

如果选项组的ControlSource属性设置为一个表的字符型字段,或者运行表单之前将Value属性设置为一个字符,则选项按钮组的Value属性就是被选中的选项按钮的标题。因此,选项组按钮的一个重要应用是规范表中字段的输入,尤其是对于表中那些输入范围有限且固定的字段,利用选项按钮组不仅可以防止输入错误的值,而且还可以节省输入时间。

例如,“员工档案表”中的“性别”字段,只有“男”和“女”两个固定选项,因此,可以用选项按钮组为其建立一个输入界面,首先指定“性别”字段为该选项按钮组的ControlSource属性,再设置Value属性为空字符串,运行后,选中的结果将直接作为该字段的输入值。

⑸其它属性

Name属性:选项按钮组的对象名。

Enabled属性:当该属性值为.F.时,选项按钮组不响应用户引发的事件,即废止选项按钮组。

DisabledForeColor 和DisabledBackColor属性:指定选项按钮组被废止时的显示颜色。

SetAll方法:用于设置选项按钮组中所有按钮的属性。

Buttons属性:用于保存所有按钮的一个数组。

⑹使用选项按钮组生成器

用鼠标右键单击选项按钮组,在弹出的快捷菜单中选择“生成器”命令,弹出“选项组生成器”对话框。选择“按钮”选项卡,输入按钮的个数以及各按钮的标题;选择“布局”选项卡,安排选项按钮的格局;选择“值”选项卡,设置ControlSource属性。

八、复选框控件

复选框(CheckBox) 控件用来创建一个复选框,使用复选况可以让用户给出对某个问题的回答,答案通常是两个,即“是”与“否”。

复选框控件有两种显示方式:标准复选框和图形复选框。标准复选框的提示文本由Caption属性确定;图形复选框设置的方法是将复选框的Style属性设定为“图形”,用Picture属性指定一个图形作为复选框的图形显示;如果为复选框同时指定了Caption属性和Picture属性,复选框的提示文本和图形将各占一半。

复选框的Value属性决定复选框有三种可能状态,即.T.、.F.和.NULL.,对应的Value属性分别为0、1和2。对于标准复选框,当选中该框时(选择为True或Yes),复选框将出现一个√标记,如果要取消该选择,再点按一次,则√标记消失,如果复选框指向的值为.NULL.,则该复选框为灰色。

将复选框的ControlSource属性设置为某个表中的一个逻辑字段,如果当前记录的逻辑字段值为“真”,则复选框显示被选中;如果当前记录的逻辑字段为“假”,则复选框显示未被选中;如果当前记录的逻辑字段为NULL值,则复选框显示为灰色。例如,我们在“职工档案表”中增加逻辑字段“婚否”,然后在表单的数据环境中添加该表,并将复选框的ControlSource属性设置为“职工档案表. 婚否”,则表单运行后,在表中移动记录,复选框将显示每个职工的婚姻状况。反之,用户对复选框状态的改变将修改字段的当前值。

九、微调控件

微调控件(Spinner)用于创建一个微调控件,微调主要用于接受有固定范围以及数值间距的数值数据的输入。它的主要特点:一是只能接受数值型数据,二是它提供了键入和按钮两种输入数据的方法,即一方面允许用户通过按上箭头和下箭头一次一个数据单位递增或递减地在一定范围内的数值中选择一个作为输入,另一方面可以直接在微调控制输入框中键入一个值。

常用的微调属性和事件如下:

KeyBoardHighValue属性:指定用户能输入到微调框中的最高值。

KeyBoardLowValue属性:指定用户能输入到微调框中的最低值。

SpinnerHighValue属性:指定当用户单击向上按钮时微调控件显示的最高值。

SpinnerLowValue属性:指定当用户单击向上按钮时微调控件显示的最低值。

Increment属性:用户每次单击向上或向下按钮时增加或减少的值(即数值间距)。

Value属性:返回用户输入的值。

SelectOnEntry属性:当微调得到焦点时,是否自动选中框中的数值。

UpClick事件:用户单击向上按钮时响应的事件。

DownClick事件:用户单击向下按钮时响应的事件。

十、计时器控件

计时器控件(Timer)用于创建一个以一定时间间隔执行代码的计时器。

计时器控件的主要属性和事件:

Timer事件:计时器事件,是在时间间隔到时触发的事件,通过编写事件代码,完成某个操作。

Interval属性:用于指定连续两个计时器事件(Timer事件)之间间隔的毫秒数,间隔范围从0到2,147,483,647。如果计时器有效,且设置了Interval属性,那么它将以Interval属性指定的时间,近似等间隔接收一个Timer事件,利用该事件可以完成后台操作。

Enabled属性:用于设置计时器是否工作,当该属性设置为“真”时,计时器开始工作,当该属性设置为“假”时,计时器被挂起,该属性一批可以利用一个外部事件进行设置,比如用命令按钮的Click事件启动计时器工作。

举例:在表单中添加一个计时器,设置Enabled属性为“真”,将Interval属性设置为500(0.5秒),在Timer事件中输入如下代码:

Currenttime=Time()

Currenthour=Val(Currenttime)

If Currenthour>12

 Timestr=str(Currenthour-12,2)+substr(Currenttime,3,6)+”PM”

Else

 Timestr=substr(Currenttime,3,6)+"AM"

Endif

ThisForm.label1.Caption= Timestr

十一、线条、形状和图像控件

⒈线条控件

线条(Line)控件用于显示一个水平、竖直或对角线形的线条。线条控件最主要的属性有:

BorderStyle属性:用于设置线条类型,该属性共有七种选择,分别是:0(透明)、1(实线、默认值)、2(虚线)、3(点线)、4(点划线)、5(双点划线)、6(内实线)。

BorderWidth属性:用于设置线条宽度为多少个像素点。

LineSlant属性:用于设置当线条不为水平或垂直时,线条的倾斜方向,该属性的有效值为斜杠(/)和反斜杠(\)。

⒉形状控件

形状(Shape)控件用于显示一个矩形、圆或椭圆的形状。形状属性最主要的属性是:

Curvature属性:用于决定图形的形状,其变化范围是0到99,0表示没有曲率是个矩形,99表示曲率最大是圆或椭圆。

FillStyle属性:用于确定是透明的还是具有一个指定的背景填充方案,取值范围从0~7:0(实线)、1(透明,默认值)、2(水平线)、3(垂直线)、4(向上对角线)、5(向下对角线)、6(交叉线)、7(对角交叉线)。

SpecialEffect属性:用于确定形状是平面的还是三维的,该属性仅当Curvature属性为0时有效。

⒊图像控件

图像(Image)控件也是一种图形控制,可以显示.BMP文件所定义的位图。图像的主要属性是:

Picture属性:用于指定一个图像文件,文件种类可以是 .bmp文件和.jpge文件等。

Stretch属性:用于设置图像的填充方式,该属性有三个值。

0(裁剪):自动裁剪图像大小,可能导致一部分图像不能显示,或图像不能填满控件区域。

1(等比填充):不失真地自动调整图像的大小,它将按原图像的比例缩放图像,以尽量填满控件尺寸,但不能改变图像原来的比例,因而可能在一个方向上不能填满控件尺寸。

2(变比填充):自动调整图像的大小来填满控件的尺寸,因而可能引起图像失真。

十二、表格控件

表格控件(Grid)用于创建表格,表格是按行和列显示数据的容器对象,其外观与浏览窗口相似。表格包含有多个列(Column),而每个表格列也是容器,包含标头(Header)对象和其它控件,标头对象在列的最上面显示列标题,并且可以响应事件。由于表格及所含的列、标头和控件都有各子的属性、事件和方法,因此,通过设置它们可以使得表格灵活多样。

⒈常用的表格属性

·ColumnCount属性:用于设置表格中列的个数,表格中的每个列都可容纳表中一个字段或一个表达式的值,当该属性值为-1时(默认值),表格将具有和表格数据源中字段一样多的列。

·RecordSourceType和RecordSource属性:用于为表格设置数据源,设置方法类似于列表框的RowSourceType和Row Source属性。

RecordSourceType属性表示表格中数据来源于何处:表、别名、查询、SQL或用户根据提示选定的表。

RecordSourceType属性的设置值及含义

RecordSourceType属性值 含      义 

0 表,自动打开由RecordSource属性指定的表 

1 别名(默认设置),在表格中放入打开表的字段 

2 提示,在运行时将提示用户选择数据源,若当前已打开数据库,用户则可选择其中一个数据库表作为数据源 

3 查询,RecordSource属性应设置为一个查询文件.QPR 

4 SQL语句,RecordSource属性应设置为一条SQL语句 

RecordSource属性的设置取决于RecordSourceType属性值,例如,RecordSourceType属性设置为1(别名)时,则RecordSource属性应为一个数据表。该表就作为表格的数据源,这个表必须包含在表单的数据环境中。

设置表格的RecordSourceType和RecordSource属性后,表格将按照数据源的保存次序显示所包含的字段的内容。但是,若希望能够改变要显示的字段顺序时,就要为表格的每一列单独设置数据源。

要为每一列设置数据源,应先用ColumnCount属性定义表格的列数,然后用鼠标右键单击表格中的一列,选择“编辑”命令,再在“属性”窗口中设置ControlSource属性为要显示的字段,可通过设置标头的Caption属性改变列的标头显示。

·Partition和PanelLink属性:用于将表格拆分为左右两部分。其中:Partition属性确定从表格的何处(相对于表格的左边)开始拆分,当Partition为0时表格不能1拆分,大于0时开始拆分;PanelLink属性用于设置拆分的两部分是否建立连接,当PanelLink属性为“真”时建立连接。

·Panel属性:用于指定拆分表格当前活动部分,Panel属性值为0时,左部分为活动部分,为1时右部分为活动部分。

·View属性:表格提供两种查看方式,即Browse(浏览) 方式和Change(修改)方式。当表格没有拆分(Partition属性为0)时,View属性取值有两种:0(Browse方式)和1(Change方式);当表格拆分为两部分(Partition属性大于0)时,View属性取值有四种:0(左右两部分均为Browse方式),1(左边部分为Browse方式,右边部分为Change方式),2(左边部分为Change方式,右边部分为Browse方式),3(左右两部分均为Change方式)。

⒉在表格中添加控件

表格主要用于显示表的字段数据,在默认情况下表格都以文本框(textbox)控件显示字段的内容。但VFP同时允许往表格里添加控件,以添加的控件显示字段的内容。例如,对于一个整型字段,可以添加一个微调控件来显示和编辑其内容;对于一个逻辑型字段,可以添加一个复选框来显示和编辑其内容。VFP允许在设计时从“属性”窗口往表格列添加控件,也允许编写程序代码在运行时往表格列添加控件。

举例:我们向表格的“性别”字段添加一个下拉列表框控件。

⑴用鼠标右键单击表格,在弹出的快捷菜单中选择“编辑”命令,选择“性别”列。

⑵单击“表单控件”工具栏中的“组合框”控件图标,然后单击“性别”列,此时,在“属性”窗口中可以看到该控件Combo1显示在性别列Column3下面。

⑶将性别列Column3的CurrentContril属性设置为新加入的控件Combo1,使组合框设置为当前活动控制并建立与性别字段的关联。

⑷设置组合框的属性:Style属性值为“2”,RowSourceType属性值为“1”,RowSource属性值为“男,女”,SpecialEffect属性值为“1”,BorderStyle属性值为“0”。

⒊使用表格生成器创建表格

使用表格生成器创建表格的具体操作步骤如下:

⑴打开表单,单击“表单控件”工具栏中的“表格”图标。

⑵将鼠标移动到表单上,按下鼠标左键选择合适的范围后松开鼠标,在产生的表格中单击鼠标右键,在弹出的快捷菜单中选择“生成器”,则弹出“表格生成器”对话框。

⑶在“表格项”选项卡中,选择数据表“员工档案表”,选择表格中可用的字段,如“员工编号”、“姓名”、“性别”、“年龄”等。

⑷在“样式”选项卡中,可以选择表格的样式,系统提供的样式有:保留当前样式、专业型、标准型、浮雕型、财务型等五种。

⑸在“布局”选项卡中,选择表格的布局,即需要为一个列指定标题或控件类型,可以单击该列,然后进行更改。系统提供的控件类型有:文本框、编辑框、微调框、复选框、OLE等五种。

⑹在“关系”选项卡中,可以在父表中指定关键字段和表中子表的相关索引,这主要是为创建一对多表单而设置的。

⑺选择所有选项后,单击“确定”按钮。

⒋向表格添加记录

将表格的AllowAddNew属性设置为“真”,可以允许用户向表格中显示的表中添加新的记录。如果已将AllowAddNew属性设置为“真”,当用户选中了最后一个记录,并且按下“↓”键时,就可以向表中添加新记录了。

如果想进一步控制用户什么时候向表中添加新记录,可以将AllowAddNew属性设置为“假”,并使用Append Blank或Insert命令添加新记录。

⒌用表格控件创建一对多表单

表格最常见的用途之一是:当文本框显示父记录数据时,表格显示表的子记录,当用户在父表中浏览记录时,表格将显示相应的子记录。

如果表单的数据环境包含两表之间的一对多关系,那么要在表单中显示这个一对多关系非常容易。要设置具有数据环境的一对多表单,可以将需要的字段从“数据环境”中的父表拖动到表单中,并将相关的表拖动到表单中。

在大多数情况下,都要为表单或表单集创建一个数据环境,但是即使不用“数据环境”,创建一对多表单也不算复杂。要创建没有数据环境的一对多表单,其操作如下:

⑴将文本框添加到表单中,显示主表中需要的字段。

⑵设置文本框的ControlSource属性为主表。

⑶在表单中添加一个表格。

⑷将表格的RecordSource属性设置为相关表的名称。

⑸设置表格的LinkMaster属性为主表名称。

⑹设置表格的ChildOrder属性为相关表中索引标识的名称,索引标识和主表中的关系表达式相对应。

⑺设置表格的RelationalExpr属性设置为联接相关表和主表的表达式。

十三、页框控件

页框控件(PageFrame)用于创建一个包含页面的页框,页框是包含页面的容器对象,而页面又可以包含各种控件,这些控件既可以作为公共控件存在于每个页面中,又可以作为私有控件存在于单独的页面中。因此,页框和页面控件的结合使用,可以扩充表单的使用面积。

设计表单时,可在页框、页面和控件三个级别上分别设置属性。在表单上选中页框对象后,使用其快捷菜单中的“编辑”命令,可以个别的选中某个页面进行设计和设置;当某个页面成为当前选中状态时,才能继续选中其中的控件。

页框的属性决定了页面的大小、位置、数目、边框类型和哪个页面是活动的等总体特性。页面相对于页框的左上角定位,如果页框移动了,页面将跟着移动。

常用的页框属性:

·PageCount属性:用于指定页框中页面的个数,该属性的默认值为2,若设置为5,表示该页框一共有5页,名称分别为Page1、Page2、…Page5。

·ActivePage属性:用于指定当前哪一页是活动的。尽管页框包含多页,但每一时刻仅有一页是活动的,若ActivePage属性设置为3时,表示当前活动的是第三页,只有活动页才显示在表单上。

·Pages()包含页框中所有页面的数组,这是利用Pages关键字的索引编号,例如ThisForm.PageFrame1.Pages(2)代表的是表单中页框PageFrame1的第2个页面。

·Tabs属性:用于决定页框中的选项卡是否可见,一般应设置为“真”。

·TabStyle属性:确定选项卡是否是相同大小且与页框的宽度相同。

·TabStretch属性:决定选项卡是单行还是多行显示。

常用的页面属性:

·Caption属性:用于指定页面的标题,即在选项卡上显示的文本。

·FontName和FontSize属性:用于设定页面标题的字体和字号。

十四、ActveX控件和ActveX绑定控件

⒈ActveX控件

ActveX控件亦称OLE (Object LinKing and Embedding) 控件,OLE是对象链接与嵌入的简写,就是把一个对象(Object)以链接或嵌入的方式包含在其它应用程序里。在VFP的应用程序里,通过ActveX控件,可以在自己的应用程序里使用其它的Windows应用程序,如Word,Excel,MS-Graph等文本数据、声音数据、图片数据或视频数据。

在应用程序中以链接方式包含一个OLE对象时,应用程序实际是与OLE对象建立了一个引用,当在其它应用程序中修改了OLE对象时,修改结果会反映在我们的应用程序中。在应用程序中以嵌入方式包含一个OLE对象时,应用程序实际是保留了该OLE对象的一个副本,当在其它应用程序中修改了OLE对象时,修改结果不会反映在我们的应用程序中。

在“表单控件”工具栏上单击OLE容器控件,然后在表单上单击,屏幕就会出现一个“插入对象”对话框。“插入对象”对话框各选项如下:

⑴“新建”单选按钮:“对象类型”列表框中显示了所有可插入的选择一种对象类型,然后创建一个新对象,例如,选择Excel工作表。当选中“显示为图表”复选框时,插入的对象将以图标显示。

⑵“由文件创建”单选按钮:显示“文件”文本框,可以单击“浏览”按钮,选择一个已存在的对象。若选中“链接”复选框,表示对象以链接方式插入,否则以嵌入方式插入。

⑶“插入控件”单选按钮:在“控件类型”列表框中显示了所有可插入的ActveX控件类型,可从中选择一个ActveX控件添加到表单中。若单击“添加控件”按钮,可打开一个“浏览”对话框,允许选择一个.ocx文件。

⒉ActveX绑定控件

ActveX绑定控件亦称OLE绑定控件,因为这种控件可以绑定到通用型字段上,可以显示和编辑保存在通用型字段中的OLE对象。例如,在“员工档案表”中,就使用通用型字段保存每个员工的照片,每一幅照片都是一幅BMP图像。当要在表单上显示通用型字段的数据时,就可以使用ActveX绑定。

先往表单中添加一个ActveX绑定控件,然后把ActveX绑定控件的ControlSource属性设置为通用型字段。例如,要显示“员工档案表”中的通用型字段图片的内容时,可以把ControlSource属性设置为“员工档案表.像片”。

ActveX绑定控件的其它属性:

·Visible属性:决定对象是否可见。

·AutoActivate属性:当OLE对象获得了焦点,决定在运行表单时是否允许用户双击该对象,打开或编辑该对象。

·AutoVerbMenu属性:决定在运行表单时是否允许用户使用OLE的快捷菜单,打开或编辑OLE对象。

在编程方式下也可以在一个表单里添加一个ActveX绑定控件,例如,要显示当前目录下的“员工档案表”中的通用型字段的内容时,可参考使用下面的语句:

Open DataBase 商品数据库   &&打开当前目录下的数据库

Olefrm=CreateObject(“Form”)    &&创建一个表单

Olefrm.AddObject(“OleCtel”,”OleBoundControl”) 

&&添加一个OLE绑定控件

Olefrm.OleCtrl.ControlSource=”商品数据库.员工档案表.像片” &&设置控件的ControlSource属性

Olefrm.OleCtrl.Heigth=100     &&设置显示范围

Olefrm.OleCtrl.Width=100

Olefrm.OleCtrl.Visible=.T.      &&使控件可见

Olefrm.Show

Read Events               &&调用事件处理过程

     

§7.4 运行表单 

在“表单设计器”或“项目管理器”中均可直接运行表单。在“表单设计器”中用鼠标右键单击表单,在弹出的快捷菜单中选择“执行表单”命令,或选择系统菜单上的“表单|执行表单”命令,都可以执行当前表单。在“表单设计器”中执行表单时,如果表单未保存或表单已经修改,则系统会提示用户保存表单。

如果要在程序中执行表单,可以使用Do Form <表单文件名>命令来完成。

SELECT 学号 DISTINCT FROM 分数;

INTO CURSOR temp

select temp

DO WHILE NOT EOF()

THISFORM.combol.ADDITEM(temp.学号) &&THISFORM.combo1.ADDITEM(temp.学号)

SKIP

ENDDO

  评论这张
 
阅读(16515)| 评论(9)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018