AutoHotkey(v1.1.34)绑定类函数

虽然AutoHotkey已经出了2.0版本,更加的面向对象,
可以说强了不少,可惜普及度不高,对1.1的脚本兼容也不行,
实际使用时只好还是用1.1

1.1版本较大的问题是函数的绑定方式和gui组件的引用方式.
函数绑定方式在最后的1.1.34版本有改善,可以把热键和gui组件响应绑定到函数对象,
因此能做到绑定class中的函数.
而gui组件的引用方式依然是绑定一个全局变量,这当然很不舒服,但如果理解成绑定
到了一个自定义的字符串(该字符串可以作为全局变量的名字),也还勉强能接受.

总之使用1.1版本确实是不太好,代码非常的古典偏底层,非常的不够面向对象.
可是大部分旧代码都是基于这个版本的,总不能全改吧?!
研究后发现勉强能用,有解决方法,就是绑定函数时使用函数对象,
制作gui组件时当作自定义字符串做组件的句柄.

在旧版的class中,类内部的函数可以通过类名或实例去调用,
谁调用this就是谁,而函数实际上第一个参数是this.
所以如果不使用bind(this)制作函数对象,是不能直接绑定到热键或gui响应的,
否则this会变成响应函数的第一个参数.

下面是我测试在class中如何用函数对象绑定热键和gui响应的代码:

 

;** 类定义
class ClassTest1 {
  InstanceVar1 := "" ;实例变量,由构造函数传入

  ;构造函数
  __New(v1) {
    this.InstanceVar1 := v1
  }
  
  ;绑定到热键用的函数
  forKey() {
    MsgBox, % this.InstanceVar1
  }
  
  ;绑定到gui的menu的函数
  forGuiMenu(ItemName, ItemPos, MenuName) {
    MsgBox, %ItemName%
  }
  
  ;绑定到gui的button的函数
  forGuiButton() {
    MsgBox, % this.InstanceVar1
  }

}

;**脚本
ct1 := new ClassTest1("实例对象1")
;绑定热键
keyFunObj := ct1.forKey.bind(ct1)
Hotkey, x, % keyFunObj ;按x键将显示字符串"实例对象1",注意不能用下面的写法,尽管看起来一样
;Hotkey, x, % ct1.forKey.bind(ct1) ;这样写会出错,而且出错提示本身也是错的,提示为:x不是有效的热键
;添加gui并绑定菜单响应为类函数
Gui, New, , 类函数绑定到Gui测试
Gui, Add, text, , 类函数绑定到Gui测试
Gui, Add, button, vButton1, 按钮
;为按钮添加响应的函数对象
buttonFunObj := ct1.forGuiButton.bind(ct1)
GuiControl +g, Button1, % buttonFunObj
;添加菜单并设定响应的函数对象
menuFunObj := ct1.forGuiMenu.bind(ct1)
Menu, MenuItem1, Add, 选项1, % menuFunObj
Menu, MenuItem1, Add, 选项2, % menuFunObj
Menu, MenuBar, Add, 菜单, :MenuItem1
Gui, Menu, MenuBar ;加入菜单

gui, show

GuiClose(){
  ExitApp
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章