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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章