vf 中控件属性click事件代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【转载】vf常用代码集锦(上)
2010-07-20 16:04
◆文字滚动的效果
在表单添加一个计时器,把计时器INTERVAL设为30
如要走动的文字在标签1也就是LABLE1,
在计时器的timer里写下如果代码:
if bel1.left+bel1.width=0
bel1.left=thisform.width
else
bel1.left=bel1.left-1
endif
此时,LABLE1的文字将从右到左不停的走动,这时,如果要加一些效果,比如说是文字让它变颜色,一直闪烁的话。

可以再加“文字闪烁的效果”里的代码,两者结合,效果很好。

◆文字闪烁的效果
假设要闪烁的标签文字在Label1上。

在表单添加一个计时器设Interval的值为30。

在表单的Alwaysontop也就是表单属性的第一个值里声明变量,代码为:
Public I
I=0
在计时器Timer1的Timer写下代码
i=i+10
if i>=255*2
thisform.timer1.enabled=.t.
i=0
endif
if i>=255
bel1.forecolor=RGB(255*2-i,50,110)
else
bel1.forecolor=RGB(i,80,170)
endif
打开表单,就会出现文字闪烁了,如果你有兴趣,试试看
◆密码的设置
在表单中添加两个文本框,text1为用户名;text2为密码,添加两个命令按钮,设为确定和取消,数据表的结构两个字段:(name *用于存放用户名)和(mm *用于存放密码)
在确定按钮的click事件写入
if thisform.text1.value="".or.thisform.text2.value=""
=messagebox ("用户名或密码不能为空!",0+48,"警告!")
else
sele 1
use shujubiao\yonfu.dbf
if name=allt(thisform.text1.value).and.mm=all(thisform.text2.value)
use
thisform.text1.value=" "
thisform.text2.value=" "
wait"登陆成功,正在加载数据,等稍等" time 2 windows
thisform.visible=.f.
thisform.release
close all
do form zym.scx *写入您要执行的表单
else
use
messagebox("用户名或密码错误,请重新输入!",0+48,"警告!")
thisform.text1.value=" "
thisform.text2.value=" "
endif
endif
在取消按钮的click写入
close all
thisform.release
确记啊,不能把“确定”按钮设为Enter的模式,如果设定后,启动表单时,可是不用输入密码直接按确定就可以进入了。

◆密码修改源程序
表单中四个文本框,分别为用户名、密码、新用户名、新密码对应为:text1;text2;text3;text4。

此表单所用的数据表和密码设置为同一张表。

在表单的“确定”按钮click写入代码
if thisform.text1.value="".or.thisform.text2.value="".or.thisform.text3.value="".or.thisform.text4.value=""
=messagebox("存在空输入框,无法修改!",0+64,"警告")
else
use e:\xyz\表1.dbf*打开数据表
if not eof()
loca for name=allt(thisform.text1.value).and.mm=allt(thisform.text2.value)
if name=allt(thisform.text1.value).and.mm=allt(thisform.text2.value)
if messagebox("要保存修改吗?",32+4+256,"询问;")=6
repla name with thisform.text3.value,mm with thisform.text4.value
if messagebox("修改已完成,是否退出?",32+4+256,"询问")=6
use
thisform.release
endif
endif
else
messagebox("密码或用户名有误,请重新输入!",0+48,"警告")
endif
endif
endif
use
thisform.text1.value=" "
thisform.text2.value=" "
thisform.text3.value=" "
thisform.text4.value=" "
thisform.text1.setfocus
以上代码,您可以略做修改,做为密码修改的代码。

◆顶层表单的实现
大家不知道有没有过这样的一种经历,设为顶层表单的表单一运行,就会一闪而过,明明是该设的都设好了啊,呵呵,没事,这里,本人帮你解决问题。

在表单的属性Activate Event里加上Read Even,然后再属性里的Release里加上一句Clea Even。

记住,一定要在Release里加上这一句,不然,无法关闭表单的
你再试一下看看,顶层表单不会再一闪而过了。

