いつも通り俺得なツールを作っているAutoHotkey。
最近はショートカットでスクリプトを組むというよりも
ちょっとしたGUIのアプリを作ることが多い。
1画面内にドロップダウンリストが多数ある画面を作った。
こんな感じの。
このコードは
Gui, Add, Text, %DDL_NAME_POSITION%, A項目
Gui, add, DropDownList, %DDL_VALUE_POSITION% VaName, %aNameDdList%
Gui, Add, Text, %DDL_NAME_POSITION%, B項目
Gui, add, DropDownList, %DDL_VALUE_POSITION% VbName, %bNameDdList%
Gui, Add, Text, %DDL_NAME_POSITION%, C項目
Gui, add, DropDownList, %DDL_VALUE_POSITION% VcName, %cNameDdList%
Gui, Add, Text, %DDL_NAME_POSITION%, D項目
Gui, add, DropDownList, %DDL_VALUE_POSITION% VdName, %dNameDdList%
Gui, add, DropDownList, %DDL_VALUE_POSITION% VaName, %aNameDdList%
Gui, Add, Text, %DDL_NAME_POSITION%, B項目
Gui, add, DropDownList, %DDL_VALUE_POSITION% VbName, %bNameDdList%
Gui, Add, Text, %DDL_NAME_POSITION%, C項目
Gui, add, DropDownList, %DDL_VALUE_POSITION% VcName, %cNameDdList%
Gui, Add, Text, %DDL_NAME_POSITION%, D項目
Gui, add, DropDownList, %DDL_VALUE_POSITION% VdName, %dNameDdList%
こんな感じになっている。
色々と定数にしてるけど、本題はそこではないw
各ドロップダウンリストのV****
(例ではVaName等)が変数名で
Gui, Submit
をした後に%aName%
で、ドロップダウンリストに表示している文字列が取得できる。
値を1つずつ処理しながら使用するなら良いんだけど、ドロップダウンリストの文字列を
連結していくような処理の場合に
hogeText = % aName . ※なんか文字列とか※ . bName . ※なんか文字列とか※
なんて書くのは許せない。美しくない!
上記の例では変数名に法則性があるけど、実際にはドロップダウンリストの変数名はバラバラ。
なんかこう、ループ処理で綺麗にできないものだろうか。
「格納されているのは文字列だけど実は変数名」的な。
調べていたら方法はあった。
まずはこんな感じで配列に変数名(の文字列)を格納する。
global ArrayNameList := Object()
ArrayNameList.Insert("aName")
ArrayNameList.Insert("bName")
ArrayNameList.Insert("cName")
ArrayNameList.Insert("dName")
ArrayNameList.Insert("aName")
ArrayNameList.Insert("bName")
ArrayNameList.Insert("cName")
ArrayNameList.Insert("dName")
んで、処理側は
aaaText =
For index, ddListName in ArrayNameList
{
StringTrimLeft, outValue, %ddListName%, 0
aaaText .= outValue . "`n"
}
For index, ddListName in ArrayNameList
{
StringTrimLeft, outValue, %ddListName%, 0
aaaText .= outValue . "`n"
}
赤文字のStringTrimLeft
というコマンドがキモ。
本来は文頭の文字をカットするコマンドなんだけど、
「変数名が入った変数(ややこしい)」を指定することで変数として扱える。
あとはループでグリグリ回すだけだ。
ここに行き着くまでに結構時間を使った。
いかんなぁ・・・衰えてるなぁ・・・w