分享

表单问题(二)

 忘情天宫 2014-02-21
   表单问题(二)
 

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  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多