◆一个程序多个顶层表单的问题
如果你的程序里要用到两个或两个以上的表单,你会发现,打开出来后的表单会没有办法关闭第一个,这时,就要用到隐藏了,如果你第一个表单运行后,进入第二个时,用_Screen.visible=Off。

这时,在Windows的状态栏里,你会看到只有一个程序了,可是这时,如果你用Ctrl+Alt+Del来结束当前程序的时候,会发现,其实关闭的只是当前的表单,而被隐藏的表单没有被关闭,怎么来解决这个问题呢?没事,在第二个顶层表单,也就是你要关闭的表单的属性里面的Destroy Even加上一句:_Screen.Show 然后再追加一条Quit。

好了,这里你再试一下看看,你会发现你用Ctrl+Alt+Del来结束程序的时候,在Windows任务进程里的程序被关闭了。

到此,你的表单问题解决了
◆给顶层表单添加工具栏
1.在类库MyVcx中建立一个工具栏类MyToolBar,将工具栏的ShowWindow属性设置为1——最上层表单;
2.给顶层表单添加一个自定义属性TopToolBar;
3.编辑顶层表单的Activate event,输入以下代码:
This.TopToolBar=NewObject("MyToolBar","MyVcx")
This.TopToolBar.show()
This.TopToolBar.dock(0)
现在,你就可以享受顶层表单的工具栏了!
◆为表单建立功能键
对于数据输入人员而言,使用鼠标反而降低操作的效率。

比方说,假设操作人员要新增数据时,除了可以使用鼠标按下新增按钮,也可以直接按下功能键[F2],在这种情况下,您觉得操作人员会使用什么方法呢?根据经验,由于数据输入人员对键盘上各类按键的配置位置相当熟悉,因此几乎所有的输入人员都会采用立即可按下的功能键,而不会去使用鼠标,因为他或她不需要将手离开键盘使用鼠标,操作的效率自然提高。

所以,一个设计良好的系统,应该是既能使用鼠标操作,也能使用键盘操作。

由此可见,为表单建立功能键的重要性。

要为表单建立功能键,关键在于KeyPress事件的使用。

因为每当您在表单中按下并放开某一键时,表单的KeyPress事件便会被引发。

显然您只需要在表单的KeyPress事件程序中,去拦截使用者在表单中所按下的每一个键,并且判断它是否是特定功能键,便能决定是否要执行特定的操作。

然而,这却引发了另一个值得讨论的问题,那就是并非只有表单才拥有KeyPress事件,许多控件也拥有KeyPress事件。

比方说,您目前在表单中的某一TEXT输入框中,此时若按下并放开某一按键,所引发的将是此TEXT输入框的KeyPress事件,而表单的KeyPress事件将不会引发。

因此也许您会问,我们是否必须为表单中所有控件的KeyPress事件程序都撰写判断使用者是否按下功能键的程序码?当然不是,因为这样不仅繁琐,而且还会降低效率。

要让表单的KeyPress事件拦截作用控件的KeyPress事件,也就是先引发所属的表单的KeyPress事件再引发作用控件的KeyPress事件,只要将表单的KeyPressView属性设为.T.即可。

这样,您只需要在表单的KeyPress事件程序中撰写判断使用者是否按下建立功能键的程序码,而不需要在表单所内含的各个控件的KeyPress事件中写此代码。

几项说明:
1、由于VFP本身已经为各个功能键定义了按键集合,因此要使您所设定的各个功能键生效,首先必须清除VFP的按键集合定义。

要清除VFP的按键集合定义,必须在表单的INIT事件程序中加入下面这道命令:
CLEAR MACROS
2、请务必将表单的属性设定为逻辑真值。

3、VFP会自动传递两个参数给KeyPress事件程序,因此您必须在KeyPress事件程序的开头处使用LPARAMETERS或PARAMETERS命令来接收这些参数,否则将发生错误。

第一个参数nKeyCode是一个数值型参数,其值为使用者是否按下功能键。

