标题:请教show方法中的(1或2)的用法及它与visibl属性两者用法的区别?
只看楼主
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
结帖率:79.3%
已结贴  问题点数:20 回复次数:16 
请教show方法中的(1或2)的用法及它与visibl属性两者用法的区别?
现有二个代码,为什么要用show(1),为什么不能用show或show(2)或visibl=.t.,(用它们二个,程序闪一下没有了)
第一个:
form1=createobject("myform")
form1.show(1)      &&&为什么不能用show?  为什么不能用form1.visibl=.t.
define class myform as form
caption="我的表单"
procedure init
this.addobject("mylabel","label")
WITH THIS.MYLABEL

.caption="学生管理系统"
.fontsize=24
.fontname="楷体_GB2312"
.TOP=60
.LEFT=80
.AUTOSIZE=.T.
.VISIBLE=.T.
ENDWITH
ENDPROC
ENDDEF
---------------------------------
第二个
form1=createobject("form")
form1.caption="我的表单"
FORM1.SHOW(1)

form1.addobject("mylabel","label")
with form1.mylabel
.caption="学生管理系统"
.fontsize=24
.fontname="楷体_GB2312"
.TOP=60
.LEFT=80
.AUTOSIZE=.T.
.VISIBLE=.T.
ENDWITH
FORM1.SHOW(1)&&&这个放到上面去(用兰色标识)为什么不行?为什么不能用form1.visibl=.t.?
搜索更多相关主题的帖子: procedure 管理系统 label class 
2011-10-05 14:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:20 
这与Windows系统中表单(Form)的运行模式有关,它事实上就是API中CreateWindow()函数建立的窗口。我们知道Windows是事件触发式的,建立窗口,如果它没有应答事件的机能,那么它就应该把CPU交还,让其它程序使用。我们所建立的窗口,必须用一种方式告诉Windows,我有应答机制,操作系统可以抢去它的CPU时间,但应该适当时候还我一点,以便我处理事务。这种应答机制,在任何Windows窗口中都是死循环,这个循环始终在等待事件,如果没有建立这个死循环,窗口就会一闪即逝,因为它执行完建立、绘画内容之后,就做完所有事情了,程序于是结束,这就是原因。

在VFP中,用READ EVENTS命令启动事务处理,就是从这条指令开始,窗体处于死循环,除非CLEAR EVENTS,否则在READ EVENTS后面的程序代码,都不会执行。因此,在你第二个程序中,蓝色那行如果与上面一行交换,则Caption=的语句就只能在关闭form1之后才能执行,而此时form1已经不存在了(出错)。

窗口的应答机制有几种方式。前面所说的是最普通的Windows窗口,它在运行时,用户可以暂时离开它,去处理别的窗口的事务,但有另外一种窗口,是不允许用户离开的,除非用户关闭这个窗口,这种窗口叫“模式表单”,则前面那种就叫“非模式窗口”。Windows的MessageBox、GetFile()之类,就是这样的窗口,VFP同样支持(其实MESSAGEBOX()使用的就是Windows的MessageBox(),GETFILE()、GETDIR()也是),也允许程序员设计这样的窗体,这种窗体用属性WindowType=1表示。有时,程序员在写程序时,没有在类定义代码中明确WindowType,此时它默认是0,即非模式表单,但在运行时,程序员临时决定它要成为模式表单(常见同样的窗体代码用于多种场合显示不同内容),那么可以通过向Show()方法传入参数1,即Show(1),设定当前的对象实体用模式表单处理(参数1实际上是Show()方法代码中赋给WindowType属性了)。这样Show(1)出来的表单,因为不允许用户离开,事实上呈现为死循环,表现与READ EVENTS一样,但无需CLEAR EVENTS。这种用法,在你已经使用过READ EVENTS之后,在主窗体之外再启动新窗体时,特别有用。

Show()方法有两个动作:第一是替你设置Visible=.T.,因此你不用自己写Visible=.T.(但如果你显式写了Visible=.F.,那么Show()不会改你的,则窗体将Show不出来);第二,是把这个Show动作的Form设为激活的,此时将会在执行完Show()方法中的代码之后触发Activate()事件,执行那里的代码,这是Visible=.T.不会做的事情。

授人以渔,不授人以鱼。
2011-10-05 15:33
muyubo
Rank: 9Rank: 9Rank: 9
来 自:山东莱芜
等 级:蜘蛛侠
威 望:3
帖 子:471
专家分:1017
注 册:2011-3-6
得分:0 
深刻领会,学习中.
2011-10-05 16:19
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
讲的深了一点,慢慢体会。下面的例子我完全照抄书中的。现有二个问题,
1.加了public myform 后,把myform.show(1)改为myform.visible=.t.后表单能出现,不会一闪而过。
2为什么表单的左上角不出现“使用 add object 向类中添加对象示例”,而出来的是另一个命令2的标题(command2)
public myform   &&原来书中的代码,如果不要这个公共变量,myform.show(1) 改为myform.visible=.t.,表单不能显示。
myform=createobject("form1")
myform.visible=.t.  &&这是原来书中的代码 ,加了public myform,表单显示。
*myform.show(1)    &&本人另加的,因开始时省略了public myform ,表单一闪而过,把myform.visible=.t.改为show(1)表单显示了。
define class form1 as form
  caption="使用 add object 向类中添加对象示例"&&&表单左上角不出来,而出来的是"command2"???

  add object command1 as commandbutton with;
  top=30
  left=10
  height=30
  width=90
  caption="command1"
 add OBJECT command2 as commandbutton with;
 top=60
 left=200
 height=30
 width=90
caption="command2"
proc command1.click

endproc
proc command2.click
messagebox("hi,您好!")
endproc
enddefine
enddefi

2011-10-05 16:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
用Visible=.T.也一样是一闪即逝,你用VFP6我就不知道了,反正我这里VFP9 SP2是这样,原理也是这样。

你类定义中的代码,对窗体的Caption设置了两次,以最后一次生效。蓝色那句,在这个位置是对窗体的,不是对内部控件的,在位置上,与前面那句是同一个级别,挪动一下就看出来。

授人以渔,不授人以鱼。
2011-10-05 16:43
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
我用vfp6与VFP9 SP2都试了,加了public myform 后用Visible=.T.表单能出来。
所有代码与书上一模一样的,在定义类中用ADD OBJECT 添加二个命令按钮,分加为二个命令按钮命名。我又重新对了一谝,应该没有错吧?是不是添加的对象各种属性之间没有加逗号有关乎?
2011-10-05 17:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
在我这里是闪一下。不要用这种方法,不保证它能应付各种配置的机器。你一定抄漏了东西,那两个CommandButton的ADD OBJECT命令,很明显你就漏了逗号和分号,书上不可能这样。因此,我怀疑你实际上漏了一句WindowType=1。

授人以渔,不授人以鱼。
2011-10-05 17:11
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
没有显示表单左上角的原因找出来了。是对象中各属性之间要加上逗号若竖的书写还要加分号,不同于属性批量设置with ...endwith,竖的写不要加逗号与分号。
top=30,;
  left=10,;
  height=30,;
  width=90,;
  caption="command1"
2011-10-05 17:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
对,你还敢说跟书上一模一样?

授人以渔,不授人以鱼。
2011-10-05 17:20
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
知道了!但内容来自于张洪举<visualfoxpro权威指南>第215页中 2.为类中的对象编写方法和事件没有WindowType=1。
他不少例子都是public omyform ....,omyform.visible=.t.,但有时也用myform.show 而还没有(1或2)都是默认值,非模式表单。
2011-10-05 17:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-351624-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.362710 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved