简单问题

hurricane 2004-06-13 09:44:27
刚学foxpro, 用的是visual foxpro6.0, 做了个入门实验,就是新建了个项目,新建个表单form,然后将该表单set main, 在visual foxpro里面能够显示, 然后我就build这个项目,得到一个exe文件,不知道怎么回事,在文件夹里面双击该文件,屏幕闪了一下就什么都没有了。晕,先谢过了。
...全文
123 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mason-Ma 2004-06-18
  • 打赏
  • 举报
回复

本文所提“表单窗口属性”,是指那些不但影响表单本身的特征(例如长宽等),而且对表单之外、项目之中的其它“元件”有影响的表单属性,它们包括如下三个:

属性 意 义 可选值(黑体为默认值)
DeskTop 指定表单是否包含在VFP主窗口中 .F./.T.
WindowType 指定表单对象运行时的动作 0-无模式/1-模式
ShowWindow 指定在创建过程中表单窗口显示表单或工具栏 0-在屏幕中/1-在顶层表单中/3-做为顶层表单


下面针对上述表单属性以及VFP中“桌面(DeskTop)、屏幕(Screen)、表单(Form)”等概念谈一谈我的理解。正因为VFP在此方面的设计混乱,也就决定了我不能系统地、有条理地分析这些问题,我做的只能是阐述一些事实。

1.表单是一个对象,外观表现上是一个窗口。VFP的主窗口也可以说是一个“表单”对象,它有一个固定的名字叫“_Screen”,“_Screen”是一个特殊的表单对象;

2.“ShowWindow”是规定表单在“显示方面的从属关系”的属性.
ShowWindow属性实际上仅有两种选择:“作为顶层表单”与“在顶层表单中”。
为了表达方便,我们把具有前者属性值的表单称为“顶层表单”,后者称为“从属表单”。二者在显示方面的不同地位是:顶层表单在Windows任务栏上有一席之地,从属表单却没有这种待遇;顶层表单最小化时,从属表单随之被隐藏,当顶层表单关闭后,从属表单随之关闭。
ShowWindow的第三种选择“在屏幕中(默认)”仅是“在顶层表单中”的一个特例,即为“在_Screen这个特定的顶层表单中”之意,选择此种属性值时,它一定是个“从属表单”了。_Screen具有“顶层表单”的一切显示特征。
从属表单不能独立地被显示,必须与他的“主表单”一起显示,这个“主表单”要么是一个顶层表单要么是VFP的窗口(_Screen)。不需要为一个“从属表单”指定一个“主表单”,“从属表单”打开时,自动选择当前的活动顶层表单作为其“主表单”,当然,如果选择了“在屏幕中”,则这个从属表单自然就以_Screen为其主表单了。

3.“DeskTop”是规定表单在“显示方面的活动范围”的属性。
DeskTop仅对“从属表单”有意义,当从属表单的DeskTop=.f.时,它只能显示在它的“顶层表单”的尺寸之内,当这个顶层表单的尺寸比它的尺寸还小时,它将会被部分地遮住;当从属表单的DeskTop=.t.时,它的活动范围将不受它的顶层表单尺寸的限制,它可以显示在电脑屏幕的任何地方甚至之外。但不管它的位置离其顶层表单多远,一旦顶层表单最小化了,它会立即顺从地从电脑屏幕上消失。

4.“ShowWindows”是规定表单被执行时的程序动作的属性
分两种情况:
(1)当表单的ShowWindow为“在屏幕中”和“在顶层表单中”时:
a.当WindowType="模式"时,执行表单(DO FORM)后使得表单取得焦点,并且一直到它被关闭,在此期间,它的父窗口对象(可能是_Screen或一个顶层表单)的菜单系统及其所属的子表单都不能用。就是说,在表单存在期间,它将一直霸占着焦点.
b.当WindowType="无模式"时,表单存在期间不会霸占焦点。有一个例外,当DeskTop=.t.时,执行它时会使系统菜单失效,而DeskTop=.f.时则不会。