第二个参数nShiftAltCtrl是一个数值型参数,从这个参数您可以判断出使用者按按键是否包含组合键Shift/Alt/Ctrl键。

KeyPress事件程序的代码:
LPARAMETERS nKeyCode,nShiftAltCtrl
DO CASE
CASE nKeyCode= -1 &&[F2]
WITH THISFORM.cmdfind
.SetFocus
.Click
ENDWITH
CASE nKeyCode= -2 &&[F3]
WITH THISFORM.cmdprint
.SetFocus
.Click
ENDWITH
CASE nKeyCode= -3 &&[F4]
WITH THISFORM.cmdadd
.SetFocus
.Click
ENDWITH
ENDCASE
从上面的程序中您可以发现,当按下特定功能键后,我们调用相对应的按钮的Click事件程序,也就是说,要执行的操作仍然是写在各个按钮本身的Click事件中。

而调用SetFocus事件的是为了造成该按钮在外观和视觉上被选定的感觉。

----4、我们希望在程序结束执行后,恢复默认的按钮集合定义。

要达到此目的,必须在表单的退出事件中撰写下列命令:
RESTORE MACROS
◆VFP中实现背景音乐的几种方法
一、利用set bell to
VFP5.0的set bell to命令的使用格式不同于FoxPro2.X的格式。

在VFP5.0中,它的格式为Set Bell To [cWAVFileName, nDuration]。

其中cWAVFileName为一个.WAV文件;nDuration为持续时间(注意该项不可省略,否则会产生语法错误)。

这样当在个人程序的初始模块中用set bell to 定向到一.WAV文件后,便可在后面的模块中用?chr(7)来播放该.WAV文件。

示例1:
set bell on &&使bell有效
set bell to'.WAV文件',0 &&定向到一个.wav文件。

?chr(7) &&播放该.WAV文件
二、利用OLE容器控件
创建一表单,单击表单控件工具栏中的“OLE容器控件”按钮,然后在表单上适当位置点击或拖动。

在出现的“Insert Object”窗口中选“Creat New”或“Creat From File”,用“Browse”按钮选取自己的.WAV文件,确定即可。

在当前表单中会出现一“喇叭”图标,设置该图标的属性“ AutoActivate”为1,可使每当表单运行时自动播放该.WAV文件,实现背景音乐;设置Height、Width均为0时,可隐藏“喇叭”图标。

三、利用VFP库Foxtools.fll
用=Regfn()和=Callfn()可访问Foxtools.fll中的音频模块,进行播放声音文件。

示例2:
创建一表单,在其Activate事件中输入下列代码:
public ss &&定义一全局变量ss
set library to foxtools.fll &&打开库Foxtools.fll
ss=Regfn("SndPlaySound","CI","I","mmsystem")&&取得音频信息
=Callfn(ss,".wav文件",n) &&n=0(1,2,3也可)时只播放一遍,n=9时循环播放
在其Destroy事件中输入下列代码:
=Callfn(ss,"",10) &&停止播放
set library to &&从内存中释放库foxtools.fll
四、利用Windows的动态链接库
在VFP5.0的安装目录samples\classes下,有一类库samples\classes。

其中提供有两种控件:视频和音频,音频可以控制播放.WAV和.MID文件,利用它可轻松地实现背景音乐。

下面给出它的实例。

示例3:
创建一表单,在表单控件工具栏中选择类按钮,添加VFP5.0中的samples\classes\samples.vbx类库。

此时表单控件工具栏中会出现SoundPlayer和VideoFrame两个多媒体控件。

选择SoundPlayer,在表单上单击后,设置属性如下:
AutoOpen=.t.
AutoPlay=.t.
AutoRepeat=.t.
Class=SoundPlayer
Soundfile=指定.WAV或.MID文件&注意没有引号
Visible=.f. &&不可见
以上几种方式各有优缺点,应用时要注重满足自己的编程需要。

