[AHK2-UI] 使用#Include

发布时间 2023-08-23 14:21:08作者: 落寞的雪

#Include是什么

一句话介绍:可以将一个脚本的代码插入到Include语句的位置。

作用

使用#Include可以实现分模块开发,对于代码组织有十分重要的作用。

通常使用小型脚本(只有些热键和热字串)不需要使用;但当脚本不仅仅是这些,还要写ui界面或更繁杂的功能时,我们最好将ui和数据处理的逻辑分开。

下面是一个分模块的例子:

image

分别是:

  • bin -> 编译后的脚本。
  • cfg -> 配置脚本与配置文件。
  • fs -> 文件读写脚本。
  • handler -> 特定的数据处理。
  • home -> 脚本产生的文件。
  • res -> ui需要的资源。
  • ui -> ui实现脚本。
  • utils -> 使用的工具脚本,如一些数据结构,字符串处理。
  • 启动脚本。

注意:这些并不通用,大部分是专门为脚本而设计的。

使用#Include

以上面的启动脚本PToolLauncher.ahk为例子:

#Requires AutoHotkey v2.0
#SingleInstance Force
#Include ./ui/ui_planE.ahk

PlanEGui.Show({ theme: 'light' })

!0:: Reload
!Space::
{
  static flag := false
  flag ? PlanEGui.Show({ theme : 'light'}) : PlanEGui.Hide()
  flag := !flag
}
!q:: ExitApp()

这个脚本只做些脚本指令配置(如单例启动)和ui脚本引入。

其中便是通过#Include引入ui脚本,然后就像ui脚本出现在这一样,之后就可以调用里面的类和方法等。

使用时的注意点

使用#Include并不会修正资源路径。

为更好的说明,请看下面的例子:

; 假设有这样的目录树
; ui
;  |--a.ahk
; res
;  |--light.png
; b.ahk

; 脚本一 a.ahk
Class MyGui extends Gui {
  __New() {
    this.AddPicture('yp h30 w50', ../res/light.png'))
  }
}

; 脚本二 b.ahk
#Include ./ui/a.ahk
g := MyGui()
g.show()

如果运行b.ahk,则会报错,提示无法读取资源。
这是因为在b脚本中,资源引用的路径是基于b而言的,而这个路径本意是相对a的,所以当然会报错。

解决

如果写过nodeJs的就知道可以使用__dirname和Path.resolve()解决这个问题,所以我们写个类似的方法就行。

这将在后面实现。