表单问题(二) 15.多种特效表单 在使用Visual FoxPro 5.0编制应用程序时,‘表单’大概是最常用的组成部份,然而,时间一久,自然会有点厌了它那个一闪即现、转眼即逝的风格。笔者于是试着改变表单的启动和关闭的方式,效果还算不错,有兴趣的读者不妨一试。 首先要进入Visual FoxPro 5.0系统环境中,建立一个新的表单(Form1),然后再在表单上建立一个‘计时器’控件(Timer1),设置Timer1的InterVal属性为100ms。接下来的工作就是为表单和计时器控件加入事件响应的代码: 启动表单 1、由左至右展开表单。 Form1的Load方法: Public F_wid,I F_WID = Thisform.Width Thisform.Width = 0 I = 104 Timer1的Timer方法: If I > F_wid Thisform.Timer1.Enabled = .F. Return Endif Thisform.Width = I I = I + 10 2、由右至左展开表单。 Form1的Load方法: Public F_wid,I F_wid = Thisform.Width Thisform.Left = Thisform.Left + F_wid - 104 Thisform.Width = 0 I = 104 Timer1的Timer方法: If I >= F_wid Thisform.Timer1.Enabled = .F. Return Endif Thisform.Left = Thisform.Left - 10 Thisform.Width = I I = I + 10 3、由上至下展开表单。 Form1的Load方法: Public F_hei,I F_hei = Thisform.Height Thisform.Height = 0 I = 0 Timer1的Timer方法: If I >= F_hei Thisform.Timer1.Enabled = .F. Return Endif Thisform.Height = I I = I + 10 4、由下至上展开表单。 Form1的Load方法: Public F_hei,I F_hei = Thisform.Height Thisform.Height = 0 Thisform.Top = Thisform.Top + F_hei I = 0 Timer1的Timer方法: If I >= F_hei Thisform.Timer1.Enabled = .F. Return Endif Thisform.Top = Thisform.Top - 10 Thisform.Height = I I = I + 10 5、由左上角向右下角展开表单。 Form1的Load方法: Public F_hei,F_wid,I F_hei = Thisform.Height F_wid = Thisform.Width Thisform.Height = 0 Thisform.Width = 0 I = 0 Timer1的Timer方法: If I >= F_hei Thisform.Timer1.Enabled = .F. Return Endif Thisform.Height = I Thisform.Width = I * F_wid / F_hei I = I + 10 6、由左下角向右上角展开表单。 Form1的Load方法: Public F_hei,F_wid,I F_hei = Thisform.Height F_wid = Thisform.Width Thisform.Height = 0 Thisform.Width = 0 Thisform.Top = Thisform.Height + F_hei I = 0 Timer1的Timer方法: If I >= F_hei Thisform.Timer1.Enabled = .F. Return Endif Thisform.Top = Thisform.Top - 10 Thisform.Height = I Thisform.Width = I * F_wid / F_hei I = I + 10 二、关闭表单 1、由左至右关闭表单。 Form1的Load方法: Public F_wid,F_left F_wid = Thisform.Width F_left = Thisform.Left Timer1的Timer方法: If F_wid <= 100 Thisform.Timer1.Enabled = .F. Thisform.Release Endif Thisform.Width = F_wid Thisform.Left = F_left F_wid = F_wid - 10 F_left = F_left + 10 2、由右至左关闭表单。 Form1的Load方法: Public F_wid F_wid = Thisform.Width Timer1的Timer方法: If F_wid <= 104 Thisform.Timer1.Enabled = .F. Thisform.Release Endif Thisform.Width = F_wid F_wid = F_wid - 10 3、由下至上关闭表单。 Form1的Load方法: Public F_hei F_hei = Thisform.Height Timer1的Timer方法: If F_hei <= 10 Thisform.Timer1.Enabled = .F. Thisform.Release Endif Thisform.Height = F_hei - 10 F_hei = F_hei - 10 4、由上至下关闭表单。 Form1的Load方法: Public F_hei F_hei = Thisform.Height Timer1的Timer方法: If F_hei <= 10 Thisform.Timer1.Enabled = .F. Thisform.Release Endif Thisform.Top = Thisform.Top + 10 Thisform.Height = F_hei F_hei = F_hei – 10 5、由右上角向左下角关闭表单。 Form1的Load方法: Public F_hei,F_wid,I F_hei = Thisform.Height F_wid = Thisform.Width I = F_hei Timer1的Timer方法: If F_hei <= 10 Thisform.Timer1.Enabled = .F. Thisform.Release Endif Thisform.Top = Thisform.Top + 10 Thisform.Height = F_hei Thisform.Width = F_hei * F_wid / I F_hei = F_hei - 10 由右下角向左上角关闭表单。 Form1的Load方法: Public F_hei,F_wid,I F_hei = Thisform.Height F_wid = Thisform.Width I = F_hei Timer1的Timer方法: If F_hei <= 10 Thisform.Timer1.Enabled = .F. Thisform.Release Endif Thisform.Height = F_hei Thisform.Width = F_hei * F_wid / I F_hei = F_hei – 10 16. 可以迅速地在属性窗口中定位吗? 热键Ctrl+Alt+key可使在属性窗口中定位变得快而简单。 例如,当表单对象选中时,在属性窗口中按下Ctrl+Alt+C将快速移动到Caption属性。 如何把数组作为参数传递给表单? 答案13: 在foxpro中,数组必须按址传递。set udfparms决定参数的传递方 式。在默认情况下,当你用do...with调用过程或表单时,参数是按址传递。 在函数或方法中,参数是按值传递。 dimension array[10] do form form1 with array 在这种情况下,你必须用一个"@"符号强迫参数的传递为按址传递。 dimension array[10] myform = createobject("form1", @myarray) 给页框架(Pageframe)的标题加背景颜色 一般给页框架的各个页面加背景颜色时,总是页框架的标题(头部)加不上去,这时可将页框架Pageframe的Tabs特性改为·F·,然后将各个Page分别加入所需背景颜色,再把Tabs特性改为·T· 即可。 判断当前是否运行表单 ① 指定表单名: If Not Wexist("appendform") endif ② 不指定表单名: IF VARTYPE(_SCREEN.ACTIVEFORM)='O' _SCREEN.ACTIVEFORM.NAME ENDIF 表单上文字滚动的效果 在表单中添加一个计时器,把计时器的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 thisform.timer1.enabled=.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 这时,打开表单时,就会出现文字闪烁了 为记录自动添加唯一的编号的代码 编号=Right(str(100000000+reccount('Tablename'),9),8) 创建编号索引 goto bottom in 表 编号=padl(iif(bof("表"),0,int(val(表.编号))) + 1,9,8) 数字与汉字的转换代码 例:1978,如何转化为汉字一九七八? lc数字 = allt(str(1978)) lc汉字= STRTRAN(STRTRAN(STRTRAN(STRTRAN(STRTRAN(STRTRAN(STRTRAN;(STRTRAN(STRTRAN(STRTRAN(lc数字,[1],[一]),[2],[二]),[3],[三]),[4],[四]),[5],[五]),[6],[六]),[7],[七]),;[8],[八]),[9],[九]),[0],[零]) chrtranc("1978","0123456789","零一二三四五六七八九") 怎样播放声音文件(.WAV)? 除了使用第三方产品和API调用之外,播放.WAV的最简单的方法是: SET BELL TO "c:\sound.wav",1 CHR(7) SET BELL TO setall 方法 为容器对象中的所有控制或某类控制指定一个属性设置。Container.SetAll(cProperty, Value [, cClass]) 参数 cProperty 要设置的属性。 Value 属性的新值,Value 的数据类型取决于要设置的属性。 cClass 指定类名,该类为对象的基类,不能是 Visual FoxPro 基类器对象中的所有控制或某类控制指定一个属性设置。 使用 Set All 方法可为容器中的所有控制或某类控制设置一个属性。例如,为了把表格控制中列对象的 BackColor 属性设置为红色,可以使用下列命令: Form1.Grid1.SetAll(BackColor, RGB(255, 0, 0), Column) 也可以设置容器中其他对象包含的对象属性。要把表格控制中每个列对象包含的标头的 ForeColor 属性设置为绿色,可以使用下列命令: Form1.Grid1.SetAll('ForeColor', RGB(0, 255, 0), 'Header') 表单上的控件增加复制粘贴等功能 当你将表单设置为顶层表单并独立运行于Windows下,就会发现表单中复制粘贴功能失效,给实际工作造成极大的不便,从而使编制的软件达不到专业水准。通过认真分析与实践,笔者认为,造成这一问题的原因是微软设计VFP时,只考虑了位于系统选单下的表单的复制和粘贴情况,即位于系统选单下的表单可使用复制及粘贴热键,而处于Windows下的表单完全脱离了系统选单的控制,因此复制及粘贴热键失效。 解决的办法是可在表单的控件(本文举例为文本框)中,为KeyPress Event编写如下事件处理程序,该事件处理程序首先将选择内容复制到Windows剪贴板上,然后再将剪贴板上的内容添加到控件中。
KeyPress Event LPARAMETERS nKeyCode, nShiftAltCtrl if nkeycode=3 && CTRL+C 复制 -cliptext=this.seltext endif if nkeycode=22 && CTRL+V 粘贴 do case case this.selstart=0 this.value=-cliptext+this.value case this.selstart〉=1 and this.selstart〈=len(this.value) this.value=subs(this.value,1,this.selstart)+ -cliptext+subs(this.value,this.selstart+1) endcase endif thisform.grid1.column1.setfocus() sele recetem if not eof() skip endif thisform.refresh
文本框,右键功能:怎样能激活文本框的右键的剪切/复制/粘贴功能? 我的表单有几十个文本框,我想让用户编辑时,可以用右键剪切/复制/粘贴,不知是不是通过设文本框的属性实现? 新建PRG文件MyRightClick.PRG: DEFINE CLASS myhandler AS Session PROCEDURE MyRightClick Define POPUP EdtShort SHORTCUT RELATIVE FROM MROW(),MCOL() Define BAR _med_undo OF EdtShort PROMPT "撤消(\<U)" ; MESSAGE "撤消上一次命令或操作" Define BAR 3 OF EdtShort PROMPT "\-" Define BAR _med_cut OF EdtShort PROMPT "剪切(\<T)" ; SKIP FOR _screen.activeform.activecontrol.sellength = 0 or !EMPTY(_screen.activeform.activecontrol.passwordchar) ; MESSAGE "移去选定内容并将其放入剪贴板" Define BAR _med_copy OF EdtShort PROMPT "复制(\<C)" ; SKIP FOR _screen.activeform.activecontrol.sellength = 0 or !EMPTY(_screen.activeform.activecontrol.passwordchar) ; MESSAGE "将选定内容复制到剪贴板上" Define BAR _med_paste OF EdtShort PROMPT "粘贴(\<P)" ; SKIP FOR empty(_cliptext) ; MESSAGE "粘贴剪贴板上的内容" Define BAR _med_clear OF EdtShort PROMPT "删除(\<D)" ; SKIP FOR _screen.activeform.activecontrol.sellength = 0 ; MESSAGE "移去选定内容,并且不将其放到剪贴板上" Define BAR 8 OF EdtShort PROMPT "\-" Define BAR _med_slcta OF EdtShort PROMPT "全选(\<A)" ; MESSAGE "选定当前窗口中的所有文本或数据项" Activate POPUP EdtShort ENDDEFINE 在表单的init: IF Thisform.ControlCount>0 PUBLIC oHandler oHandler=NEWOBJECT("myhandler","prgrightclick.prg") FOR i=1 TO Thisform.ControlCount IF UPPER(Thisform.Controls(i).Class)="TEXTBOX" BINDEVENT(Thisform.Controls(i),"RightClick",oHandler,"MyRightClick") &&动态绑定,用了公用变量传递信息 ENDIF ENDFOR ENDIF
|