◆声音的播放
在程序的编制过程中,适当地使用声音,可达到意想不到的效果,下面是在VFP中加入声音的几种方法:
1.使用set bell to 命令
用set bell to 命令可以直接播放声音,此方法主要适用于给按钮加上声音效果,比如有一个"开始"按钮,要在按下它时能发声,可在其CLICK EVENT中加入如下代码:
wav_name="sound.wav"
set bell to wav_name,0
??chr(7)
其中sound.wav为要播放的声音文件。

2.调用mplayer2.exe来播放
Mplayer2.exe是Windows自带的媒体播放器,在VFP中,可使用如下命令来播放声音文件:
Run /n7 c:\progra~1\micros~2\mplayer2.exe"sound.wav"
---- 若想在启动时播放声音,可将该语句放入表单的init事件中。

这种方法适宜于用来播放背景音乐,其缺点是播放时,Windows 工具栏上有一个最小化后的媒体播放器。

3.使用OLE控件在表单中添加一个OLE对象可按如下顺序:
①新建一个表单,选中表单控件工具栏的OLEcontrol;
②在表单上按下鼠标左键,建立OLE对象,在出现的对话框中选择声音对象,选择以"create form file"方式插入;
③选择要插入的声音文件,确定退出;
④用Doverb方法来执行,其中Doverb(0)用来播放,Doverb(1)用来编辑。

例如要在表单启动时同时启动声音,可在表单的init 事件中加入如下语句:
thisform.olecontrol1.doverb(0)
4.使用Microsoft Media Player控件
在一个表单中加入声音的顺序如下:
①在VFP中,选择"工具"选单的"选项";
②在出现的界面中选择"控件" ,选中"ActiveX控件" ,在选定对话框中选择"Microsoft media player",确定退出该界面;
③在工具栏中选择"ActiveX控件" ,选中"Microsoft media player"控件,在表单上单击鼠标左键,这样就创建了"Microsoft media player"对象;
④以下语句可实现声音的播放:
thisform.olecontrol1.open(″sound.wav″)
playcount 可用来控制播放的次数;
如想实现重复播放,可在EndOf Stream Event中加入语句:this.play。

这种方法也可以用来播放.avi、.mpeg等文件,只需把上面的"sound.wav"文件改为相应类型的文件即可。

◆在屏幕中央显示提示框
一般在处理数据时,都在屏幕中间显示一个一个提示正在处理数据的提示框,Vfp 能否作到了。

当然能,而且很简单,只要您跟着下面的做法,一定能成在处理之前先做
lcMsg = "Processing, Please Wait......."
WAIT WINDOW lcMsg NOCLEAR NOWAIT AT SROW()/2, (SCOLS()-LEN(lcMsg))/2
处理后用Wait clear 清除等待框即可达到效果。

◆Visual FoxPro多媒体表单设计
世界进入信息时代以来,人们不得不对越来越多的信息进行处理与管理。

其中既有大量的文字信息,也包括各式各样的静态图形、动态图象和声音等多媒体信息。

传统的只能处理文本信息的数据库管理系统已不能适应社会发展。

当今的时代越来越需要能够处理
多媒体信息的数据库管理系统。

而MicroSoft 推出的Visual FoxPro 系统,能充分利用Windows 的设备无关性等优势,在多媒体信息管理和处理能力上有了很大提高。

它的出现为开发多媒体程序提供了很大方便。

但从多媒体数据管理性能看,Visual FoxPro 命令集中只有静态图形的直接显示功能,动态图象和声音的播放或编辑,则需要外部功能的支持。

因此,为了完成多媒体数据管理,Visual FoxPro 提供了调用DLL (动态链接库)的功能,允许在应用程序中充分发挥Windows 中DLL 资源的优势。

它还可利用Windows 提供的MCI (Media Control Interface) 多媒体控制接口功能,使用户能够控制各种媒体设备。

除此之外,Visual FoxPro 还支持OLE (对象的链接与嵌入)功能,用户可利用各种OLE 控件进行多媒体程序设计。

本文即以OLE 控件为例,简要介绍Visual FoxPro 中多媒体声音表单的设计方法。

