| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1449 人关注过本帖
标题:求教TonyDeng :通过方法来调用修改已保护的属性值,不懂。盼等!
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
结帖率:79.38%
收藏
已结贴  问题点数:20 回复次数:30 
求教TonyDeng :通过方法来调用修改已保护的属性值,不懂。盼等!
TonyDeng :
预祝国庆愉快!又要来麻烦你了。下面是书上有关<保护及隐藏类成员>的例子,通过方法来调用修改已保护的属性值。窗口标题变化的代码。可以运行。
里面有的代码起什么作用?整个代码的运行机制是什么(运行过程是怎样进行的)?请您指教!(请见标识)
myform1=createobject("myform")
myform1.show
? myform1.getcaption() &&此句是不是调用自定义方法,并在表单中显示有关内容?
m="我的窗口"
myform1.changecaption(m) &&此句是不是自定义方法传递参数M?
?myform1.getcaption() &&此句与上面红的一句(myform1.getcaption())作用是否一样? ,既然有了上面的一句,为什么此处还要这一句?
release myform  &&&此处为何用myform 而不用myform1?

define class myform as form
protected caption
top=40
left=100
caption='被保护的窗口标题'
&&&&&&以下一段代码是如何运行的?
procedure getcaption   
return this.caption      &&返回到何处?
endproc
proc changecaption(c)
this.caption=c         &&此句的作用?
endproc
enddefine
搜索更多相关主题的帖子: 表单 
2011-09-29 09:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在类myform定义代码中,定义了两个自定义方法:一个是GetCaption(),它把当前对象的Caption值返回给调用者;一个是ChangeCaption(c),它接收参数c,把c的值赋给当前对象的Caption,即改变对象的Caption值。这是类定义,它对任何一个根据此类生成的对象实体都起作用,即每个这样的对象实体都具有这两个方法(不从此类生成的对象没有)。

现在看程序的实际动作。变量myform1是从类myform生成的对象实体,这个对象的Caption已如定义那样被保护起来,无法直接修改,所以必须用类提供的那两个方法来处置。第一个红句,显示当前对象的Caption值,按照默认,它是类初始化时给出的默认值,即"被保护的窗口标题"。然后程序使用m作为参数,把它传给ChangeCaption方法,此方法修改了myform1实体的Caption值。后面重新输出一次,是验证它确实被修改了,此时看到的,应该是"我的窗口"。在这个过程中,你会发现myform1窗体的标题文字从"被保护的窗口标题"变为"我的窗口"。

最后,释放的是对象实体myform1。类myform是无法释放的,因为它不是实际的内存对象,仅仅是定义而已。这个程序,在运行代码中释放对象,而不是通过交互鼠标点击窗口的关闭按钮结束,是强制结束(窗体一闪即逝)。当需要事件(比如点击某个CommandButton,或点击右上角叉叉按钮)释放对象时,就不能像这样在运行代码区写release,而要在类定义区写事件触发代码,后者写release thisform。

注意:在define class之前的,都是实际运行程序,整个程序的动作只有那部分代码。

授人以渔,不授人以鱼。
2011-09-29 10:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
顺便说一下,protected只是保护属性不能被修改,但仍然可以访问,此时在外面用? myform1.Caption是可以看到值的,无需自定义GetCaption方法。如果用hidden,就连读也不行了。

授人以渔,不授人以鱼。
2011-09-29 10:46
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
谢了,但还是似懂非懂,特别是? myform1.getcaption()与 ? myform1.getcaption() 好象窗口标题的变化与此无关,有无此二个代码窗口标题照样变化,好象与在表单中显示标题有关。我试调了4次。第一次这二 个都没有注销。第二次只注销红的,第三次只注销兰的,第四次全部注销。各次图不同。附上附件。
4次试调.rar (123.39 KB)
2011-09-29 12:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
变化标题栏文字无需GetCaption()的,那是给你示范读写被保护属性方法用的。那两行是调试代码,没有实质作用的。我下午写个同样的程序给你运行一下就知道了。

授人以渔,不授人以鱼。
2011-09-29 13:02
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
谢谢了,如此热心,又有这样的水平。碰到你真是三幸有运。我主要是代码运行的过程是怎样?要搞清楚其所以然。好比做一件事件第一步做什么,第二步做什么等等各步,各步之间有何联系只有搞清楚这些关系,这样以后自已写代码才能做到有的放矢。
2011-09-29 13:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
myForm1 = CREATEOBJECT("myForm")
WITH myForm1
    .Top = 50
    .Left = 50
    .Show
ENDWITH
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
   
ENDDEFINE

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

授人以渔,不授人以鱼。
2011-09-29 13:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你好像有ASP的基础吧?应该容易理解面向对象编程代码的。

授人以渔,不授人以鱼。
2011-09-29 13:28
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
你的代码提示:
图片附件: 游客没有浏览图片的权限,请 登录注册

多谢了,但还是请你多费心帮我把原来代码运行的机制搞清楚。然后再拜你的大作。否则还是一知半解。ASP也是略懂一些。
2011-09-29 13:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你用的6.0?改为
PROCEDURE SetCaption(tcCaption)
    This.Caption = tcCaption
ENDPROC

PROCEDURE SetCaption
    LPARAMETERS tcCaption
    This.Caption = tcCaption
ENDPROC

前者跟原来的ChangeCaption(m)是一样的,函数名和形参名改了而已。

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



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

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