(2)当表单的ShowWindow为“做为顶层表单”时:
表单的WindowType属性不管是有模式还是无模式,都不会霸占焦点。

5.一般情况,用户的应用系统需要一个主表单(主窗口),您可以将_Screen作为这个主窗口,也可以将项目中的某个“顶层表单”做为“主窗口”,很难说那种更好。但在此笔者建议使用VFP主窗口做为用户系统的主窗口,这样可能会省去一些麻烦,因为VFP的很多工具条窗口被设计成只能开在_Screen中,例如在打印预览工具条等。
程序编译成EXE后,前者启动时先显示VFP主窗口,后者直接显示程序员自己设计的顶层表单。对于后者,为屏蔽VFP主窗口,一定要在Config.fpw写入Screen=off(Config.fpw应加入到项目中,这样连编后它将被包含进EXE中,这一来可减少提供安装文件的数量,二来也可避免被用户更改)。
另一方面,很多应用系统程序都喜欢有一个漂亮的或曰自以为漂亮的启动封面,然后再进入主控界面。如果一方面不希望在显示自己的启动封面前有VFP主窗口抢镜头,另一方面又想让VFP主窗口做为程序的主控界面时,解决办法是:设计一个“顶层表单”做为启动封面,config.fpw中仍须写Screen=off,然后在启动封面展示够了自己的魅力之后,用一句_Screen.Show将_Screen打回原形。

6.ShowWoindow与DeskTop属性仅规定了Form在显示方面的特征,而在“对象”这一更加高级的层面上,“顶层表单”与“从属表单”彼此是平级的,而_Screen虽然在显示方面与“顶层表单”具有相同的地位,但在对象层面却是高一级的家伙,所有表单,不管你是“顶层表单”还是“从属表单”,都是它的子对象,这想起来就叫人糊涂,还是赶紧不想的好。

7.“为什么我的程序编译后一闪而过?”
这个问题有两种可能性,第一种是程序执行完成并退出,第二种是程序正在执行,但界面被隐藏。对于第二种情况,可直接按“Ctrl-Alt-Del”键观察到。造成这两种情况的原因如下:
我们先看下面的一段示例程序,假如下面的示例程序是项目的主程序,并且应用项目以VFP主窗口做为自己的主窗口。

*环境设置
Do Form myScreen &&启动封面表单
_Screen.Show &&显示VFP主窗口
Do myMenu.mpr &&安装菜单系统
RETURN

为达到在显示启动封面之前不显示VFP主窗口的目的,在Config.fpw中已写Screen=off,当程序执行到Do Form myScreen这一句时,如果表单myScreen的ShowWindows属性被设为“在屏幕中”,则不管是在开发环境还是在编译环境下,程序都将停下来,表单被显示在_Screen中,而_Screen被隐藏了,因此表单跟着也被隐藏了,所以在屏幕上什么也看不见。这就是第二种情况的产生原因。为了避免这种错误的出现,必须将myScreen表单的ShowWindow的属性设为“做为顶层表单”,这样就可使在_Screen被隐藏的情况下,myScreen仍然可以被显示出来。但请注意,在此情况下,Do Form myScreen这句话执行后,程序并不能停下来,而是顺序地执行下去,一直到执行到RETURN后程序退出,这也就是著名的“一闪而过”现象了。为此必须在程序中包含事件处理命令Read Events使程序停下来,如下:

*环境设置
Do Form myScreen &&启动封面表单
Read Events &&开始事件处理:使启动封面停下来
_Screen.Show &&显示VFP主窗口
Do myMenu.mpr &&安装菜单系统
Read Events &&开始事件处理
RETURN