一、声音控件创建
Visual FoxPro 中有两种OLE 控件,一种是OLEControl(OLE 容器控件),一种是OLEBoundControl(OLE 绑定型容器控件)。

OLEBoundControl 主要用于对Visual FoxPro 表中General(通用型)字段的控制。

而利用OLEControl 控件创建的嵌入式OLE 对象,可与表单构成一体。

用OLEControl 控件创建有声表单的过程如下:
1. 选择OLE 容器控件
首先在“ 表单设计器” 中打开需要填加声音对象的表单,进而用鼠标左键单击“ 表单控件工具栏” 的按钮,选择添加该控件,如图1 所示。

2. 选择添加的对象类型
在表单上,用鼠标左键选择适当的区域,建立OLE控件。

进而在随后出现的“Insert Object” 对话框(图2 )中,选择要添加的对象类型(Object Type)为“ 声音”(添加其它类型的多媒体对象则应选择相应类别)。

3. 从现存文件添加对象
添加对象可以以“Create New” 方式或“Create From File” 方式进行。

如果选择以“Create From File” 方式添加对象,将出现图3 所示对话框。

单击“Browse” 按钮后,则出现图4 所示“ 插入文件” 画面。

选择相应声音文件后,按“ 打开” 按钮,即可完成从现存文件添加声音对象过程。

4. 创建新对象
如果选择以“Create New” 方式添加对象,应单击“Insert Object” 对话框的“Ok” 按钮。

它将启动声音编辑程序,对新文件进行录音或编辑。

如果在“ 编辑” 菜单上执行“ 插入文件” 项(图 5 ),也将出现图4 所示“ 插入文件” 画面。

选择相应声音文件后,按“ 打开” 按钮,即可插入现存文件进行编辑。

完成文件编辑后,选择执行“ 文件” 菜单上“ 退出” 功能,即完成创建新声音对象的过程。

二、声音控件执行方法
1. 执行方法说明
建立的OLE 对象的一般可用DoVerb 方法来执行。

该方法应用于OLE 绑定型容器控件和OLE 容器控件,它可在指定的对象上执行一个相应动作。

其执行语法为:
ObjectName. DoVerb([nVerb])
其中的ObjectName 为OLE 容器控件对象名称。

参数nVerb 指定在OLE 容器控件中对象要执行的动作值。

如果没有指定,就执行默认的动作。

各值对应的对象执行动作如下:
0 -对象的默认动作。

一般为“ 播放”
1 -激活要编辑的对象。

如果创建对象的应用程序支持现场激活,就在OLE 容器控件中激活对象。

2 -在一个独立的应用程序窗口中打开对象。

如果所创建对象的应用程序支持现场激活,就在对象自身的窗口中激活对象。

3 -对于嵌入的对象,隐藏创建对象的应用程序。

4 -如果对象支持现场激活,就以现场激活方式激活对象并显示任何用户界面工具。

如果对象不支持现场激活,对象就不激活并产生错误。

5 -如果用户将焦点移到OLE 容器控件中,就创建一个窗口,并准备要编辑的对象。

如果对象不支持以鼠标单击的方式激活,就产生错误。

6 -当激活要编辑的对象时,用来放弃所有记录的更改,对象的应用程序可以撤消这些更改。

2. 命令按钮创建与设置
一般而言,DoVerb(0)用来播放OLE 对象,DoVerb(1)用来编辑。

为了能让用户在表单运行时操作OLE 对象,首先需在该表单上创建相应的“ 播放” 与“ 编辑” 命令按钮,如图6 所示。

为了各按钮能执行相应功能,应设置其CLICK 事件代码。

如果需要操作的OLE 对象名为Olecontrol1,则“ 播放” 按钮的CLICK 事件代码应设为:
ThisForm. OleControl1. DoVerb(0)
“ 编辑” 按钮的CLICK 事件代码应设为:
ThisForm. OleControl1. DoVerb(1)
设置完成后,即可在表单运行时单击按钮进行声音“ 播放” 或“ 编辑”。

