| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3712 人关注过本帖
标题:运行时,怎么添加自定义属性?
只看楼主 加入收藏
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 9楼 zyxxzhyg
谢谢!

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-12-15 08:14
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 10楼 zyxxzhyg
        PROCEDURE init
            this.AddProperty ( "varTestLoginCount")
            this.varTestLoginCount=this.testLoginCount
        ENDPROC


前面的testLoginCount本身就已经是自定义属性了  这个  有点画蛇添脚了  

不过  你教会了我AddProperty的用法   

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-12-15 08:28
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 7楼 sdta
并不是不会走  就想学跑   

基础的书看了好多了  就是记不住   每个人的学习方法不同了吧   每个人的条件也不同了

我是十天看两页书   然后   半天就忘光了   

看书的时候  什么都懂   不动手做   什么都记不住

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-12-15 08:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
对类成员的引用有点乱,这样也可以:
程序代码:
of = CREATEOBJECT("logForm")
of.show(1)

DEFINE CLASS logForm as Form 
    testLoginCount = 3
    ADD OBJECT cmdLogin as loginBtn
ENDDEFINE

DEFINE CLASS loginBtn as CommandButton
    top=168
    left=144
    height=25
    width=60
    caption="登 录"

    PROCEDURE click
        thisform.testLoginCount = thisform.testLoginCount - 1 
        IF thisform.testLoginCount == 0
            MESSAGEBOX("尝试登录过于频繁,程序将退出!如有问题,请联系程序管理员!",64,"非法登录警告!")
            thisform.Release 
        ELSE
        
        ENDIF
ENDDEFINE 


但可读性并不好,不方便以后代码维护。
再看看这样,是不是更清晰一些:
程序代码:
of = CREATEOBJECT("logForm")
of.show(1)

DEFINE CLASS logForm as Form 
    ADD OBJECT cmdLogin as loginBtn
ENDDEFINE

DEFINE CLASS loginBtn as CommandButton
    top=168
    left=144
    height=25
    width=60
    caption="登 录"

    testLoginCount = 3

    PROCEDURE click
        this.testLoginCount = this.testLoginCount - 1 
        IF this.testLoginCount == 0
            MESSAGEBOX("尝试登录过于频繁,程序将退出!如有问题,请联系程序管理员!",64,"非法登录警告!")
            thisform.Release 
        ELSE
        
        ENDIF
ENDDEFINE 

2015-12-15 09:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实楼主这样学也是可以的,他原本有其他语言的编程经验,但很明显对面向对象编程不熟,现在问的问题,多数是编程方法上的,不是技术上的。比如像这个问题,属性该在类设计中设置,还是在运行时动态附加到具体对象上,是由该属性的逻辑决定的,怎样加上去都有对应的方法,但问题不是如何加,而是它到底应该以什么方式去加,不能是技术懂怎样就怎样加,那写出来就拗逻辑,这就是程序设计方法问题。

授人以渔,不授人以鱼。
2015-12-15 10:39
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
书就是工具书,遇到问题就查,查多了就熟了。