程序执行Do Form myScreen后,将启动封面显示在屏幕上,然后向下执行到Read Events开始事件处理,此时启动封面表单必须由用户关闭或由表单事件关闭,否则程序将一直停在Read Events这一句上。不管myScreen表单由谁关闭,在关闭代码中必须包含一句Clear Events的停止事件处理命令,以便开始执行Read Events的下一句指令,顺序执行完成_Screen.Show及Do myMenu.mpr后,用户的主界面就建立完成,同理,此处还需要一个事件处理命令让程序再次停下来,开始菜单系统的命令处理,一般情况,菜单系统中将包含的“退出”项,其中有“Clear Events”清除事件处理代码,从而停止第二条“Read Events”事件处理命令,退出整个系统。
xclzteb 2004-06-18
  • 打赏
  • 举报
回复
接上一贴:

THISFORM.text1.VALUE="" &&清空用户名,为下一次输入做准备.

TIMES=TIMES+1 &&户登录次数增加

RETURN 0 &&不改变焦点位置
ENDPROC


PROCEDURE text2.Valid
*check config file and reset corectly install path
IF ALLTRIM(THIS.VALUE)=="" &&用户真接按了回车键
RETURN 1
ENDIF

THIS.VALUE=ALLTRIM(THIS.VALUE)
passwordlength=LEN(THIS.VALUE)
stringbak=""
str1='0'

*囗令还原
FOR i=1 TO passwordlength
str1=SUBSTR(THIS.VALUE,i,1)
IF ASC(str1)>34
str1=CHR(ASC(str1)-i)
ENDIF
stringbak=stringbak+str1
ENDFOR
RELEASE str1


THISFORM.label2.CAPTION=""
THISFORM.REFRESH()

*以下为检查囗令是否合法

IF ALLTRIM(stringbak)==ALLTRIM(PASSWORD) &&囗令正确
THIS.VALUE=""
THISFORM.label2.CAPTION="OK"
&& 正常处理
m=.F.
username=ALLTRIM(NAME)
userkey=ALLTRIM(PASSWORD)
userright=rights
THISFORM.RELEASE()
thisform.loginstatus=.T.
ELSE &&未找到该用户
THISFORM.label2.CAPTION="囗令"+SPACE(2)+ALLTRIM(THIS.VALUE)+SPACE(2)+"错误,请重新输入正确的囗令"
IF TIMES=timelimit &× 为表单初始化时的次数变量,户登录次数是大于3次
secondcount=VAL(SUBSTR(TIME(),7,2))
THISFORM.label2.CAPTION="囗令"+ALLTRIM(THIS.VALUE)+"错误,3秒后自动退出!"
DO WHILE .T. && 检测时间是否大于3秒
THISFORM.label2.CAPTION="囗令"+ALLTRIM(THIS.VALUE)+"错误,3秒后自动退出!"
CAPTION=VAL(SUBSTR(TIME(),7,2))-secondcount
IF CAPTION>=0 .AND. CAPTION<=9
CAPTION=CAPTION+48
ENDIF
caption1=CHR(CAPTION)
THISFORM.CAPTION=SPACE(20)+"计时 "+caption1+" 秒"
IF VAL(SUBSTR(TIME(),7,2))-secondcount>=3 .OR.VAL(SUBSTR(TIME(),7,2))-secondcount<0 &&延时范围0---9秒
THISFORM.RELEASE()
EXIT
ENDIF
THISFORM.REFRESH()
ENDDO
ENDIF
THISFORM.text2.VALUE="" &&清空囗令,为下一次输入做准备.
ENDIF
TIMES=TIMES+1 &&户登录次数增加

RETURN &&不改变焦点位置
ENDPROC


PROCEDURE cmd1.KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
ENDPROC


PROCEDURE cmd1.Click
close all
thisform.release()
ENDPROC


PROCEDURE timer1.Timer
A2=A2+1
if A2=1
thisform.caption="欢"
endif
if A2/2=1
thisform.caption=thisform.caption+"迎"
endif
if A2/3=1
thisform.caption=thisform.caption+"登"
endif
if A2/4=1
thisform.caption=thisform.caption+"录"
endif
if A2/5=1
thisform.caption=thisform.caption+"系"
endif
if A2/6=1
thisform.caption=thisform.caption+"统"
endif
if A2/7=1
thisform.caption=thisform.caption+"!"
endif

