Giraffe+ 0.5.25.408

Downloadページへ

前リリースからの変化

  • 定数を持つ内部式クラスを、定数のように共有するようにした
  • 名前解決をする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)
]