【转载】vf常用代码集锦(上)
2010-07-20 16:04
◆文字滚动的效果
在表单添加一个计时器,把计时器INTERVAL设为30
如要走动的文字在标签1也就是LABLE1,
在计时器的timer里写下如果代码:
if thisform.label1.left+thisform.label1.width=0
  thisform.label1.left=thisform.width
else
  thisform.label1.left=thisform.label1.left-1
endif
此时,LABLE1的文字将从右到左不停的走动,这时,如果要加一些效果,比如说是文字让它变颜,一直闪烁的话。
可以再加“文字闪烁的效果”里的代码,两者结合,效果很好。
◆文字闪烁的效果
假设要闪烁的标签文字在Label1上。在表单添加一个计时器 设Interval的值为30。在表单的Alwaysontop也就是表单属性的第一个值里声明变量,代码为:
Public I
I=0
在计时器Timer1的Timer写下代码
i=i+10
if i>=255*2
  abled=.t.
  i=0
endif
if i>=255
  thisform.label1.forecolor=RGB(255*2-i,50,110)
  else
  thisform.label1.forecolor=RGB(i,80,170)
endif
打开表单,就会出现文字闪烁了,如果你有兴趣,试试看
◆密码的设置
在表单中添加两个文本框,text1为用户名;text2为密码,添加两个命令按钮,设为确定和取消,数据表的结构两个字段:(name *用于存放用户名)和(mm *用于存放密码)
在确定按钮的click事件写入
1.value="".2.value=""
  =messagebox ("用户名或密码不能为空!",0+48,"警告!")
else
  sele 1
  use shujubiao\yonfu.dbf
  if name=1.value).=2.value)
      use
      1.value=" "
      2.value=" "
      wait"登陆成功,正在加载数据,等稍等" time 2 windows
      thisform.visible=.f.
      lease
      close all
      do form zym.scx *写入您要执行的表单
    else
      use
    messagebox("用户名或密码错误,请重新输入!",0+48,"警告!")
    1.value=" "
    2.value=" "
endif
endif
在取消按钮的click写入
close all
lease
确记啊,不能把“确定”按钮设为Enter的模式,如果设定后,启动表单时,可是不用输入密码直接按确定就可以进入了。
◆密码修改源程序
表单中四个文本框,分别为用户名、密码、新用户名、新密码对应为:text1;text2;text3;text4。此表单所用的数据表和密码设置为同一张表。在表单的“确定”按钮click写入代码
1.value="".2.value="".3.value="".4.value=""
    =messagebox("存在空输入框,无法修改!",0+64,"警告")
else
  use e:\xyz\表1.dbf *打开数据表
  if not eof()
loca for name=1.value).=2.value)
      if name=1.value).=2.value)
          if messagebox("要保存修改吗?",32+4+256,"询问;")=6
            repla name 3.value,mm 4.value
            if messagebox("修改已完成,是否退出?",32+4+256,"询问")=6
                use
                lease
            endif
        endif
    else
        messagebox("密码或用户名有误,请重新输入!",0+48,"警告")
    endif
endif
endif
use
1.value=" "
2.value=" "
3.value=" "
4.value=" "
1.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]
dfind
.SetFocus
.Click
ENDWITH
CASE nKeyCode= -2 &&[F3]
dprint
.SetFocus
.Click
ENDWITH
CASE nKeyCode= -3 &&[F4]
dadd
.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文件,利用它可轻松地实现背景音乐。下面给出它的实例。 vb设计模拟密码输入器
示例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. 调用来播放
是Windows自带的媒体播放器,在VFP中,可使用如下命令来播放声音文件:
Run /n7 c:\progra~1\micros~"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, "
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上
lephonemport=3
*设定端口的波特率、通讯字长以及是否进行校验
lephone.Settings="9600,n,8,1"
在command1的click事件中加入下述代码:
abled=.abled
abled=.t.
*打开通信端口,准备工作
lephone.portopen=.t.
*ATDT表示执行AT命令中的DT指令,D 表示首先挂断电话
*T表示使用音频拨号,如果你的电话使用的是脉冲方式拨号
*请将t改为p,chr(13)表示发送命令完毕
lephone.output="ATDT"+电话号码+Chr(13)
Wait Wind "正在拨号,请稍候"nowa
在command2的click事件中写入下列代码:
abled=.t.
abled=.f.
*关闭通信端口
lephone.portopen=.f.
在command3的click事件中写入下列代码:
skip
if eof( )
    go top
