| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4127 人关注过本帖, 3 人收藏
标题:一个表单中的控件关闭另一个表单
只看楼主 加入收藏
yttv8
Rank: 1
等 级:新手上路
帖 子:32
专家分:4
注 册:2011-11-25
收藏
得分:0 
以下是引用TonyDeng在2012-2-18 13:09:11的发言:

.scx寫成的表單,其實是一個類,DO FORM 表單1.scx這個語句,意思是用文件“表單1.scx”生成一個表單實例“表單1”(DO FORM命令其實有一個參數是NAME,是給形成的實例起名的,如果忽略,則實例的變量名就等於文件名)。用同一個.scx文件,是可以生成多個同樣的表單實例的。

由於實例其實是一個內存變量,按你的語法,你在內存中有兩個表單,其變量名分別是“表單1”和“表單2”,把變量直接釋放了,就可以把實例釋放掉。表單2.release是使用表單2實例的方法,它掛在自己身上,只能用自己的方法調用,不能由別人調用。你不妨換個寫法,用release 表單2,這是直接釋放內存變量,試試看。

“用同一個.scx文件,是可以生成多個同樣的表單實例的”
是说通过name 不同的名称来实现么?
“你不妨換個寫法,用release 表單2,這是直接釋放內存變量,試試看。”
试了下release 表单2,还是不行。
而且我把表单1中的thisform.release换成了release 表单1,也不能退出了。

另外,请帮忙解答一下.scx和form的关系或区别,以及一个.scx中可以有多个form么?
2012-02-18 13:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
就是用NAME命名變量,下面兩條指令用同一個.scx類生成兩個表單窗體,它們的內容是完全一樣的,但是兩個不同的窗體。

DO FORM 表單1.scx NAME form1
DO FORM 表單1.scx NAME form2

你可以在代碼通過修改form1.top的值來看看,form1窗體改變了位置但form2不會變,可見它們互不干擾。

我不知道你的.scx設計中有沒有使用了WindowType=1之類的東西,跟ShowWindow屬性的設置也有點關係,甚至裏面有沒有read events,這些都無法知道,它們可能影響你不能關閉別的表單。通常的做法,是在.prg指令序列中啟動窗體和關閉的,而不是在表單代碼中啟動和關閉窗體的。我沒有測試過你的那種關閉法,或者別人有這方面的實踐,看人家怎麼說吧。

我寫程序,只有.prg,沒有寫.scx的,窗體和控件都在.prg中寫,所以真的不熟悉那種情況。以前剛接觸VFP的時候,也嘗試過那樣寫程序,但很快就放棄了,我覺得那不是好方法,無法讓我為所欲為。


[ 本帖最后由 TonyDeng 于 2012-2-18 14:25 编辑 ]

授人以渔,不授人以鱼。
2012-02-18 13:57
yttv8
Rank: 1
等 级:新手上路
帖 子:32
专家分:4
注 册:2011-11-25
收藏
得分:0 
回复 12楼 TonyDeng
多谢。我是在主程序prg中用了read event。。。
由于你没用过.scx,所以它和form的区别,没能给出确切答案。我只是猜测,一个scx对应一个form两者就是一个东西。
全部用代码生成窗体和控件,我不会。
我只能用最简单的方法,拖拽生成控件,进入方法或事件来写代码。。。

另外,期待更多前辈指点迷津,我猜测的对不对?

[ 本帖最后由 yttv8 于 2012-2-18 14:26 编辑 ]
2012-02-18 14:16
yttv8
Rank: 1
等 级:新手上路
帖 子:32
专家分:4
注 册:2011-11-25
收藏
得分:0 
回复 12楼 TonyDeng
忽然又发现一个问题,修改窗体form1的top值是thisform.top=100,而用它的名称form1.top=100不行
那form的name属性有个啥用?
开始我还以为 do form 表单1.scx   默认会使用name属性的值作为实例名
但是看你的解释,是以“表单1”作为实例名了。
2012-02-18 14:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你運行看看

程序代码:
Form1 = CREATEOBJECT("my_Form")
Form1.Show
READ EVENTS
RETURN 

DEFINE CLASS my_Form AS Form
    ControlBox = .F.
    Width = 600
    Height = 400
    AutoCenter = .T.
   
    ADD OBJECT Command1 AS CommandButton WITH Caption = "開啟新窗口", Width = 100, Height = 25
    ADD OBJECT Command2 AS CommandButton WITH Caption = "關閉新窗口", Width = 100, Height = 25, Enabled = .F.
    ADD OBJECT Command3 AS CommandButton WITH Caption = "關閉本窗口", Width = 100, Height = 25
   
    PROCEDURE Activate
        WITH Top = ThisForm.Height - .Height - 5
            .Left = 10
        ENDWITH
        WITH Top = Top
            .Left = Left + WITH Top = Top
            .Left = Left +  ENDPROC
   
    PROCEDURE Command1.Click
        IF VARTYPE(Form2) != "O"
            PUBLIC Form2
            Form2 = CREATEOBJECT("Form")
            WITH Form2
                .Caption = "新窗口"
                .ControlBox = .F.
                .Top = 100
                .Left = 50
                .Show
            ENDWITH
            WITH ThisForm
                .Command2.Enabled = .T.
                .Command3.Enabled = .F.
            ENDWITH
        ENDIF
    ENDPROC
   
    PROCEDURE Command2.Click
        RELEASE Form2
         = .T.
    ENDPROC
   
    PROCEDURE Command3.Click
        RELEASE ThisForm
        CLEAR EVENTS
    ENDPROC
   