另外,如果将OLE 对象的AutoActivate 属性设置为2(双击),那么当用户双击该OLE 容器控件时,也可自动激活该对象,进行默认的播放动作。

有时用户希望表单在启动和退出时能够发出提示声音。

这项功能其实也很容易实现-
只要在表单的Activate Event 和Dstroy Event 事件中,加入声音播放代码:ThisForm. OleControl1. DoVerb(0),即可达到相应效果。

在Visual FoxPro 中用OLE 控件进行多媒体程序设计,操作简单方便,但也有缺点:它不能灵活控制OLE 对象,只能进行简单的播放与编辑功能,而且执行速度较慢。

为了解决上述问题,能够实现快捷与多功能的多媒体操作,则需要利用Windows 的DLL资源,用MCI 进行多媒体程序设计。

这种方法本文不再介绍,各位读者不妨自己设计,亲自体验其用法与功能。

◆VFP中实现电话拨号
用VFP 管理名片簿、通信录时,经常要用到电话拨号程序。

如直接使用windows98自带的拨号程序,VFP 程序的完整性和界面一致性都将受到影响。

设计思想
要实现拨号,只需让程序往串口写入AT命令。

利用VFP 对Microsoft commcontrol控件的支持可以方便地控制电话。

假设有一数据表communication.dbf,内容如下:姓名电话号码其他张三1234567etc……将上述表引入表单form1的数据环境之后,在form1上加入下列控件,如下所示:
控件名称控件类型控件属性值
Text1TextControlSource=communication.姓名
Text2TextControlSource=communication.电话号码
Command1CommandButtonCaption="拨号"
Command2CommandButtonCaption="挂断"
Command3CommandButtonCaption="下条记录"
在表单中加入OLE容器控件,当提示菜单出现时,选择
InsertControl ,在ControlType(控件类型)栏内找到并双击MicrosoftCommControl,这时表单上会出现一个带电话标志的图标,设定该控件的名称为Telephone ,这就是在VFP中实现电话拨号的核心部件。

选择Telephone 控件,单击右键,选择MSCommProperties菜单项,可以更加灵活地控制该控件。

设定事件代码
在form1的init事件中加入下列代码:
go top
*设定通讯端口号,笔者的modem是接在com3上
mport=3
*设定端口的波特率、通讯字长以及是否进行校验
thisform.telephone.Settings="9600,n,8,1"
在command1的click事件中加入下述代码:
this.enabled=.not.this.enabled
mand2.enabled=.t.
*打开通信端口,准备工作
thisform.telephone.portopen=.t.
*ATDT表示执行AT命令中的DT指令,D 表示首先挂断电话
*T表示使用音频拨号,如果你的电话使用的是脉冲方式拨号
*请将t改为p,chr(13)表示发送命令完毕
thisform.telephone.output="ATDT"+电话号码+Chr(13)
Wait Wind "正在拨号,请稍候"nowa
在command2的click事件中写入下列代码:
mand1.enabled=.t.
mand2.enabled=.f.
*关闭通信端口
thisform.telephone.portopen=.f.
在command3的click事件中写入下列代码:
skip
if eof( )
go top
endi
thisfor.refresh
经过上面步骤,大功告成了。

戴上耳机,对着话筒。

◆pack删除时Grid变空白
VFP的表格控件Grid是一个很好的显示查询、编辑数据的控件,但是在使用中会遇到以下问题:
1、使用select-SQL语句、临时表或表别名作为Grid的Recordsource属性时,在select条件、临时表或表别名发生变化时,Grid控件往往不能显示出数据,或者原有的Grid属性包括列及列标头属性全部丢失,恢复成Grid默认的属性。

2、使用Pack命令彻底删除表中某些记录时,其结果往往是Grid一片空白,什么都显示不出来。

很多人对此感到疑惑。