if A2/9=1
thisform.caption=""
A2=0
endif
ENDPROC


ENDDEFINE
*
*-- EndDefine: form1
**************************************************
xclzteb 2004-06-18
  • 打赏
  • 举报
回复
发段代码给你,参考一下:

PUBLIC oform1

oform1=NEWOBJECT("form1")
oform1.Show
RETURN


**************************************************
*-- Form: form1 (c:\documents and settings\administrator\桌面\download\jxc\forms\login.scx)
*-- ParentClass: form
*-- BaseClass: form
*-- Time Stamp: 11/14/02 05:15:10 PM
*
DEFINE CLASS form1 AS form


Height = 240
Width = 362
DoCreate = .T.
ShowTips = .T.
BufferMode = 2
AutoCenter = .T.
Picture = "..\picture\back.jpg"
Caption = "用户身份验证"
ControlBox = .T.
Closable = .T.
Icon = "d:\program files\microsoft visual studio\vfp98\tools\transfrm\transfrm.ico"
WindowType = 1
WindowState = 0
Name = "Form1"

*-- If it's value is .T. that showed login success.
loginstatus = .F.


ADD OBJECT text1 AS textbox WITH ;
FontBold = .T., ;
FontSize = 20, ;
Alignment = 3, ;
BackStyle = 1, ;
Height = 39, ;
Left = 90, ;
MaxLength = 255, ;
StatusBarText = "在这里输入正确的用户名", ;
TabIndex = 2, ;
ToolTipText = "在这里输入正确的用户名", ;
Top = 36, ;
Width = 108, ;
ColorSource = 4, ;
IntegralHeight = .T., ;
Name = "Text1"


ADD OBJECT label1 AS label WITH ;
AutoSize = .T., ;
FontBold = .T., ;
FontSize = 14, ;
BackStyle = 0, ;
Caption = "用户名:", ;
Height = 24, ;
Left = 18, ;
Top = 36, ;
Width = 83, ;
TabIndex = 1, ;
ForeColor = RGB(0,0,255), ;
Name = "Label1"


ADD OBJECT label2 AS label WITH ;
AutoSize = .T., ;
FontBold = .F., ;
FontName = "方正魏碑简体", ;
FontSize = 14, ;
WordWrap = .F., ;
BackStyle = 0, ;
Caption = "", ;
Height = 26, ;
Left = 24, ;
Top = 192, ;
Width = 2, ;
TabIndex = 7, ;
ColorScheme = 24, ;
ForeColor = RGB(255,0,0), ;
Name = "Label2"


ADD OBJECT text2 AS textbox WITH ;
FontBold = .T., ;
FontSize = 20, ;
Alignment = 3, ;
BackStyle = 1, ;
Height = 39, ;
Left = 90, ;
MaxLength = 255, ;
StatusBarText = "在这里输入正确的囗令", ;
TabIndex = 4, ;
ToolTipText = "在这里输入正确的囗令", ;
Top = 108, ;
Width = 108, ;
PasswordChar = "*", ;
ColorSource = 4, ;
IntegralHeight = .T., ;
Name = "Text2"


ADD OBJECT label3 AS label WITH ;
AutoSize = .T., ;
FontBold = .T., ;
FontSize = 14, ;
BackStyle = 0, ;
Caption = "口令:", ;
Height = 24, ;
Left = 18, ;
Top = 108, ;
Width = 54, ;
TabIndex = 3, ;
ForeColor = RGB(0,0,255), ;
Name = "Label3"


ADD OBJECT cmd1 AS commandbutton WITH ;
AutoSize = .T., ;
Top = 106, ;
Left = 246, ;
Height = 39, ;
Width = 80, ;
FontName = "隶书", ;
FontSize = 14, ;
Caption = "\<c取消", ;
TabIndex = 6, ;
ForeColor = RGB(0,0,255), ;
Name = "cmd1"


ADD OBJECT timer1 AS timer WITH ;
Top = 204, ;
Left = 72, ;
Height = 23, ;
Width = 23, ;
Interval = 257, ;
Name = "Timer1"