ENDDEFINE

授人以渔,不授人以鱼。
2012-02-18 15:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
換成這樣再比較一下

程序代码:
Form1 = CREATEOBJECT("my_Form")
Form1.Show
READ EVENTS
RETURN 

DEFINE CLASS my_Form AS Form
    ControlBox = .F.
    Width = 600
    Height = 400
    AutoCenter = .T.
   
    ADD OBJECT Command1 AS CommandButton WITH Caption = "開啟新窗口", Width = 100, Height = 25
    ADD OBJECT Command2 AS CommandButton WITH Caption = "關閉新窗口", Width = 100, Height = 25, Enabled = .F.
    ADD OBJECT Command3 AS CommandButton WITH Caption = "關閉本窗口", Width = 100, Height = 25
   
    PROCEDURE Activate
        WITH Top = ThisForm.Height - .Height - 5
            .Left = 10
        ENDWITH
        WITH Top = Top
            .Left = Left + WITH Top = Top
            .Left = Left +  ENDPROC
   
    PROCEDURE Command1.Click
        IF VARTYPE(Form2) != "O"
            PUBLIC Form2
            Form2 = CREATEOBJECT("my_NewForm")
            WITH Form2
                .Caption = "新窗口"
                .ControlBox = .F.
                .Show
            ENDWITH
            WITH ThisForm
                .Command2.Enabled = .T.
                .Command3.Enabled = .F.
            ENDWITH
        ENDIF
    ENDPROC
   
    PROCEDURE Command2.Click
        RELEASE Form2
         = .T.
    ENDPROC
   
    PROCEDURE Command3.Click
        RELEASE ThisForm
        CLEAR EVENTS
    ENDPROC
   
ENDDEFINE 

DEFINE CLASS my_NewForm AS Form
    Width = 300
    Height = 200
    Top = 100
    Left = 50
   
    nSeconds = 0
   
    ADD OBJECT lblTime AS Label WITH Caption = "", FontSize = 20, Alignment = 2, Width = 300, Height = 50, Top = 10, Left = 0
    ADD OBJECT tmrTimer AS Timer WITH InterVal = 1000
   
    PROCEDURE lblTime.Refresh
        LOCAL lnMinute, lnSecond
       
        lnSecond = MOD(ThisForm.nSeconds, 60)
        lnMinute = INT(ThisForm.nSeconds / 60)
        This.Caption = PADL(lnMinute, 2, '0') + ":" + PADL(lnSecond, 2, '0')
       
    ENDPROC
   
    PROCEDURE tmrTimer.Timer
        WITH ThisForm
            .nSeconds = .nSeconds + 1
            .lblTime.Refresh
        ENDWITH
    ENDPROC
   
ENDDEFINE

授人以渔,不授人以鱼。
2012-02-18 15:18
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:0 
回复 16楼 TonyDeng
版主果然厉害

用WIN8啦?我才从WIN7降到XP
2012-02-18 16:08
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2214
专家分:3882
注 册:2007-4-27
收藏
得分:0 
在我还不会用菜单的时候,我也是在一个窗口上用一个按钮去运行另一个表单的。返回都是另一个表单关后再回到开始的表单上的。

在表单1上运行 do form 表单2后,表单2就成了活动窗口。应该是不可以再在表单1上进行关闭表单2的操作的。理由:表单1是个大的房间,而表单2是大房间里面的一个套间,你在大房间里打开了小房间的门并进到里面了,人不退出来,外面是无法关的。要不然就是一个事故了,你自己回不了家呀

我不知道准确与否,但我是这样来理解的

[ 本帖最后由 wengjl 于 2012-2-18 16:15 编辑 ]

只求每天有一丁点儿的进步就可以了
2012-02-18 16:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 17楼 软件服务
在期待Win8免費版的推出呢

授人以渔,不授人以鱼。
2012-02-18 16:26
wzxc
Rank: 9Rank: 9Rank: 9
来 自:齐鲁大地
等 级:贵宾
威 望:39
帖 子:985
专家分:1296
注 册:2006-4-25
收藏
得分:3 
formtest.rar (2.71 KB)

关于楼主的问题,我写了两个简单的表单文件,你可以下载来运行看看。注意他们的文件名,name属性,caption属性的运用。

认真看书学习,弄通Fox主义。
2012-02-18 16:32
快速回复:一个表单中的控件关闭另一个表单
数据加载中...
 
   



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

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