| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1449 人关注过本帖
标题:求教TonyDeng :通过方法来调用修改已保护的属性值,不懂。盼等!
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
就是向自定义函数传参数,不是固有方法,书中当然没有。

授人以渔,不授人以鱼。
2011-09-29 18:22
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
属性批量设置中一般是固有属性的设置 ,哪道还可以这样设置吗?哪它算属性设置还是方法设置?
2011-09-29 19:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看SetCaption()方法的代码呀,它就执行了Caption = 的赋值语句,你平时都是这么赋值设置属性的啦。

授人以渔,不授人以鱼。
2011-09-29 19:38
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
可能我没有讲清楚:
myForm2 = CREATEOBJECT("myForm")
WITH myForm2
    .Top = 100
    .Left = 100
   .setCaption("关闭本窗体则前一个窗体的标题将置空")  **问题1
    .Show(1)             ***问题2
ENDWITH


问题1
WITH myForm2
    .Top = 100     &&固有属性
    .Left = 100    &&同上
   我插一句。照一般常规是 .caption='xxxxxxx'
  现改为如下一句:
.setCaption("关闭本窗体则前一个窗体的标题将置空")
  此句把括号里面的(”关闭本窗体则前一个窗体的标题将置空")红色的内容当作参数传递给下面的过程
PROCEDURE setCaption(tcCaption)      
        This.Caption = tcCaption

变成了This.Caption ="关闭本窗体则前一个窗体的标题将置空",
然后返回到属性批量设置中变成了".caption=“关闭本窗体则前一个窗体的标题将置空"
从这样来看 .setCaption("关闭本窗体则前一个窗体的标题将置空")好象来调用setCaption(tcCaption)过程,不是常规的".caption='xxxxxxx'"。
这样又有不懂的地方了
,我看到一书中”自定义类是放在程序文件中的一组命令,它只是定义类的对象的属性,事件,方法,相当于一个过程。执行该程序文件时,在类定义中的命令是不执行的。所以可执行程序代码必须放在类自定义命令之前。哪么自定义命令外的参数可以传递给自定义内中的自定义方法吗?

问题2
Show(1) &&此句是属性还是方法?属性设置 中可以设置方法?
2011-09-29 20:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
先理清现在的思路:平时要对属性Caption设置,一般是myForm1.Caption = "abc",没错。但现在因为要保护Caption属性,不让它被外部的过程访问,此时它对外部过程来说,是一个不存在的东西。那么我们要如何设置它呢?解决的办法,既然无法直接访问对象的属性,就让对象自己做,我们发号施令就行了,这个属性到底如何设置,我们是不管的。因此,对象给我们提供了一个可以访问的方法,叫SetCaption(),只要我们需要设置这个对象的Caption属性,就呼叫这个方法,给出参数,说我们希望表单的标题文字是"abc",对象收到这条指令,就自己去设置属性,我们的希望就达到了。这是间接访问的方式。

因为我们定义的表单类myForm,是一个设计模板,所有基于这个模板产生的对象实体,都具有设计蓝图所指出的特性,我们在设计时,给出了GetCaption()和SetCaption()这样两个方法,那么基于这个类的对象实体都具备这两个方法,都可以用。这正是我们所希望的类特征,设计一个类,就是让它具备我们希望有的一系列共同行为,模板就起这种作用。

在类定义中,你看代码,里面有一行Caption = "被保护的窗口标题",这个在类定义中书写的代码,才是批设置,每一个基于本类产生的对象实体,都默认其Caption是"被保护的窗口标题",这就是我们设计这类时赋予它的子孙的共同特征,省去创建时再设置的麻烦(如果不需要这样的特征,就不用写,但仍然有默认值,就是类名"myForm",这是从myForm的父类Form继承下来的)。

现在我们依据此类定义,创建了两个具体的表单,我们希望这两个表单有不同的标题,于是就对其中一个(即myForm2)进行了另外的设置,覆盖掉默认的标题,而myForm1则沿用默认的设置。在运行时,你看到效果确实如此。

是的,类定义的所有文字、代码,都不是实际的东西,但如果你创建了此类的对象实体,这些东西就会被“复制”到实体中去,就变成实际的东西了——每一个对象实体都分别复制一套这份代码。如果你从来没有创建过此类的对象实体,那么此类不会占用内存,等于虚无。

Show()是Form类设计的一个固有方法(凡是以Form为父类继承出来的子类,都继承有这个方法)。这个方法的作用是使Form(表单)显示为可见(其逆方法是Hide(),消隐表单)。Show()方法设计有可选的参数,如果参数是1,则此表单显示后,作为模式表单运行(与设置WindowType = 1等效),默认为0,是非模式表单。对方法,如果它不返回值,也没有参数,那么调用时可以不写圆括号,这就是我们平常写myForm1.Show的原因,如果要使用参数,就写完整格式Show(0)或Show(1)。

像Show、Hide、Refresh、Move这样你可能使用的表单方法,都是VFP设计好送给我们使用的,它有一套默认的动作,我们可以在子类定义中修改、补充、废弃那些代码,你平时用得最多的可能是Refresh。如果希望添加父类中没有的新属性、新方法,就必须像我们现在这样写类定义。

授人以渔,不授人以鱼。
2011-09-29 22:15
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
这篇文章太有水准了
是否可理介为在类定义中所定义属性,方法,事件如:
[ PROTECTED Caption
    Caption = "被保护的窗口标题"
     
 PROCEDURE setCaption(tcCaption)      
        This.Caption = tcCaption
    ENDPROC
       PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
]都“复制”给相应定义的对象中,如myform1,myform2,它们都具有[.....]的内容。参数传递,调用等都在对象本身内进行。介决了类定义外的参数怎么传到类定义中去的疑问。
这样对问题1,我的理介是不是正确?
myForm2 = CREATEOBJECT("myForm")
WITH myForm2
    .Top = 100
    .Left = 100
   .setCaption("关闭本窗体则前一个窗体的标题将置空") &&继承类定义属性,原来的caption="被保护的窗口标题",后被“setCaption("关闭本窗体则前一个窗体的标题将置空")”传递(  )中参数,通过调用setCaption()方法变成了caption="关闭本窗体则前一个窗体的标题将置空"
    .Show(1)           
ENDWITH
但问题2好象没有理介我的原义。我的意思是在with .....endw是对象设置多个属性的过程,怎么能此中设置方法.show(1)?
WITH myForm2   .

.show(1)
endwi中


[ 本帖最后由 sylknb 于 2011-9-30 10:09 编辑 ]
2011-09-30 09:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
第一个,是的。

第二个,with...endwith只是表明此间对with的对象进行操作,不管是设置属性,还是执行方法,都可以。那是省略写法,仅仅为了不必在每个.之前都写上具体的对象名(那可能是很长的一串名字)。每一行都是运行语句,设置属性也好,执行方法也好,都是程序代码的正规写法。补充一句:那是执行方法,不是设置方法,方法的设置只能在类代码中,不在程序代码中。

[ 本帖最后由 TonyDeng 于 2011-9-30 09:59 编辑 ]

授人以渔,不授人以鱼。
2011-09-30 09:45
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
我刚才在14楼的修改后的一些理介是否正确?请明示!!,多谢。
2011-09-30 10:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
问题一理解正确(体现的逻辑如此,实现不是,但与我们暂时没关系)。问题二已回。

授人以渔,不授人以鱼。
2011-09-30 10:21
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
真是应了“与君一席话,胜读十年书”,看了不少书,书中都是一笔带过。以后还要多多麻烦您了。
2011-09-30 10:26
快速回复:求教TonyDeng :通过方法来调用修改已保护的属性值,不懂。盼等!
数据加载中...
 
   



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

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