過去の桐井戸端BBS (桐ver.9)
24983 ソース値更新イベントでフォーカスを移していますが、[Ctrl]+[←]や[Ctrl]+[↓]の場合にはフォーカスを飛ばしたくない。 悲しげ 2004/02/20-15:53
次のような伝票(一覧表)wfmがあります。
ヘッダ部 [年]、[仕入先]
明細部  [月]、[日]、[摘要]、[仕入額]、[支払額]、[残高]、[備考]
フッタ部 #合計([仕入額])、#合計([支払額])、#項目値([残高])

さて、入力に際して、[摘要]の項目値が「支払」なる文字列を含んでいた場合に、
[仕入額]を飛ばして[支払額]にフォーカスを移すようにしています。この場合は、
フォーカスの移動ですから、「ソース値更新」イベントを使いました。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 t摘要::ソース値更新()
 cond(#文字位置([摘要],"支払")>0) method @t支払額.フォーカス設定()
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

これはこれできちんと動くのですが、何せ「ソース値更新」ですから、
例えば、[Ctrl]+[←]とか[Ctrl]+[↓]とかで、前項目や前後レコードに移動しようとした時にも、
強制的に[支払額]にフォーカスが飛んでしまいます。(;_;)
この件、即ち[Ctrl]+[←]とか[Ctrl]+[↓]とかの場合にはフォーカスを飛ばさないための、
何かうまい方法があれば教えて下さい。
既出だったら、すみません、過去ログの所在を教えて下さい。

以上が質問です。
なお、この件について少々ドツボにはまりまして、暫定的に下記のように動かしていますが、
他にもっとシンプルなやり方がありそうな気がいたしまして・・・。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
名札 メイン
 var 固有,長整数{&戻り=0}



手続き定義開始 フォーム::キーダウン(長整数 &仮想キーコード,長整数 ・・・・
 var 自動,長整数{&更も},自動,文字列{&focus}
 method @フォーム.更新モード取得(&更も)
 method @フォーム.フォーカスオブジェクト取得(&focus)
 ケース開始
 ケース(&更も>0)
  if(&フラグ=8 .and &focus="t摘要" \
   .and 37=<&仮想キーコード .and &仮想キーコード=<40)
   /*「キーダウン」イベントが「ソース値更新」に先立つことを利用*/
   /*[摘要]項目で[Ctrl]+[矢印]押下時、ソース値更新イベントで無処理とするために*/
   /*ちなみに[Enter]での移動は「→」方向のみを前提、[F4][Tab]キーの挙動は無視*/
   &戻り=1
  end
 ケース その他
 ・・・・
 ・・・・
 ケース終了
手続き定義終了

手続き定義開始 t摘要::ソース値更新()
 if(&戻り=0)
  cond(#文字位置([摘要],"支払")>0) method @t支払額.フォーカス設定()
 else
  &戻り=0
 end
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

24984 Re:項目値如何で次のフォーカスを指定するに際して Mao 2004/02/20-17:31
記事番号24983へのコメント
私が、コメントするのも烏滸がましい気がしますが。

[摘要]欄で入力後イベントを使って

&編集文字列に”支払”が含まれていた場合

オブジェクト操作 @t仕入額.フォーカスの設定="禁止"にし、

[支払額]にフォーカス取得したら

オブジェクト操作 @t仕入額.フォーカスの設定="自動"

で戻してやってはだめですか?

はずしてたらご免なさい。
24985 Re:項目値如何で次のフォーカスを指定するに際して ONnoji 2004/02/20-17:34
記事番号24983へのコメント
悲しげさん、こんにちは。

ONnoji です。←ここでは(^^ゞ

ソース値更新は効果絶大過ぎて困ることがありますよね。
そこで以下のようなソース値更新をまったく使わない方法を考えてみました。

外していると思いますが…(^^ゞ

*------------------------------------------------*
名札 メイン
 変数宣言 局所,整数 { &m支払額focus = 0 }
 オブジェクト操作 @フォーム.タイマー1 = "0"
 オブジェクト操作 @フォーム.タイマー値1 = 10


手続き定義開始 フォーム::タイマー1()
 オブジェクト操作 @フォーム.タイマー1 = "0"

 if ( &m支払額focus = 1 )
  メソッド呼び出し @txt支払額.フォーカス設定( )
 end
手続き定義終了


手続き定義開始 txt仕入額::入力前( …省略… )
 if ( &m支払額focus = 0 )
  確認
 end
手続き定義終了


手続き定義開始 txt仕入額::入力後( …省略… )
 if ( &m支払額focus = 0 )
  確認
 end
手続き定義終了


手続き定義開始 txt仕入額::ソース値更新()
 if ( &m支払額focus = 0 )
  確認
 end
手続き定義終了


手続き定義開始 txt仕入額::フォーカス取得( …省略… )

 if ( &喪失オブジェクト名 = "txt摘要" .and &m支払額focus = 1 )
  オブジェクト操作 @フォーム.タイマー1 = "1"
 end

手続き定義終了


手続き定義開始 txt摘要::入力後( …省略… )

 &m支払額focus = 0
 if ( #文字位置( &編集文字列, "支払" ) )
  &m支払額focus = 1
 end

 if ( &モード = 0 )
  &m支払額focus = 0
 end
手続き定義終了
*------------------------------------------------*

24987 Re:項目値如何で次のフォーカスを指定するに際して アックン(=^・^=) 2004/02/20-18:26
記事番号24983へのコメント
悲しげさん> こんばんはっと(=^・^=)
編集モードのときだけ対応すればいいのでしたら、下記でいいはずです。

proc t摘要::入力後(・・
 if( #文字位置(&編集文字列,"支払")>0 )
   object @t仕入額.フォーカスの設定="禁止"
 else
   object @t仕入額.フォーカスの設定="自動"
 end1
end

24988 Re:項目値如何で次のフォーカスを指定するに際して アックン(=^・^=) 2004/02/20-18:28
記事番号24987へのコメント
ソース値更新イベントはいりません。入力後イベントだけです。
24989 Re:項目値如何で次のフォーカスを指定するに際して アックン(=^・^=) 2004/02/20-18:49
記事番号24985へのコメント
ONnojiさん、こんばんは。ツッコミではありません。
#文字位置は未定義値を返さないってば。
私はこのことに長いこと気づかずに使っていて、悲しげさんたちになんで(?)とぼやいていたことがあります。(^^;
24990 ダメ元 しぼうかん 2004/02/20-19:51
記事番号24983へのコメント
悲しげさん、いつもお世話に成っております。
このメンバーに入りおじゃまレスするのは結構勇気が入ります。
しかし何とか一度ぐらいは役に立てないかとダメ元チャレンジです。


手続き定義開始 t摘要::ソース値更新()
 cond(#文字位置([摘要],"支払")>0) object @t仕入額.タブストップ= "0"
手続き定義終了

手続き定義開始 t仕入額::入力前(参照 文字列 &編集文字列)
オブジェクト操作 @仕入額.タブストップ = "1"
手続き定義終了

手続き定義開始 t支払額::入力前(参照 文字列 &編集文字列)
オブジェクト操作 @仕入額.タブストップ = "1"
手続き定義終了

手続き定義開始 t日::入力前(参照 文字列 &編集文字列)
オブジェクト操作 @仕入額.タブストップ = "1"
手続き定義終了

手続き定義開始 t摘要::入力前(参照 文字列 &編集文字列)
オブジェクト操作 @仕入額.タブストップ = "1"
手続き定義終了

t摘要からマウスを使って移動する場合には他のオブジェクトの入力前イベントにも同様のコマンド処理が必要ですね。

24991 フラグをリセットする必要がありました ONnoji 2004/02/20-20:42
記事番号24985へのコメント
悲しげさん、こんにちは。

ONnoji です。←ここでは(^^ゞ

やっぱりフラグ:&m支払額focus をリセットする必要がありましたね。
フラグのリセットは[txt支払額]の[フォーカス取得]イベントで、

txt支払額 = 0

とすれば良いと思います。

なお、トレース結果は以下のようになりました。(^^ゞ
[トレース出力]コマンドでコメントを書き出してありますので、
ご理解いただけると思います。

タイマーを使うのでインターバルによっては違う結果になるのかも…
詳しくは不明です。

*-------------------------------------------------*
<桐ver.9 と 桐ver.8 sp6>

┌when "txt摘要::入力後("支払い",1,0)"を実行開始しました

│ :#文字位置( &編集文字列, "支払" ) … 1

└end
 
┌when "txt仕入額::フォーカス取得("txt摘要")"を実行開始しました

│ :オブジェクト操作 @フォーム.タイマー1 = "1"

└end
 
┌when "txt仕入額::入力前( )"を実行開始しました

│ :nop

└end
 
┌when "フォーム::タイマー1( )"を実行開始しました

│ :before メソッド呼び出し @txt支払額.フォーカス設定( )

│┌when "txt仕入額::入力後(,1,0)"を実行開始しました
││
││ :nop
││
│└end

│┌when "txt仕入額::ソース値更新( )"を実行開始しました
││
││ :nop
││
│└end

│┌when "txt支払額::フォーカス取得("txt仕入額")"を実行開始しました
││
││ :reset! &m支払額focus = 0
││
│└end

│ :after メソッド呼び出し @txt支払額.フォーカス設定( )

└end

*-------------------------------------------------*

24992 Re:項目値如何で次のフォーカスを指定するに際して ONnoji 2004/02/20-20:49
記事番号24989へのコメント
アックン(=^・^=)さん

>ONnojiさん、こんばんは。ツッコミではありません。
>#文字位置は未定義値を返さないってば。

#文字位置は ゼロか正の整数を返すとヘルプに書いてありますが???

外していたらすいません。?^^?
24993 Re:フラグをリセットする必要がありました ONnoji 2004/02/20-21:02
記事番号24991へのコメント
ONnojiさん

>フラグのリセットは[txt支払額]の[フォーカス取得]イベントで、
>
>txt支払額 = 0
>
>とすれば良いと思います。

コピペを間違えました。

× txt支払額 = 0
○ &m支払額focus = 0

と訂正いたします。

24994 Re:ダメ元 しぼうかん 2004/02/20-21:21
記事番号24990へのコメント

>手続き定義開始 t仕入額::入力前(参照 文字列 &編集文字列)
>オブジェクト操作 @仕入額.タブストップ = "1"
>手続き定義終了
>
>手続き定義開始 t支払額::入力前(参照 文字列 &編集文字列)
>オブジェクト操作 @仕入額.タブストップ = "1"
>手続き定義終了
>
>手続き定義開始 t日::入力前(参照 文字列 &編集文字列)
>オブジェクト操作 @仕入額.タブストップ = "1"
>手続き定義終了

これは必要無かったかも?
24995 マトレス 悲しげ 2004/02/20-23:39
記事番号24983へのコメント
皆さん、色々とありがとうございます。<(_ _)>

結論としては、Maoさんとアックン君が云われた
 「入力後」イベントにて、t仕入額のフォーカスの設定禁止の方式を使わせていただこうと思います。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 t摘要::入力後(参照 文字列 &編集文字列,・・・・
 if(#文字位置(&編集文字列,"支払")>0)
  オブジェクト操作 @t仕入額.フォーカスの設定="禁止"
 else
  オブジェクト操作 @t仕入額.フォーカスの設定="自動"
 end
手続き定義終了

手続き定義開始 fm仕入額以外::フォーカス取得(文字列 &喪失オブジェクト名)
 オブジェクト操作 @t仕入額.フォーカスの設定="自動"
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
フォーカス禁止解除には、試みに仕入額以外をファミリオブジェクトにして、そのフォーカス取得でもって扱ってみました。
これで期待どおりの挙動は得られています。



ONnojiさんが書かれたことは、すいません、後でプリントして時間をかけて検討させていただくことにします。(^^;)



しぼうかんさんの書かれた「タブストップ」の操作は、実は私は一度も使ったことがなかったりしますので、
後刻あらためてテストさせていただこうと思います。


24996 キーによる制御 尾形 2004/02/21-07:50
記事番号24995へのコメント
どうも、こんらちは

キーダウンイベントで&仮想キーコード を別の固有変数に確保しておいて

手続き定義開始 t摘要::ソース値更新()
/*リターンでのみ自動フォーカス制御*/
 cond(#文字位置([摘要],"支払")>0 .AND &キー=13)\
  method @t支払額.フォーカス設定()
手続き定義終了

こんな感じでどうですかね



24997 Re:項目値如何で次のフォーカスを指定するに際して アックン(=^・^=) 2004/02/21-08:53
記事番号24992へのコメント
ONnojiさん、おはようございます。
ぼくの勘違いでした。ごめんなさい。m(__)m
ところで。他に手がないときは、タイマーイベントを駆使するだろうなと思ってました。
ONnojiさんやっぱりやった。(^^)
24999 Re:項目値如何で次のフォーカスを指定するに際して ONnoji 2004/02/21-10:43
記事番号24997へのコメント
>ONnojiさん、おはようございます。
>ぼくの勘違いでした。

アックンさん、こんにちは。

了解しました。(^^v

>ところで。他に手がないときは、タイマーイベントを駆使するだろうなと思ってました。

[ソース値更新]は簡単で便利ですが、強力過ぎて困ることがありますね。

[フォーカス設定]メソッドが実行できるイベントが限られるので、
タイマーを利用しようと思ったのですが、内容が複雑に見えるかもしれませんね。
仕掛けは単純なのですが…

タイマーの他にも、いろいろと方法があるわけですから、
ケースバイケースで考えれば良いのではないかと思います。


25002 Re:キーによる制御 悲しげ 2004/02/21-13:05
記事番号24996へのコメント
どもっ、尾形さん
なるほど、ソース値更新とキーダウンの組合せと云う点では私の#24983と
大体同じながら、発想がその裏って感じですね。確かにこの方がシンプルですよね。



以下は全くの余談。

>どうも、こんらちは

このご挨拶には一瞬とまどうものがありましたが(^^;)、それはさておき、
キーの位置からして、どうしたらこのようなタイプミスが発生したのか?
にちょっとだけ興味が湧きました。(^^;)

25004 Re:キーによる制御 原山 正洋 2004/02/21-14:58
記事番号25002へのコメント
>どうも、こんらちは

かな入力では、「に」と「ら」はお隣さんです。

25005 Re:こんらちは(余談) 悲しげ 2004/02/21-15:52
記事番号25004へのコメント
どもっ、原山 正洋さん、こんらちは (^^;)

>かな入力では、「に」と「ら」はお隣さんです。

あ、そうですね。何だか私、考えすぎておりまして・・・・・、と
余談であまり延ばす訳には行かないので、これまでとします。(^^;)

25022 Re:こんらちは(余談) 尾形 2004/02/23-07:10
記事番号25005へのコメント
変な深読みしないでくださいね (^^;

>かな入力では、「に」と「ら」はお隣さんです。
これですよ (^^)

戻る