| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1449 人关注过本帖
标题:求教TonyDeng :通过方法来调用修改已保护的属性值,不懂。盼等!
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
原来的? GetCaption(),我这里改用Label显示,以免窗口一闪即逝。现在可以看到标题文字的变化过程。功能跟原来是完全一样的。

授人以渔,不授人以鱼。
2011-09-29 13:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
原先你那个代码,是在_SCREEN上显示前后两次Caption的值,一次是原先的,一次是被改变的,这个输出无非是告诉你这样操作成功了,与改变没有关系。真正改变Caption的动作,是调用ChangeCaption()那里,Caption值一变,窗体的文字马上变,不用再有什么操作的(等效于没有保护时直接对Caption赋值)。

授人以渔,不授人以鱼。
2011-09-29 13:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
再看看这个:

程序代码:
myForm1 = CREATEOBJECT("myForm")
WITH myForm1
    .Top = 50
    .Left = 50
    .Show
    WAIT WINDOW
    .SetCaption("")
    .Label1.Caption = "标题已置空"
ENDWITH
READ EVENTS
RETURN 

DEFINE CLASS myForm AS Form
   
    PROTECTED Caption
    Caption = "被保护的窗口标题"
   
    ADD OBJECT Label1 AS Label WITH Caption = "", Top = 10, Left = 10, AutoSize = .T.
   
    FUNCTION GetCaption() AS Character
        RETURN This.Caption
    ENDFUNC
   
    PROCEDURE SetCaption(tcCaption AS Character)
        This.Caption = tcCaption
    ENDPROC
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
ENDDEFINE

授人以渔,不授人以鱼。
2011-09-29 14:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
CLEAR
myForm1 = CREATEOBJECT("myForm")
myForm1.Show
? myForm1.GetCaption()
WAIT
myForm1.SetCaption("我的窗口")
? myForm1.GetCaption()
WAIT
RETURN

DEFINE CLASS myForm AS Form
   
    PROTECTED Caption
    Caption = "被保护的窗口标题"
   
    FUNCTION GetCaption() AS Character
        RETURN This.Caption
    ENDFUNC
   
    PROCEDURE SetCaption(tcCaption AS Character)
        This.Caption = tcCaption
    ENDPROC
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
ENDDEFINE

[ 本帖最后由 TonyDeng 于 2011-9-29 14:11 编辑 ]

授人以渔,不授人以鱼。
2011-09-29 14:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把14楼的两个?语句删掉,也不会影响实际的变化,你试试。

授人以渔,不授人以鱼。
2011-09-29 14:14
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
TonyDeng:
改为9.0还不行,后把代码改成你指的行了。
有点难为情了。实才无能,特别对自定义方法及参数传递是一个圪。有2个疑问请教一下。

1).Label1.Caption = myForm1.GetCaption()   &&表示何意?
   .SetCaption("关闭本窗体则前一个窗体的标题将置空")  &&这是什么?是自定义方法吗?如果所有SetCaption(....)改为caption(...)或其它名,为什么会找不到方法或事件?

2)二个过程:对各种参数如何从什么地方传递又从什么地方返回
2011-09-29 16:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1)

这是从myForm2窗体中读取myForm1窗体的Caption属性,用意是向你示范这个GetCaption()方法在任何地方都是可以用的。须知Caption属性已被保护,无法直接读取myForm1.Caption的值,但用myForm1.GetCaption()方法却可以,纵然身在myForm2中,也仍然可以读到myForm1被保护起来的属性。正如你看到的,在运行时,myForm1.Caption的值被显示在myForm2的Label控件中,而代码也表明确实是从myForm2中读这个值的(没有使用技巧从myForm1向myForm2写数据)。

下面一行,刻意将myForm2的Caption设置成与myForm1的Caption不同,表明这是两个独立的窗体——但是从同一个类定义中生成!这是示范一个类生成多个对象实体的例子,有助于区分“类”与“对象”。而且,写这么句话,是提示你关闭这个窗体将会看到什么现象,不至于不知道下面该干什么。

2)

自定义方法与普通函数或过程是完全一样的。参数从调用处传入,返回调用处。比如myForm2.Label1.Caption = myForm1.GetCaption(),调用处就是这一行,执行(右边)myForm1对象的GetCaption()方法,把返回结果赋给(左边)myForm2的Label1.Caption中。注意:运行的是myForm1对象中的GetCaption()方法,而不是myForm2对象中的GetCaption()方法,虽然GetCaption()方法是类定义中的同一个代码,但在理论上,每个对象实体拥有各自独立的GetCaption()方法,彼此互不干涉。执行myForm1.SetCaption(),就改myForm1的Caption(方法代码很明确地写This.Caption = ,表明对自己所在的对象操作),不会影响myForm2的Caption,反之亦然。

我刻意写第一次那样的东西,是要向你证明,这是同一个类定义下两个对象实体有各自独立的行为,除了在类定义中写在共同拥有的东西之外,所有在外面各自改变的东西,分属各自,不会互相影响。每个对象是按照类创造出来的,前者是实体,后者是设计蓝图,虚的,同一张设计图可以生产无数个实体。

[ 本帖最后由 TonyDeng 于 2011-9-29 16:47 编辑 ]

授人以渔,不授人以鱼。
2011-09-29 16:35
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
多谢了,有点头绪。再仔细拜.SetCaption("。。。")  表示什么?帮助中找不到?是自定的还是系统规定的。如果所有SetCaption(....)改为bcaption(...)或其它名,运行时:为什么会找不到方法或事件?

2011-09-29 17:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那是自定义的方法呀,代码中写着的,乱改名字当然没有,你写那是什么名字就什么名字,不限,比如你1楼的代码写ChangeCaption,我改成SetCaption,同一个东西。要明白,这是自己写的类,它有什么性能和属性,你说了算。

[ 本帖最后由 TonyDeng 于 2011-9-29 17:20 编辑 ]

授人以渔,不授人以鱼。
2011-09-29 17:19
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
myForm2 = CREATEOBJECT("myForm")
WITH myForm2
    .Top = 100
    .Left = 100
    .Label1.Caption = myForm1.GetCaption()
    .SetCaption("关闭本窗体则前一个窗体的标题将置空")
    .Show(1)
ENDWITH
WITH myForm1
    .SetCaption("")
    .Label1.Caption = "标题已置空"
ENDWITH
READ EVENTS
RETURN

DEFINE CLASS myForm AS Form
   
    PROTECTED Caption
    Caption = "被保护的窗口标题"
   
    ADD OBJECT Label1 AS Label WITH Caption = "", Top = 10, Left = 10, AutoSize = .T.
   
    FUNCTION GetCaption() AS Character
        RETURN This.Caption
    ENDFUNC
   
    PROCEDURE SetCaption(tcCaption AS Character)
        This.Caption = tcCaption
    ENDPROC
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
这样理介是否正确?红色的 .SetCaption("关闭本窗体则前一个窗体的标题将置空")与 .SetCaption("")是向自定义方法PROCEDURE SetCaption(tcCaption AS Character)传递参数是不是?
我知道属性可以批量设置,.SetCaption("关闭本窗体则前一个窗体的标题将置空")与 .SetCaption("")哪是什么东西?是属性还是??,书中找不到setcaption()

2011-09-29 18:05
快速回复:求教TonyDeng :通过方法来调用修改已保护的属性值,不懂。盼等!
数据加载中...
 
   



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

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