こんにちは
Curl Sonntagのbind-screen-command と define-screen-commandを使って、
下記のDragOverのようなイベントやオブジェクトを引数として使用した記述は可能でしょうか?
可能であればどのように記述すればよいのでしょうか?
Code:
{VBox
{on e:DragOver at v:VBox do
{e.will-accept-drop?
{proc {type:Type, x:Distance, y:Distance, effect:#DragEffect}:DragEffect
}
}
}
}
私たちも以前からこれは感じて、Sonntagをいろいろカスタマイズして、以下のようにイベントやコントロールを取得できるようにしました。
Code:
{TextField
{bind-screen-command => test || ここもStringじゃなくした。
on ValueChangedEvent
}
}
{define-screen-command test
on event:ValueChangedEvent
at tf:TextField
of screen:TestScreen
do
||....
}
SonntagはApache2.0ライセンスだから、カスタマイズ自由。。
参考までにSonntagの修正した部分のコードを添付します。
(他にも修正するところがあったかもしれないので、このコードだけでは動かないかもしれませんが、参考になると思います。)
回答ありがとうございます。
マクロってすごいですね!
確かにマクロは、他の言語にもあまりない機能で言語が拡張できるから、非常にパワフルですよね。
ただ、ヘルプドキュメントがわかりづらくて、理解しづらいし、情報源が少なすぎる。。。。
もし、マクロマニアになれるドキュメントあったら、教えてほしいっす。。
(Excelマクロの本はいっぱいあるんですが・・。。全然違うもんか。。)
もしくは作ってほしいです。
- B
Sonntagは比較的シンプルな画面やUIの標準ががっちり固まっている画面を量産するような、伝統的な(?)業務アプリケーション開発で使われることを想定したフレームワークです。(逆に少数の画面で複雑なUIを実現するようなアプリケーションの開発には向いていません。例えばGoogleカレンダーみたいなのを作るにはSonntagは全然嬉しくない)
こういったアプリケーションの開発だと、Sonntag以外にもそれ固有の標準や共通仕様を実現するためのさまざまなライブラリ(共通部品とかカスタムコントロールとか呼び方はいろいろ)を用意していくと思います。そしてそれらを使って「アプリケーションロジック」を組み立てていく。
具体的なイベントやイベントターゲットに依存するような処理は、SonntagではアプリケーションロジックではなくUIの詳細だと考えて、スクリーンコマンドで無理やり実装させることは想定していません。そういった処理はたいてい、ライブラリコード側に組み込まれる方が好ましいと思われるからです。
例えば、
・○○画面の××ボタンが押された場合・・・を行う
・△△画面の□□メニューが選択された場合・・・を行う
というような処理と、
・xxにキーフォーカスがあるときにyyキーが押された場合にxxを・・・する
・aaのオブジェクトをbbにドラッグ&ドロップした場合にbbを・・・する
のような処理では粒度がまったく異なるので、これらに同じ作り方をさせなくても問題ないでしょう。
前者はSonntagのスクリーンコマンドで実装し、後者はライブラリコード側なりで(Sonntagを使わない)それぞれに適切な作り方を選択することになると思います。
define-screen-command で Event や EventTarget に直接依存させないようになっているのは一応意図した結果です。
(それらが必要なら素直に on マクロを使う)
ただし、特定のイベント発生時にスクリーンコマンドを実行したいというケースは多々考えられます。
(例えば PasswordField で Enter キーを押したらログインボタンと同じコマンドを実行したい、など)
こういった場合は以下のような記述が可能です。
Code:
{PasswordField
{bind-screen-command "login" on Action}
}
ちなみにこれは以下のコードと同等です。参考まで
Code:
{PasswordField
{on Action at v:Visual do
{if-non-null screen = v.screen then
{screen.do-command
"login",
throw-exception-on-failure? = false
}
}
}
}