【转载】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对象的简单阐述,想要你的窗口美化起来,具体的工作还需要你自己去做。 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论