2009年10月11日

Rubyの勉強13(さいころ改良編2)少し脱線

さいころソフト改良の続きなんですが、話が少々脱線します。

今回の改良では入力窓が多くなりました。全部で8箇所あります。
そうなると使うときにはtabキーで次の入力窓へとカーソルがフォーカス移動できる方が便利です。

でもvrubyではできないっぽいんですね。ですよね?←(ちょっと自信無し)

例えば@edit.focus というような命令はできるんで constructに仕込んでプログラム起動時のカーソル位置を指定したりというのには使ってたんですが、
今回の場合だと使用中に特定のキー入力に反応して変更するようにしないといけません。
まだまだ初心者の自分にできるでしょうか?

結果としてはかなり邪道になりました。今回の自分のプログラムでは使えてますがあまり応用はきかないです。
悪い見本だと思って参考にはしない方が良いと思います。

まずはtabキーの入力を捕らえないといけません。
久しぶりにVisualuRuby計画(仮称)の本家に行ってリファレンスとサンプルを漁りました。

VRKeyFeasible というのが必要そうです。

__________________________
#! ruby -Ks

require 'vr/vruby'
require 'vr/vrcontrol'
require 'vr/vrhandler'

class KeyForm < VRForm
include VRKeyFeasible

def construct
self.caption = 'key test.1'
@font =@screen.factory.newfont('MS Pゴシック',14)
addControl(VRText, 'mes_area', "",10,10,160,40)
@mes_area.setFont(@font)
end

def self_char(keycode, keydata)
#キー入力を捉えてキーコードとキーデータを出力
@mes_area.text = "#{keycode}, #{keydata}"
end
end

VRLocalScreen.start(KeyForm,150,150,190,100)

__________________________

key_test_sp_1.jpg
(画面の見本です。動きません)

これを使うと押したキーに対応したキーコードとキーデータが表示されます。(見本はtabキーを押した時の表示)
今回はキーコードの方を使って条件式にしたら良さそうと思ったんですが、そんなに甘くないです。

例えばここではメソッドでウインドウそのものを指す self が指定されてるんで、
テキストエリアへの入力作業中には当然反応しません。
じゃあ def mes_area_char と書き換えればいいかと思ったら、あららだめでした。

どうやら(このケースでは)VRTextにひと手間加えないとだめみたいです。
本家のサンプルを参考にしたのが以下です。
class VRHookedEdit < VREdit の内容(ひと手間の部分)はそのまま使わせていただきました。
あとは今回用に書いたものです。
tab移動を管理するために t_move というメソッドを作りました。

__________________________
#! ruby -Ks

require 'vr/vruby'
require 'vr/vrcontrol'
require 'vr/vrhandler'

class VRHookedEdit < VREdit
include VRKeyFeasible
def vrinit
super
add_parentcall("char")
end
end

class TabmoveForm < VRForm
include VRKeyFeasible

def initialize
@tab_c = 0
end

def construct
self.caption = 'tab_move test.1'
@font =@screen.factory.newfont('MS Pゴシック',12)
addControl(VRHookedEdit, 'mes_edit0',"",10,10,160,20)
@mes_edit0.setFont(@font)
addControl(VRHookedEdit, 'mes_edit1',"",10,40,160,20)
@mes_edit1.setFont(@font)
addControl(VRHookedEdit, 'mes_edit2',"",10,70,160,20)
@mes_edit2.setFont(@font)

@mes_edit0.focus
end

def t_move(keycode)
if keycode == 9
@tab_c += 1 ; @tab_c = 0 if @tab_c == 3
case @tab_c
when 0
@mes_edit0.focus
when 1
@mes_edit1.focus
when 2
@mes_edit2.focus
end
end
end

def mes_edit0_char(keycode,keydata)
t_move(keycode)
end

def mes_edit1_char(keycode,keydata)
t_move(keycode)
end

def mes_edit2_char(keycode,keydata)
t_move(keycode)
end

end

VRLocalScreen.start(TabmoveForm,150,150,190,150)

__________________________

t_m_t_sp_1.jpg
(画面見本です。動きません)

なんとかtab移動できてます。
でも移動のたびに警告音が出るのはeditを使っているからでしょうか。

今回のサイコロソフトは数値の入力だけなのでtext窓じゃなくedit(1行のみのテキストボックス)を使いますから、
このテスト用プログラムでもeditで指定しました。
ちなみにVRTextでやると、これと同様に動作しますがテキストエリアにも通常のテキスト入力と同様tabの空白が入力されてしまいます。
ただしこっちは警告音無し。

ところでfocusメソッドは窓だけじゃなくボタンの部品にもフォーカス指定できるんですが
かといってenterキーとかで押せるわけでもないし、それはそれでまた悩まないといけないんでしょうか。
自分は今回入力窓同士の移動のみに限定して使うつもりですけど……

以上今回は少しどころか完全にテーマから脱線したお話でした。

今回もどこか間違ってたら暖かいツッコミをお願いいたします。

・12/16 追記 / 上記での問題点は、tk様からのご指摘(コメント)で全て一気に解決となりました! ありがとうございます。
詳細につきましては改めて別記事にしましたのであわせてご覧ください。

コチラ > vruby / tabキーによるフォーカス移動について



posted by Hol_nice at 22:01| Comment(2) | TrackBack(0) | プログラム | 更新情報をチェックする
この記事へのコメント
はじめまして。
私もvrubyでtabキーによるフォーカス移動したくて参考にさせてもらいました。

ちなみに t_move を次のように変えたら警告音が止まりました。

def t_move(keycode)
ret = nil
if keycode == 9
ret = SKIP_DEFAULTHANDLER
@tab_c += 1 ; @tab_c = 0 if @tab_c == 3
case @tab_c
when 0
@mes_edit0.focus
when 1
@mes_edit1.focus
when 2
@mes_edit2.focus
end
end
ret
end

ありがとうございました。
Posted by tk at 2009年12月09日 23:15
tkさん、はじめまして。

SKIP_DEFAULTHANDLER ですか。
こういう便利なものが有ったとは気づきませんでした。
こちらこそご指摘ありがとうございます!!

近日中にご報告に基づきまして「tk様よりのご指摘にて」の一文を加えました上で記事を修正させていただきます。
Posted by Hol_nice at 2009年12月10日 00:01
コメントを書く
コチラをクリックしてください

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。