AHK程序设计

[基础] AHK函数对象系列-绑定方法对象v3

2018-11-14  本文已影响7人  d61f25068828

文章编号-AHK-J003-绑定方法对象

缘由

希望用户在对象创建时就能够直接为成员方法绑定某键,如果这个功能不能实现,那么用户就需要在脚本里手动创立,一旦对象多了,就特别麻烦。

大概一周之前“绑定函数对象”实现了,参见[基础] AHK函数对象系列-绑定函数对象,今天“绑定方法对象”也实现了。在这里分享一下案例,希望对大家的程序设计能够起到帮助。_

绑定方法对象介绍

重要提醒:如果您对“方法”/“构造方法”/“对象”等基础知识没有接触的话,建议先查阅一下相关资料。另外针对这三个常用的概念,我会在文章后面用斜体特别的作出解释。

绑定方法对象也属于广义的“函数对象”,通过“绑定方法对象”,可以实现在成员方法之间更灵活的相互引用(比如用于HotKey命令/GUI事件/SetTimer事件),能提高代码的可读性和可复用性,让程序更便于维护。它的使用方法和之前说过的“绑定函数对象(BindFunctionObject)”是类似的。

绑定方法对象创立方法

BoundFunc := ObjBindMethod(Obj, Method, Params)

当然如果在Class设计的时候就用,那么Obj用this代指,估计这也是最常用的形式。

示例设计目标

在对象实例化的时候就提醒用户输入热键,用户输入热键(当然,实际应用中也可以根据对象的数量自动生成,比如说第一次k,第二次l,这个也用的很频繁。不过这个是专门来说“函数绑定对象”的,所以也就无所谓了。)之后该热键能直接绑定对象中的某方法。

示例

DefaultHotkey:="^t"
InputBox,UserOption,热键设置,请为软件的功能设置一个您喜欢的热键,,,,,,,,%DefaultHotkey%
if (ErrorLevel=1){
    TrayTip,热键设置,您未输入热键,故程序将自动设置热键为默认值Ctrl+t
    UserOption:=DefaultHotkey
}
obj_0:=new Test(UserOption) ;# [3] 

return ;# 自动执行结束

class Test{  ;# [1] 

;# 成员属性
todo_0:=""

TheNumber_2[]{
get{
return this.TheNumber_2_B
}

set{
return this.TheNumber_2_B:=value
}
}

TheNumber_2_B:="2"

;# 构造方法
__New(UserOption){ ;# [2] 
    this.todo_0:=ObjBindMethod(this,"ThePrint",this.TheNumber_2)
    todo_0:=this.todo_0
    
    Hotkey,%UserOption%,% todo_0
    ;~ Hotkey,%UserOption%,% this.todo_0 ;(错误的用法) 
    ;# [4] 
TrayTip,热键设置,已为您成功设置热键%UserOption% `r`nO(∩_∩)O  愿您使用愉快
    return this
}

;# 示例功能
ThePrint(Data){
    MsgBox,% "数据打印如下`r`n" Data
    return
}
}

注释

1 这个语句的意思是建立一个名字为Test的“类” ,“类”是什么?顾名思义“类”就是某一些具有相似特性的东西的集合,比如我们常吃的一类水果叫做苹果,有红富士苹果也有金帅苹果,那么“水果”是“苹果”的类,同样“苹果”是“红富士苹果”的类。那么建立类有什么作用呢?主要的作用就是实现大程度的代码复用。也就是说,如果你要建立一个新苹果叫做“蓝富士苹果”,那你就直接可以从“苹果”中进行修改,而不用二次建立。如果想了解更多,建议学习“面向对象编程”的相关知识。
2 构造方法。在AHK中构造方法是用__New定义的,构造方法的作用就是生成一个对象,并且返回,如果一个class中没有定义构造方法,那么它就会自动生成一个“空”构造方法,也就是说,除了返回对象本身不进行任何操作。当自定义__New时,用户调用的过程中,不仅会返回“对象”,还会运行该方法中的其他语句。
3 构造方法的调用。调用形式就是new ClassName(ParaMeters)。

[4] 为什么这个地方不直接用,Hotkey,%UserOption%,% this.todo_0,而要绕一个圈子

this.todo_0:=ObjBindMethod(this,"ThePrint",this.TheNumber_2)
todo_0:=this.todo_0

用,Hotkey,%UserOption%,% todo_0呢?

因为AHK中的成员变量中的对象,不能直接被HotKey所使用,具体原因不详,在帮助文件上查不到任何相关解释。
所以只能先转换成本地变量todo_0再给HotKey来使用。

如果直接使用的话就会弹出这样的提示。我不知道这是BUG还是有意的设计,我比较偏向于这是“BUG”,因为Error的信息是驴唇不对马嘴的。Error的意思是说t这个热键是不对的,其实和t什么关系也没有,改成什么键都不行,只有改一下对象的来源才行。

Error:  Nonexistent hotkey.
Specifically: ^t

之前的示例没有出问题,是因为我并不知道:在AHK中,所有的地方只要是访问成员变量,必须要使用this(声明除外)。可以说,这真的是一个脑残设计,一样原因不详。

当然是选择原谅TA了

End

心如止水是Java/AHK的持续学习者,很欢迎您来和我探讨Java/AHK问题。 QQ:2531574300 ^_^

AHK版本:1.1.30.00

文章版本信息

v2_11月18日:应读者要求增加了对于“构造方法”/“对象”/“类”的更多解释。

v3_11月22日:发现在目前为止(1.1.30.01)在成员变量中存储的“方法绑定对象”,无法被HotKey命令使用。并基于此修改案例。

更多文章

[基础] AHK函数对象系列-绑定函数对象
[基础] 在AHK中实现函数重载的效果
[AHK-lib分享] 用指定程序批量打开文档
[基础] [GIF动图] 绕过中文输入法发送文本的3种方法

版权声明:

该文章版权系“心如止水”所有,欢迎分享、转发,但如需转载,请联系QQ:2531574300,得到许可并标明出处和原链接后方可转载。未经授权,禁止转载。

作者:心如止水
上一篇 下一篇

猜你喜欢

热点阅读