PROCEDURE loginstatus_access
*To do: 为 Access 方法程序修改此例程
RETURN THIS.loginstatus
ENDPROC


PROCEDURE loginstatus_assign
LPARAMETERS vNewVal
*To do: 为 Assign 方法程序修改此例程
THIS.loginstatus = m.vNewVal
ENDPROC


PROCEDURE Activate
ENDPROC


PROCEDURE Destroy
RELEASE location1
RELEASE timelimit
RELEASE TIMES,A2
CLOSE ALL
ENDPROC


PROCEDURE Init
public a2
a2=0
*set default to sys(5)+sys(2003)
PUBLIC location1
PUBLIC TIMES
PUBLIC timelimit
TIMES=1
timelimit=3
*!* CLOSE ALL
*!* OPEN DATABASE USER EXCLUSIVE
*!* USE USER EXCLUSIVE
SELECT USER


THIS.text1.SETFOCUS()
ENDPROC


PROCEDURE Unload
RETURN THIS.loginstatus
ENDPROC


PROCEDURE text1.Valid
*check config file and reset corectly install path


THISFORM.label2.CAPTION=""
THISFORM.REFRESH()
*确定用户

GO TOP
FIND=.F.
DO WHILE .NOT.EOF() && 定位用户
IF .NOT.ALLTRIM(NAME)==ALLTRIM(THIS.VALUE) &&注意这里的VALUE中含有空格符,必须去掉
SKIP 1
ELSE
FIND=.T. &&找到该用户
EXIT
ENDIF
ENDDO


*以下为检查用户是否合法
IF FIND &&找到该用户
TIMES=1 &&初始化囗令计数器
RETURN 1 &&焦点定位到口令输入处
ELSE &&未找到该用户
THISFORM.label2.CAPTION="用户"+SPACE(2)+ALLTRIM(THIS.VALUE)+SPACE(2)+"未注册"+"请重新输入正确的用户名"
IF TIMES=timelimit &× 为表单初始化时的次数变量,户登录次数是大于3次
secondcount=VAL(SUBSTR(TIME(),7,2))
THISFORM.label2.CAPTION="用户"+ALLTRIM(THIS.VALUE)+"非法,3秒后自动退出!"
DO WHILE .T. && 检测时间是否大于3秒
THISFORM.label2.CAPTION="用户"+ALLTRIM(THIS.VALUE)+"非法,3秒后自动退出!"
CAPTION=VAL(SUBSTR(TIME(),7,2))-secondcount
IF CAPTION>=0 .AND. CAPTION<=9
CAPTION=CAPTION+48
ENDIF
caption1=CHR(CAPTION)
THISFORM.CAPTION=SPACE(20)+"计时 "+caption1+" 秒"
IF VAL(SUBSTR(TIME(),7,2))-secondcount>=3 .OR.VAL(SUBSTR(TIME(),7,2))-secondcount<0 &&延时范围0---9秒
THISFORM.RELEASE()
EXIT
ENDIF
THISFORM.REFRESH()
ENDDO
ENDIF
ENDIF
xclzteb 2004-06-18
  • 打赏
  • 举报
回复
那是因为你不熟悉,熟悉了就习惯了。
hurricane 2004-06-15
  • 打赏
  • 举报
回复
在faq里面看到了解决办法,谢谢两位了

我想做个登陆框,然后在用户输入用户名和密码之后通过数据库验证(已经有数据表user),如果用户正确的话打开表单main.form,不知道该怎样实现?感觉foxpro怪怪的,用vc和delphi都很好做的。
YuyuanJian 2004-06-14
  • 打赏
  • 举报
回复
在表单的Init 事件中加入Read events试
hurricane 2004-06-14
  • 打赏
  • 举报
回复
怎么在列表里看不到这个帖子
lbb0 2004-06-14
  • 打赏
  • 举报
回复
把 Form 的windowType属性由默认的0改成1即可。没问题啦

2,722

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