endi
fresh
经过上面步骤,大功告成了。戴上耳机,对着话筒。
◆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命令,例
dsource=Null
pack
dsource='tablename'
&&恢复原表别名
dsource=Null
dsource='newtablename'
&&改变了别名
dsource=Null
dsource='selectcolumn1,
1.valueintocursorTemptable'
dsource='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=1.value)
dirr=2.value)
if subs(2.value),1,1)="a" .and. diskspace("&dirr")=-1
    messagebox('请插入软盘!',0,'错误')
    2.setfocus
    retu
endif
if subs(2.value),1,1)="A" .and. diskspace("&dirr")=-1
    messagebox('请插入软盘!',0,'错误')
    2.setfocus
    retu
endif
do case
    case 1.value)
      messagebox('请输入数据源!',0,'错误')
      retu
    case !file("&file1")
      messagebox('数据源指定错误!',0,'提示')
      1.setfocus
      retu
    case !directory("&dirr")
      messagebox('输出路径不正确,请重新指定!',0,'错误')
      2.setfocus
      retu
    case 1.value)
      messagebox('请指定输出路径!',0,'错误')
      retu
endcase
copy file &file1 to &dirr
error()事件:
LPARAMETERS nError, cMethod, nLine
do case
    case nError=1963
      messagebox('您指定的路径不对,请重新指定!',0,'错误')
      1.setfocus
    case nError=1907
      messagebox('指定的盘符不对,请重新指定!',0,'错误')
      1.setfocus
    case nError=1105
      messagebox('软盘写保护!',0,'错误')
    case nError=7
      messagebox('已有相同的文件存在!',0,'错误')
    case nError=1
      messagebox('指定的数据源不存在!',0,'错误')
      1.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对象:
1、更改图标和标题
把VFP窗口的小狐狸图标和“MicrosoftVisualFoxPro”标题,改为你所喜欢的图标和标题,只需执行代码
_SCREEN.ICON="你的图标文件名(.ICO)"
_SCREEN.CAPTION="你的标题名"
2、动态地改变主窗口的图标和标题
即让主窗口的图标和标题随时间的变化而变化。这就需要在_SCREEN中加入一个Timer类,Timer类是每经过一定的时间(在Interval属性中设定,单位为毫秒)循环地执行其Timer事件中的代码。方法如下:先定义你的Timer类:点“文件/新建/类/新建文件”,这时弹出一窗口,上面有这几项需要填写:“类名”项填新建类名(如MyTimer),“派生于”项选Timer,“来源于”项不用填,“存储于”项填新建类库名(如MyClass)。确定后出现类设计器(很像表单设计器),上有一小闹钟(Timer控件)把其Interval属性设为1000(时间间隔,毫秒),在Init事件中输入代码:
PUBL NN
NN=0&&NN为变化的标志变量
在Timer事件(每隔一定时间执行)输入:
_SCREEN.ICON=IIF((-1)^NN,"所需加入的图题1","图标2")
_SCREEN.CAPION=IIF((-1)^NN,"所需加入的标题1","标题2")
NN=NN+1
关闭并保存,类建立完毕。
可视地把该类添到_SCREEN中:由于_SCREEN与表单有所区别,故不能用表单设计器工具来完成拖放类定义,而是用“类浏览器”来完成,寻工具/类浏览器”后,弹出一打开窗口,选择刚才建立的类库文件(MYCLASS),确定后,弹出类浏览器窗口,选中MyTimer类,这时在类浏览器的左上角有一小闹钟,把它拖放到主窗口中,你就会惊奇地发现你的主窗口不再是死气沉沉的了。不信?试试!
3、利用_SCREEN得到主窗口内包含的表单数量
执行:?_SCREEN FORMCOUNT即可
4、利用_SCREEN得到打开的表单名
可执行:?_SCREEN FORMS(1) NAME &&FORM(1)为数组
以上是有关_SCREEN对象的简单阐述,想要你的窗口美化起来,具体的工作还需要你自己去做。