我们都在路上。。。。。
2015-12-15 11:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
*-----------------------
* 登录示例
* [color=#800000]2015.12.15.[/color]
*-----------------------

CLEAR ALL 
CLOSE PROCEDURES
SET PATH TO "..\MyTools"
SET PROCEDURE TO "MyForm", "MyLogin"

PUBLIC gcUserName
Login("gcUserName")
IF !EMPTY(gcUserName)
    Main()
ENDIF 

CLOSE PROCEDURES
CLEAR ALL 
RETURN 

PROCEDURE Main()
    LOCAL loMainForm
    loMainForm = CREATEOBJECT("C_MainForm")
    WITH loMainForm
        .Caption = "主窗体"
        .Width = 600
        .Height = 400
        .AutoCenter = .T.
        .Show
    ENDWITH 
    READ EVENTS
ENDPROC 

DEFINE CLASS C_MainForm AS MyForm
    ShowWindow = 2
    
    ADD OBJECT Label1 AS Label WITH Caption = "欢迎您!" + gcUserName, FontSize = 36, AutoSize = .T.
    
    PROCEDURE Arrange
        WITH This.Label1
            .Top = (This.Height - .Height) / 2
            .Left = (This.Width - .Width) / 2
        ENDWITH 
    ENDPROC 
    
ENDDEFINE 


MyLogin.PRG
程序代码:
PROCEDURE Login(tcControlSource)
    LOCAL loLogin
    &tcControlSource = ""
    loLogin = CREATEOBJECT("MyLogin", tcControlSource)
    loLogin.Show
    READ EVENTS
ENDPROC 

DEFINE CLASS MyLogin AS MyForm
    ShowWindow = 2
    Caption = "请登录"
    Width = 300
    Height = 200
    BorderStyle = 1
    ControlBox = .F.
    AutoCenter = .T.
    
    ADD OBJECT Label1  AS Label         WITH Caption = "账号:", Width = 60, Height = 25, Alignment = 1, FontBold = .T.
    ADD OBJECT Text1   AS TextBox       WITH Width = 100, Height = 25
    ADD OBJECT Label2  AS Label         WITH Caption = "密码:", Width = 60, Height = 25, Alignment = 1, FontBold = .T.
    ADD OBJECT Text2   AS TextBox       WITH Value = "", PasswordChar = "*"
    ADD OBJECT Button1 AS CommandButton WITH Caption = "提交", Width = 40, Height = 25
    
    PROCEDURE Arrange
        WITH This.Label1
            .Top = 5
            .Left = 5
        ENDWITH 
        WITH This.Text1
            .Top = This.Label1.Top
            .Left = This.Label1.Left + This.Label1.Width + 5
        ENDWITH 
        WITH This.Label2
            .Top = This.Label1.Top + This.Label1.Height + 5
            .Left = This.Label1.Left
        ENDWITH 
        WITH This.Text2
            .Top = This.Label2.Top
            .Left = This.Label2.Left + This.Label2.Width + 5
        ENDWITH 
        WITH This.Button1
            .Top = This.Label2.Top + This.Label2.Height + 5
            .Left = 5
        ENDWITH 
        This.Height = This.Button1.Top + This.Button1.Height
        This.Width = This.Text2.Left + This.Text2.Width + 5
    ENDPROC 
    
    PROCEDURE Init(tcControlSource)
        IF !EMPTY(tcControlSource)
            This.Text1.ControlSource = tcControlSource
            RETURN .T.
        ELSE
            RETURN .F.
        ENDIF 
    ENDPROC 
    
    PROCEDURE Text1.Valid
        This.Value = ALLTRIM(This.Value)
    ENDPROC 
    
    PROCEDURE Text2.Valid
        This.Value = ALLTRIM(This.Value)
    ENDPROC 
    
    PROCEDURE Button1.Click
        This.Parent.Verify
    ENDPROC 
    
    HIDDEN TryCount
    TryCount = 3
    PROCEDURE Verify
        WITH This
            IF !((.Text1.Value == "Admin") .AND. (.Text2.Value) == "123456")
                .TryCount = .TryCount - 1
                IF .TryCount > 0
                    MESSAGEBOX("您输入的账号或密码不对哦,请重新输入!")
                    .SetAll("Value", "", "TextBox")
                    .Text1.SetFocus
                ELSE
                    .Release
                ENDIF 
            ELSE 
                .Release
            ENDIF 
        ENDWITH 
    ENDPROC 
    
ENDDEFINE 


[此贴子已经被作者于2015-12-15 15:38编辑过]


授人以渔,不授人以鱼。
2015-12-15 14:56
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 17楼 TonyDeng
真“类”啊  思想完全又被革新了

之前写的东西  又要重新“类”一遍  。。。。。

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-12-16 11:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
什么地方颠覆你了?

授人以渔,不授人以鱼。
2015-12-16 11:19
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1503
专家分:6593
注 册:2010-7-5
收藏
得分:0 
回复 19楼 TonyDeng
我的代码  仍然有着面向流程的影子  离面向对象   还很远

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2015-12-16 11:26
快速回复:运行时,怎么添加自定义属性?
数据加载中...
 
   



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

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