📄 vfp 表单问题集.txt
字号:
VFP 表单问题集
如何添加一个属性或者方法到表单
怎么从一张表单返回一个值?
怎么传一个参数给表单?
Modal窗口和Modeless窗口有什么区别?
为什么表单没有任何控件,出现一片空白?
删除或者修改看不见的控件?
表单启动后,它是按那一种顺序执行事件的?
如何把表单的标题栏移掉
按下ESC键时,怎样才能够让表单退出?
在表单中引用另一个表单集外表单的控件?
如何制作一个表单模板?
如何辨别是否按下Shift、Alt、Ctrl 键?
如何辨别鼠标按下那一个键?
表单和表单类到底那一种好用?
当表单运行时,我怎样才能在控件出错时把表单保留下来?
如何把一个表单或者一个类打印出来?
为什么表单启动后看不到任何控件?
计时控件什么时候会停止计时?
我怎样建立一个带菜单的顶层表单?
为什么我把表单从VFP3.0转到VFP5.0后,字体会变小而且没有斜黑体?
应该怎样替换掉表单左上角的狐狸图标?
我怎样才能在表单上精确地移动控件?
我可以把一个数组作为参数传给表单吗?
如何建立适用于不同解析度下的表单?
<一>:在设计期间,我该如何添加一个属性或者方法到表单
答:打开要修改的表单,或者增加一个新表单,选择菜单栏上的Form菜单中的New Property 弹出增加属性对话框
在Name 处填入属性名
在Description 处填入属性的说明。
填好后按下 OK按钮,即可添加一个新属性
选择菜单栏上的Form菜单中的New Mothed 弹出增加方法的对话框,增加方式跟增加属性一样。
<二>:我怎么从一张表单返回一个值?
答:要从表单返回一个值,必须把表单的Windowtype属性设置为"1 - Modal"类型,然后在表单的UNLOAD事件写入"RETURN 要返回的值",使用公式:Do Form Formname With 参数 To 变量
<三>:我怎么传一个参数给表单?
答: 在表单的Init事件的第一行加入 Parameter 参数
在do Form 时 用 do Form formname With 参数
<四>:Modal窗口和Modeless窗口有什么区别?
答: Modeless 窗口可以在窗口运行后,但是并没有退出窗口时,仍然运行DO Form 后的代码。
Modal 窗口必须在退出窗口后,才能继续运行DO Form 后的代码。
<五>:我用表单精灵生成一个表单,运行后为什么表单没有任何控件,出现一片空白?
答:这是用表单精灵自动生成表单时,出现错误后的一般结果,因为它把表单的 LOCKSCREEN 属性改为.T., 您只要把LOCKSCREEN 属性改为.F.,就可以解决这个问题。
<六>:我怎样才能删除或者修改看不见的控件?
答: 打开属性对话框, 在对话框的顶端有一个下拉列举框,您可以用它来选择您要编辑或者删除的控件,它有两行排列,第一行排列容器控件,第二行排列在 容器里面的控件,例如:
Form
Container1
TextBox1
TextBox2
Container2
TextBox1
TextBox2
如果您想删除这个控件,按一下设计表单的标题栏,不要按其它地方,设计表单的标题栏变为高亮,然后按下Delete键,就可以删除控件。
<七>:如何把表单的标题栏移掉
答:其实,这很容易制作。只要您把表单的下面几个属性
Closable ,ControlBox , Minbutton , Maxbutton , Movable
设为 False,再把Caption设为空(caption=""),就可以达到要求。
<八>:表单启动后,它是按那一种顺序执行事件的?
答:跟着下来的是表单启动后的事件执行顺序
DataEnvironment.BeforeOpenTables()
Form.Load()
DataEnvironment.Init()
Form.Container1.Contol1.Init()
Form.Container1.Control2.Init()
Form.Container1.Init()
.
.
Form.Controln.Init()
Form.Init()
Form.Show()
Form.Activate()
Form.GotFocus()
Form.Container1.GotFocus()
Form.Control1.GotFocus()
<九>:当我按下ESC键时,怎样才能够让表单退出?
答: 最好的方法是在命令按钮设定“Cancel"属性。
也可以在 Click() 事件放置 表单的'Release()' 方法。
下面的程序例子说明如何辨别是否按下"ESC"按键:
PROCEDURE KeyPress &&表单的keypress事件
LPARAMETERS nKeyCode, nShiftAltCtrl
IF nKeyCode = 27
RELEASE ThisForm
ENDIF
ENDPROC
<十>:我怎样才能够在表单中引用另一个表单集外表单的控件?
答:您可以用_SCREEN的一个采集各个表单的数组,然后用循环去找出您要用的表单 。
FOR I = 1 TO _SCREEN.FormCount
IF TYPE("_SCREEN.Forms[I]") = "O" ;
AND !ISNULL(_SCREEN.Forms[I]) ;
AND _SCREEN.Forms[I].Class = 'myclass'
_SCREEN.Forms[I].Refresh()
ENDIF
ENDFOR
下面的例子表明如何采集一个表单集里的表单
IF TYPE("_SCREEN.Forms[I].Parent") = "O"
IF TYPE("_SCREEN.Forms[I].Parent.MyForm") = "O"
_SCREEN.Forms[I].Parent.MyForm.Refresh()
ENDIF
ENDIF
<十一>:如何制作一个表单模板?
答:首先建立一个您喜欢的通用表单并存盘,然后打开VFP Tools菜单中的Option...
选择 FORMS 书签,
选择 Template Classes里面的Form前面的检查框,将跳出
文件对话框,选择您刚存盘的通用表单。按下OK
按一下set as default ,再按下OK 。
表单模板已经建立完成
<十二>:如何辨别是否按下Shift、Alt、Ctrl 键?
答:在表单的KeyPress事件,有一个参数nShiftAltCtrl
它可以让您辨别是否按下Shift、Alt、Ctrl等按键。
当按下Shift 键 ShiftAltCtrl=1
当按下Ctr l 键 ShiftAltCtrl=2
当按下Alt 键 ShiftAltCtrl=4
<十三>:如何辨别鼠标按下那一个键?
答:在MOUSEDOWN事件中有一个nButton的参数,由这个参数可以判断是按下那一个鼠标键,如果nButton等于1,表明按下鼠标左键,如果nButton等于2,表明按下鼠标右键,nButton等于4,表明按下鼠标的中间键。
<十四>:表单和表单类到底那一种好用?
答:下面列举了表单和类的优缺点
.VCX的基本表单类
优点:
容易跟其它表单或者表单类进行通讯
一个.VCX/.VCT 文件可以有多个表单。
支持保护类型的属性和方法。
在运行期间可以加一个用户定义的数据环境
缺点:
不能用自己的数据环境
测试比较困难
没有简单、直接的方法从一个 modal表单返回一个值
.SCX的表单
优点:
可以用自己的数据环境
测试简单
可以简单、直接地从一个 modal表单返回一个值
运行期间可以用用户定义的数据环境
缺点:
跟其它表单或者表单类进行通讯比较困难。
一个SCX/.SCT 文件只能有一个表单 。
不支持保护类型的属性和方法。
其实,两种表单是互补优缺点,可以根据您的需要再来选择类型,不过我这里有一种中折的方法,您可以用.SCX的方法来开发测试表单,然后把它存为类表单。
<十五>:当表单运行时,我怎样才能在控件出错时把表单保留下来?
答: 你可以从表单的INIT()事件或者表单上任何控件的INIT()事件返回.F. 来中断表单的运行。
VFP有一个BUG,就是当您的控件出错时,控件的INIT()返回 .F.,他的父控件(parent)INIT()也会返回.F.。比如:一个表单上的textbox无法初始化,它返回.F.,那表单也跟着返回.F.,导致表单无法充分完成而退出表单。
<十六>:如何把一个表单或者一个类打印出来?
答:1:首先,您必须打开VFP专业版的类浏览器, 在类浏览器可以直接打印。
2:如果您用的不是专业版或者没有类浏览器,您可以用下面的程序去建立类的编码。
*PRINTSCX.PRG
LPARAMETER cForm, cOutFile
LOCAL nOldMemoWidth, aStruct[1], nCount, aSCX[1]
nOldMemoWidth = SET("MEMOWIDTH")
SET MEMOWIDTH TO 256
IF TYPE("cForm") # "C"
cForm = GETFILE("SCX", "Select Form File to List")
IF cForm = "Untitled"
RETURN
ENDIF
ENDIF
USE (cForm) IN 0 ALIAS SCXFile
IF TYPE("cOutFile") # "C"
cOutFile = "OUTPUT.TXT"
ENDIF
SET CONSOLE OFF
SET PRINTER TO (cOutFile)
SET PRINTER ON
SELECT SCXFile
nCount = AFIELDS( aStruct )
SCAN
SCATTER TO aSCX MEMO
? REPLICATE( "-", 72 )
? "Record " + LTRIM( STR( RECNO() ) )
? REPLICATE( "-", 72 )
FOR I = 1 TO nCount
IF NOT EMPTY( aSCX[ I ] )
? aStruct[ I, 1 ] + ": "
?? aSCX[ I ]
ENDIF
ENDFOR
ENDSCAN
SET PRINTER OFF
SET PRINTER TO
SET CONSOLE ON
SET MEMOWIDTH TO nOldMemoWidth
USE IN SCXFile
*EOF.
<十七>:为什么表单启动后看不到任何控件?
答:有可能是表单的LockScreen 属性设定为.T.
试着把它改为 .F. 。
<十八>:计时控件什么时候会停止计时?
答:计时控件将会在下列的几种情况下停止计时:
1:打开一个菜单时
2:显示一个对话信息框时
3:当用户改变窗口尺寸时
4:当用户拖拉控件时
5:当用户正在使用滚动条时
<十九>:我怎样建立一个带菜单的顶层表单?
答:首先把表单的SHOWINDOWS 特性设定为 2 -- 顶层表单。
接下来,打开菜单设计器, 从[显示]菜单中选择[常规选项],然后设定顶层表单属性为Enabled。
最后在表单的INIT事件中放置 DO (MENU NAME。MPR ) WITH THIS 语句,把顶层菜单放置到顶层表单上。
<二十>:为什么我把表单从VFP3.0转到VFP5.0后,字体会变小而且没有斜黑体?
答:为了让您更容易地完成Windows 95 版本的表单,各个控件属性的默认值将可以被改变,包括字体、是否黑体以及颜色属性。如果在Visuval Foxpro 3.0设定了控件的值为默认值,在Visuval Foxpro 5.0中将保持他们为默认值,然而,因为Visuval Foxpro 3.0和Visuval Foxpro 5.0的默认值不同,所以文本将会显示不同。
<二十一>:应该怎样替换掉表单左上角的狐狸图标?
答:在表单的Load 事件中加入下行命令
ThisForm.ICON="您自己的图标(*.ico 文件)"
也可以在设计时,利用PEM来改变表单的ICON的文件。
<二十二>:我怎样才能在表单上精确地移动控件?
答:您可以用上、下、左、右键来移动控件,移动一次控件将会移动一个象素。
<二十四>:我可以把一个数组作为参数传给表单吗?
答:就像普通的参数一样,不过一定得是 Refrence 参数传送方式,VFP默认的参数传送方式是 Refrence,当您调用表单时用DO........With。
Dimension array[10]
DO Form Form1 With Array
您在表单类中也可以使用数组参数,一样要用Refrence 参数传送方式。
Dimension array[10]
MyForm=CreateObject("FORM1",@Array)
<二十五>:如何建立适用于不同解析度下的表单?
答:一般开发的表单都是适应一种解析度,如果用户的解析度不同将造成表单被截掉或着太小。
下面的程序可以让表单自己适应不同解析度。
1:首先建立一个640*480的表单。
2:将下面的程序代码加入表单及容器的init方法中。
Local OldHeight ,OldWidth,ChangeHeight,ChangeWidth
OldHeight=640
OldWidth=480
ChangeHeight=0 &&新解析度与640*480解析度的高度差
ChangeWidth=0 &&新解析度与640*480解析度的宽度差
*Sysmetric(1) &&取得目前解析度的高度
*Sysmetric(2) &&取得目前解析度的宽度
IF Sysmetric(1) #OldHeight
Thisform.Lockscreen=.T.
ChangeHeigh=Sysmetric(1)/OldHeight
ChangeWidth=Sysmetric(2)/OldWidth
*变更表单外框
IF This.BaseClass='FORM'
With This
.Height=.Height*ChangeHeight
.Width=.Width*ChangeWidth
.Top =.Top*ChangeHeight
.Left =.Left*ChangeWidth
End With
ENDIF
*变更每一个控件的大小
FOR I=1 To This.ControlCount
With This.Controls(I)
.Height=.Height*ChangeHeight
.Width=.Width*ChangeWidth
.Top =.Top*ChangeHeight
.Left =.Left*ChangeWidth
End With
ENDFOR
Thisform.Lockscreen=.T.
ENDIF
ThisForm.Refresh
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -