⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfp 表单问题集.txt

📁 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 + -