Giraffe+ 0.5.25.408
前リリースからの変化
- 定数を持つ内部式クラスを、定数のように共有するようにした
- 名前解決をするBlock.resolve, Method.resolveを定義
- String.exists, is_dir, is_accessibleを、ITEMIDLISTに対して実行した場合にそれ用の関数を使うようにした
- Giraffe.ListBoxにLB_DELETESTRINGをサポートさせた
- Giraffe.ListBoxのLB_INSERTSTRING, LB_ADDSTRINGの動作を少し変えた
- settings/hotkey/SwitchWindowを、もう少しカスタマイズ可能にした
定数を持つ内部式クラスを、定数のように共有するようにした
メモリ節約のための小細工です。これのために、これまでの式クラス(gs::expr)の仕組みを少し変えました。リンクドリストみたいにメッセージでexprをつなげていたのを、メッセージを持つ専用の式クラス(gs::expr_with_msg)を定義して、それにメッセージの配列を持たせるようにしました。結果、gs::exprがメッセージから独立し、違うメッセージを持つ式に同じgs::exprを流用できるようになりました。
名前解決をするBlock.resolve, Method.resolveを定義
Method.closureは単にその場のContextを結びつけるだけのものなのに対して、こちらはその場のContextに従い名前解決をします。こちらのほうが一般的なクロージャの感覚に近いかもしれません。
仕様:
- 引数は1つまたは2つ。1つ目がSymbol_idでオブジェクト名、2つ目がそれと置き換わる値。2つ目を省略するとそのコンテキストにおけるその名前の値になる。
x: 1 [x].resolve(:x) //[1] [x].resolve(:x 2) //[2]
[x [x]].resolve(:x 2) //[2 [2]]
実例:
//指定ディレクトリ以下を動的に表示するメニュー list_dir: `dir[ a: {} Shell.FindFile(dir.+ '\\*').each&* `f[ f.is_dir.? [ a.push_back('*'.+ (f.path_get_name)) a.push_back([list_dir(f)].resolve(:f)) ], [ a.push_back(f.path_get_name) a.push_back([NormalExecute(f)].resolve(:f)) ] ] a ] ShowMenu(0 0 list_dir('::').@ )
String.exists, is_dir, is_accessibleを、ITEMIDLISTに対して実行した場合にそれ用の関数を使うようにした
今までは、ITEMIDLIST(::で始まる文字列)が渡された場合、それをパスに変換してpath::exists等に渡してました。それを、iidl::exits_string等の専用の関数に渡すようにしました。パスに変換できないITEMIDLISTのアイテムを扱うためです。
Giraffe.ListBoxにLB_DELETESTRINGをサポートさせた
忘れてました。Giraffe.ListBox.DeleteItemがあったので必要なかったんですが、せっかくMFCの関数が使えるようになったので*Itemと*Stringに違いを持たせてサポートしておきました。Itemのほうは、Giraffe+が持つリストボックス外部のリストアイテムデータを変更し、Stringのほうはそれに加え、リストボックス内部のリストアイテムカウントを変化させます。Itemは、その呼出し後にGiraffe.ListBox.ResetCountを呼ばないと内部と外部の違いから、強制終了することになりますが、Stringはなりません。Giraffe.ListBox.ResetCountは自動的にリストをリサイズしてしまうので、それを回避するのにも使えます。Giraffe.ListBox.ResetCountの引数はリセット後のアイテム数ですが、-1にすると前述の外部のリストアイテムデータの数になります。
Giraffe.ListBoxのLB_INSERTSTRING, LB_ADDSTRINGの動作を少し変えた
LB_DELETESTRINGと同じ仕様にしました。
settings/hotkey/SwitchWindowを、もう少しカスタマイズ可能にした
関数として定義可能な処理を増やしました。
- SwitchWindow_SetListItem(index, hwnd): hwnd(ウインドウハンドル)から文字列を生成しリストボックスの指定位置(index)にそれを置くために呼ばれます。SetItemData(hwnd)の役も担います。
- SwitchWindow_ResetListItem: リストボックスのアイテムを初期化するときに呼ばれます。最低一度は呼ばれます。SwitchWindow実行時に生成されるSwitchWindow_alt_tab_listにウインドウハンドルが保持されているので、それを使います。
- SwitchWindow_MakeRegexList: 入力されたテキストから正規表現のリスト作ります。
- SwitchWindow_SelectWindow(words): wordsはSwitchWindow_MakeRegexListの戻り値です。入力に一致するウインドウを選択します。
入力に一致するウインドウだけリストボックスに表示する例:
global.SwitchWindow_SelectWindow: `words[ SwitchWindow_ResetListItem words.empty.not.? [ 0...(Giraffe.ListBox.GetCount).rrange.each& `n[ text: Giraffe.ListBox.GetText(n) words.each& `word[ text.!~ word.? [ Giraffe.ListBox.DeleteItem(n) //これをDeleteStringにして、下のResetCountを削除するとリストボックスがリサイズしない。 parent.return ] ] ] ] Giraffe.ListBox.ResetCount(-1) Giraffe.ListBox.SetCurSel(0) ]