ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】設定ファイルの読み書きをライブラリ化したい。

f:id:yasushiito:20190403184928p:plain
設定画面を用意して環境依存のパラメータを設定ファイルに読み書きできるようになりました。
この設定は各種スクリプトから参照されるので、ライブラリ化して使いまわせるようにしたいです。
最も簡単にファイルを分けるのは関数ライブラリです
ahkwiki.net
が、ライブラリ側のサブルーチンのラベルを呼び出せるか疑問がありましたので試してみました。
例えば次のように関数の下にサブルーチンを記述します。

lib\setconfig.ahk

setconfig(){
;入力ダイアログを作成する。
  Gui, add, text, ,入力してみて
  Gui, add, edit, vhatenaid w200, %hatenaid%
  Gui, Add, Button, W100 X25 Default gsubmit, OK
  Gui, Add, Button, W100 X+10, Cancel
;ダイアログを表示する。
  Gui, Show,, 設定のサンプル
  Return

}
;ダイアログの OK ボタンを押された時の処理。
submit:
  Gui, Submit
;入力された値を保存する。
  IniWrite, %hatenaid%, %A_ScriptDir%\conf.ini, user, hatenaid
  Return
;ダイアログのキャンセルボタン押された時の処理。
ButtonCancel:
  Gui, Destroy
  Return

結果を言えば、この書き方は有効です。
includeと同様にファイルごと読み込んでくれます。

ただし、関数の中で宣言した変数はローカル変数扱いになるので呼び出し側でグローバル宣言しなければなりません。
ですから、呼び出し側のスクリプトはこんな感じになると思います。

full.ahk

global hatenaid
getconfig()
Menu, tray, click, 1
Menu, tray, add, config, config
Return
config:
    setconfig()
    Return

#insert::
; はてなブログの新規エントリーを用意する。
    blogentry(hatenaid)
    Return

設定の変数hatenaidをグローバル宣言した後に ini ファイルから読み込んで設定画面を右クリックメニューconfigに関連付けます。
右クリックメニューから設定画面を開けます。
ホットキーWin+Insから呼び出す関数 blogentryに設定ファイルに保存されたパラメーター(hatenaid)を渡してますね。

call.ahk

    global hatenaid
    getconfig()
    blogentry(hatenaid)
    Return

もうひとつの呼び出しスクリプトは起動専門で設定画面を開く機能はありません。
それでも ini ファイルから読み込んだパラメータを関数に渡して呼び出してますね。
各種設定項目の変数をグローバル宣言した後に ini ファイルから読み込みでいますね。
注目点は一つありまして、ini ファイルをスクリプトディレクトリA_ScriptDirから探しています。
ini ファイルの読み込みは作業ディレクトリA_WorkingDirを起点としてファイルを検索します。
作業ディレクトリが必ず呼び出し側スクリプトと一致していれば良いのですが、別プログラムから起動するなど、別のディレクトリから操作される場合はこのように指定しないとファイルの探索に失敗します。

Ini ファイルの読み込みはこちらで。

lib\getconfig.ahk

getconfig(){
;前回の設定を読み込む。
  IniRead, hatenaid, %A_ScriptDir%\conf.ini, user, hatenaid, yourid
}