也有人想出把Grid先保存成类的办法来解决这类问题,都比较麻烦,其实有个很简单的方法可以解决一系列有关Grid的数据源刷新问题:
在改变Grid或执行Pack前,先将Grid的recordsource属性置成Null,再执行相应的select-SQL语句、改变表别名或Pack 命令,例
thisform.grid1.recordsource=Null
pack
thisform.grid1.recordsource='tablename'
&&恢复原表别名
thisform.grid1.recordsource=Null
thisform.grid1.recordsource='newtablename'
&&改变了别名
thisform.grid1.recordsource=Null
thisform.grid1.recordsource='selectcolumn1,
column2fromtablenamewherecolumn1=thisform.text1.valueintocursorTemptable'
thisform.grid1.recordsource='Temptable'
这样Grid不但能正确显示变化后的数据,而且其属性不会丢失。

◆VFP中实现鼠标置上醒目功能
在Windows中的一些应用系统中,常常有这样的操作效应,在系统提供的命令按钮组中,当把鼠标指针移到某一命令按钮时,这个命令按钮会变得醒目突出,移走鼠标后,按钮又会恢复原态,使用起来非常方便。

其实在VFP 6.0中也为我们提供了能够实现这种效果的一个类:_Mouseoverfx。

置上醒目设置类_Mouseoverfx位于VFP系统\Ffc子目录下的_ui.VCX类库中,使用它时,只要先将这个类添加到表单中,并为该类指定适当的属性值,然后在需要作用控件的MouseMove事件中放置一个Highlightme方法的引用,即可轻松实现鼠标置上醒目功能。

类_Mouseoverfx的相关属性、事件和方法说明。

nMargin属性:指出控件和醒目之间的边缘,缺省值为2。

iShadowColor属性:指出阴影的颜色代码,缺省值为0。

lMouseoverHost属性:指出鼠标是否在主mousefx上,缺省为.T.
nHighlightWidth属性:指出醒目的宽度,缺省值为2。

iHighlightColor属性:指出醒目的颜色代码,缺省值为0。

oCurrentCoolControl属性:该类内部使用,缺省值为""。

CancelHighlight方法:使用lMouseoverHost的值确定是否有一个醒目的对象需要改变。

当ImmouseOver指出当前控件已改变时,设置oCurrentCoolControl为.NULL.并返回真(.T.)。

你的子类可以通过检查该返回值或者当前lMouseoverHost的状态,oCurrentCoolControl用适当次数从冷却的控件中"减去"它们自己的特殊影响。

HighlightMe方法:设置当前控件oCurrentCoolControl为toObject指定的对象引用。

当它因为当前控件已改变而激活时返回真(.T.)。

如果因为当前控件没有改变而不需要激活时返回假(.F.)。

你的子类可以使用oCurrentCoolControl属性和该方法的返回值决定它们什么时候激活、提供其它特殊影响,对于有些"当前控件"的特定子类是特殊的。

语法:HighlightMe(ToObject) 返回值Ichange指出当前的控件是否已经改变参数:toObject指出MouseOver事件影响的对象
为了更好地了解该类的具体使用方法,笔者举一个简单的例子,说明该类的具体使用方法。

新建一个表单,并将_Mouseoverfx类加到表单中。

然后在表单内建立四个标签(名称分别为L1、L2、L3、L4),标题均为空,四个标签设为不同的背景颜色值,在每个标签的MouseMove事件中写入如下代码:
Thisform._MouseOverFX1.HighlightMe(This)
设置完毕并执行该表单后,当我们把鼠标移到某个标签时,该标签即会呈现醒目状态。

◆如何判别软驱中有无盘片
在Microsoft Visual FoxPro中,判断软驱中是否有盘片
------有关路径的几个问题
在用VFP进行文件的读写操作时,经常会遇到路径不对或文件无法读写的问题,比如说向软盘中写入数据,而此时软驱中没有盘片或软驱中的盘片处于写保护状态,造成系统出错。

下面我们来谈谈如何来避免这种情况,这里以一个实例来演示。

