バーコードで受け付け時刻と退出時刻を管理するプログラムを作ってみた。ミーティングの受け付けで名札を渡すのだが、この名札にバーコードを印刷しておいて、バーコードリーダで受け付け時と退出時に名札をスキャンするという寸法だ。
AppleScript Studioでフロントエンドを作り、バックエンドのデータベースはファイルメーカーProで行わせてみた。
以前、Mac OS 9の頃に「バーコードから製品コードを読み取って、該当する製品のWebを表示する」デモを作った際には、REALbasicでフローティングパレットを作成し、起動時にそこをクリックしておいてからバーコードの受け付けを行うようにしてあった(作成所用時間15分。一瞬でできた)。
他人に使わせるのであれば、ちょっと危険な仕様だ。この、「最初に(入力欄を)クリック」というのを忘れてしまえばいっさい動かない。
バーコードとデータベースを組み合わせる時に悩ましいのがこのフォーカス位置設定の問題と、オペレーション中に余計な操作をされないための配慮だ。
フォーカス合わせのクリック動作を使用者全員に徹底させるのはどだい不可能な話なので、バーコードの入力フィールドにはAppleScript側でフォーカスを強制的に設定しないと使いものにならない。また、操作中にフォーカスが外れるようなこともあってはならない。
最初にユーザーからの反応を受け付けるのはFirst Responderなので、これをAppleScriptで素直に設定してみると……うまく行かない。いろいろ試したり調べたりしていたら、入力フォーカスを置くのは別の方法を用いなくてはならないことが判明。Q&A集に追記しておいた。
これで、バーコード入力用のテキストフィールドに、常にフォーカスが合うように処理できた。次は、全画面を覆ってユーザーの操作からプログラムを保護する処理だ。
画面全体を半透明のウィンドウで覆って、グローバルな最前面ウィンドウとして設定した。これで、どのアプリケーションを選択しても保護用の半透明ウィンドウが最前面に表示される。
ただ、これでも表示されているのは普通のウィンドウなので、ちょっとだけ気になる。ウィンドウの枠を消去すべく、保護ウィンドウを透明ウィンドウにしてみた。しかし、透明ウィンドウにしてしまうと、今度は文字入力のためのフォーカス設定を行えなくなった。なんてこったい!
結局、ウィンドウのタイトル枠は残ってしまったが、まあこのぐらいなら許せる範囲だろう。
意外なところにも伏兵はいた。
ファイルメーカーProに対して現在選択中のレコード数を尋ねる(count every record)と、エラーが出るのである。このレコード数カウントの問題はOSがバージョンアップしたりファイルメーカーがバージョンアップするたびに顕在化する問題であり、かれこれ3年ぐらいは悩まされ続けている。
発想の方向性を変えて、とりあえず問題が起きないような処理に書き換えてみた。アプリ層の上から叩くAppleScriptだけに、アプリやOSのバージョンによって挙動が変わる部分はいたしかたない。
まあ、こんな感じで出来上がった。
バーコードをスキャンするとファイルメーカーProのDBをサーチし、もし到着時刻に記入がなければ現在時刻を突っ込んで「到着」と最前面ウィンドウに表示。すでに到着時刻が入っていれば、退出時刻に現在時刻を叩き込む。
つまり、一度目のバーコードスキャンは「到着」と見なし、二度目のスキャンは「退出」と見なすというわけだ。
とりあえず、なんとか受け付けで使えるレベルのものは作った。来週のAUGMで「どの人がどのコマを見て帰ったか?」という行動分析を行う(今後の企画のため)ために試作してみたものだ。
ツールは作ったものの、ネームプレートにバーコードを入れて印刷するあたりの話とか(手元にあるのはClassic Mac OS用のファイルメーカープラグインだった。Mac OS X版はない)、何度か出入りした人がいたとしたらどうするのか、とか……。
まあ、いきなりぶっつけで運用するとロクなことが起きないので、セミナーで紹介だけしておいて次回にでも使ってみるというのがいいところだろう。