在VFP中建立一个表单,界面如下:
本例主要是用来实现"*.dbf"文件的COPY,其中text1也就是数据源,可以是手中输入也可以是通过“数据源”按钮来选择,输出路径也是这样。

正是因为这样,就有了很多问题:
如果直接在text1中输入数据源,如果源文件不存在怎么办?
数据源正在使用怎么办?
如果text2中指定的路径不存在怎么办?
指定的输出路径为软盘,而此时软驱中没有盘片怎么办?
软盘片写保护怎么办?
软盘片写满怎么办?
输出路径为光盘怎么办?
……所有这一系列的问题都会,使得VFP这个破烂系统出现无法预期的问题,如果软件的使用者对VFP有较深的了解,那还好,不然就惨了。

因此我们要对这些意想不到的问题进行严防,以上例为准,我们为其加上代码。

“输出”按钮的源代码如下:click()事件:
file1=allt(thisform.text1.value)
dirr=allt(thisform.text2.value)
if subs(allt(thisform.text2.value),1,1)="a" .and. diskspace("&dirr")=-1
messagebox('请插入软盘!',0,'错误')
thisform.text2.setfocus
retu
endif
if subs(allt(thisform.text2.value),1,1)="A" .and. diskspace("&dirr")=-1
messagebox('请插入软盘!',0,'错误')
thisform.text2.setfocus
retu
endif
do case
case empty(thisform.text1.value)
messagebox('请输入数据源!',0,'错误')
retu
case !file("&file1")
messagebox('数据源指定错误!',0,'提示')
thisform.text1.setfocus
retu
case !directory("&dirr")
messagebox('输出路径不正确,请重新指定!',0,'错误')
thisform.text2.setfocus
retu
case empty(thisform.text1.value)
messagebox('请指定输出路径!',0,'错误')
retu
endcase
copy file &file1 to &dirr
error()事件:
LPARAMETERS nError, cMethod, nLine
do case
case nError=1963
messagebox('您指定的路径不对,请重新指定!',0,'错误')
thisform.text1.setfocus
case nError=1907
messagebox('指定的盘符不对,请重新指定!',0,'错误')
thisform.text1.setfocus
case nError=1105
messagebox('软盘写保护!',0,'错误')
case nError=7
messagebox('已有相同的文件存在!',0,'错误')
case nError=1
messagebox('指定的数据源不存在!',0,'错误')
thisform.text1.setfocus
case nError=3
messagebox('文件正在使用,请退出后重新执行!',0,'提示')
case nError=108
messagebox('文件正在使用,请退出后重新执行!',0,'提示')
case nError=56
messagebox('磁盘已满,空间不足!请删除部分文件后重试!')
case nError=1102
messagebox('不能创建,指定路径为只读或没有空间!',0,'错误')
endcase
retu
在本例中,首先从click()事件的开始就对路径的完整性和正确性进行判断,然后在error()事件中对可能遇到的错误进行捕捉。

这样做的好处是,如果软件被发布的话,不论用户如何操作,都不会出现系统错误。

本例中只考虑到对路径的确认和错误的捕捉,对于捕捉到的错误进行再处理没有提及,对文件格式没有作任何要求,实际上不是*.dbf格式的文件,在本例中也是被默认通过的。

感兴趣的朋友可以在此基础上进行完善,做出一个完整的数据备份程序。

本例中没有添加注解,所有语句的用法和作用从程序中的中文字面就可以看出来。

◆使用VFP的_SCREEN对象
在VisualFoxPro中充分利用_SCREEN对象,就能对主窗口进行各种操作,如可以动态地改变主窗口的图标、标题、颜色等,也可以通过它引用其它的对象或属性。

_SCREEN对象(即指主窗口)是从表单类派生出来的,表单中的部分属性、事件和方法在_SCREEN对象也存在,因而可以把主窗口当作表单来操作(但也有所不同,如在_SCREEN中不能像表单那样对LOAD、ACTIVATE等事件添加代码)。

下面举例说明如何利用_SCREEN对象:。

相关文档
最新文档