過去の桐井戸端BBS (桐ver.8)
15926 フォーム日付入力を数字キーと→キーのみで行いたい HERB 2002/05/09-15:23
フォーム日付用入力テキストオブジェクト、画面上では以下ののように表示。

2002/05/10

テキストオブジェクトは年、月、日にわけ、「/」は年、月と月、日の間にラベルオブジェクトとする。

年は4桁、月、日は2桁0詰めとし、フォームを開いた時に当日の日付を表示させ、上書き訂正モード開く。

&年=#文字列(#数値(#年(#日時値)),4)
&月=#文字列(#数値(#月(#日時値)),2)
&日=#文字列(#数値(#日(#日時値)),2)

フォームを開いた時には年の4桁目にカーソルがあります、
当日以外の日付を指定する時に年の場合、上書き入力で訂正したあと
エンターキーを押せば月のテキストオブジェクトに移動します。

質問は、年は変更せず、→キーで年の1桁目から4桁目にカーソルが移動した時点で、
月のテキストオブジェクトに移動させる方法はないか、
日のみ変更したい時は同じように月の1桁目にカーソルが
移動したら日のテキストオブジェクトに移動する。

こんな面倒なことをしなくとも日付オブジェクトでも出来る方法でも結構です、
日付オブジェクトを上書き訂正モードで開いた場合、
当然ながら「/」も入力しないとエラーとなり、出来れば矢印キーと
数字キーのみで入力したいのです、
また、あり得ない日付を入力したときケース開始コマンドで比較する前に
桐のエラーがでて、イベントが止まってしまわないか、その回避方法など。

よろしくお願いします。
15927 Re:フォーム日付入力を数字キーと→キーのみで行う ONnoji 2002/05/09-16:25
記事番号15926へのコメント
HERBさん、こんにちは。

試したところ、次のようなイベントで出来そうです。(^^v(半角カタカナは全角になっています。)
なお、例では最初から左矢印キーを押されたときなど細かい部分は対処していません。
すこしif文を増やせば対処可能と思います。

外していたら、すいません。

-------------------------------------
名札 メイン
 変数宣言 文字列{ &year, &month, &day }
 変数宣言 整数 { &mLength, &mPos }
 &year = #文字列(#数値(#年(#日時値)),4)
 &month = #文字列(#数値(#月(#日時値)),2)
 &day = #文字列(#数値(#日(#日時値)),2)
 *

手続き定義開始 txtYear::入力前(参照 文字列 &編集文字列)

 &mLength = #文字数( &編集文字列 )
 &mPos = &mLength

 オブジェクト操作 @フォーム.キーダウン = "1"

手続き定義終了

手続き定義開始 フォーム::キーダウン(長整数 &仮想キーコード,長整数 &スキ
ャンコード,長整数 &フラグ,参照 長整数 &処理中止)

 メソッド呼び出し @フォーム.変数変更()

 if ( &仮想キーコード = 39 ) /* [→]キー */
  &mPos = &mPos - 1
 end

 if ( &仮想キーコード = 37 ) /* [←]キー */
  &mPos = &mPos + 1
 end

 if ( &mPos = 0 )
  オブジェクト操作 @フォーム.キーダウン = "0"
  メソッド呼び出し @txtMonth.フォーカス設定( )
 end

手続き定義終了
-------------------------------------
15928 余計なコマンド(メソッド)がありました。 ONnoji 2002/05/09-16:36
記事番号15927へのコメント
HERBさん、こんにちは。ONnojiです。

余計なコマンド(メソッド)がありました。

>手続き定義開始 フォーム::キーダウン(
>  :
> メソッド呼び出し @フォーム.変数変更() ←これは不要
>  :
>手続き定義終了

メソッド呼び出し @フォーム.変数変更()は不要でした。
これは&仮想キーコードの値を別の変数へ代入して、
テキストボックスで仮想キーコードの値を表示するために使っていたものです。

何度も見なおして投稿しているのですが、いつもどおり訂正投稿です。m(__)m
15929 今度は大丈夫???、三度目のナントかです。 ONnoji 2002/05/09-17:09
記事番号15928へのコメント
HERBさん、こんにちは。ONnojiです。

例えばESCキーをいきなり押されてしまうとかありますね。
やっぱり、[入力後]イベントでフォーム::キーダウンを停止する必要がありました。(^^ゞ

今度は大丈夫???、三度目のナントかです。
アレ?上下矢印キーとかhome/endキーとかもありましたよね。
すいません、左右矢印キーのみということで…m(__)m

--------------------------------------
名札 メイン
 変数宣言 文字列{ &year, &month, &day }
 変数宣言 整数{ &mLength, &mPos }
 &year=#文字列(#数値(#年(#日時値)),4)
 &month=#文字列(#数値(#月(#日時値)),2)
 &day=#文字列(#数値(#日(#日時値)),2)
 *

手続き定義開始 txtYear::入力前(参照 文字列 &編集文字列)
 &mLength = #文字数( &編集文字列 )
 &mPos = &mLength
 オブジェクト操作 @フォーム.キーダウン = "1"
手続き定義終了

手続き定義開始 txtYear::入力後(…省略…)
 オブジェクト操作 @フォーム.キーダウン = "0"
手続き定義終了

手続き定義開始 フォーム::キーダウン(…省略…)

 if ( &仮想キーコード = 39 )
  &mPos = &mPos - 1 /* [→]キー */
 end

 if ( &仮想キーコード = 37 .and &mPos < &mLength )
  &mPos = &mPos + 1 /* [←]キー */
 end

 if ( &mPos = 0 )
  メソッド呼び出し @txtMonth.フォーカス設定()
 end

手続き定義終了
15931 Re:何度も見直しありがとうございます HERB 2002/05/10-12:28
記事番号15929へのコメント
ONnojiさんHERBです。

早速試してみました、→キーで移動できることを確認しました。

ただ、フォームを開いたときに上書き訂正モードで表示したく、以下、イベントのようにメゾット呼び出ししたところエラーとなってしまいました。

手続き定義開始 txtYear::入力前(参照 文字列 &編集文字列)
&mLength = #文字数( &編集文字列 )
&mPos = &mLength
メソッド呼び出し @訂正.実行()
オブジェクト操作 @フォーム.キーダウン = "1"
手続き定義終了

訂正コマンドボタンを非表示で、機能名を訂正としています、上書きモード訂正状態だと→キーでは移動も出来ませんでした、
出来れば上書き訂正モードでも各テキストオブジェクトに→キーで移動したいのです。

よろしくお願いします。
15932 Re:何度も見直しありがとうございます ONnoji 2002/05/10-14:00
記事番号15931へのコメント
>ただ、フォームを開いたときに上書き訂正モードで表示したく、
>訂正コマンドボタンを非表示で、機能名を訂正としています、

HERBさん、こんにちは。

<フォームを開いたときに訂正状態>
フォームの属性の[オプション]タブで、[開始時]の[▼]をクリックして、一覧から[訂正]ボタンを選んでください。

そうすると、フォームが開いたときに、このボタンを自動的に実行してくれます。

<上書きモード>
なお、上書きモードの設定はコマンドボタンでは出来ないようなので(?)、
それぞれのテキストボックスの属性の[編集]タブで、
[挿入モード]で "上書き" を選べばいいとおもいます。

>以下、イベントのようにメゾット呼び出ししたところエラーとなってしまいました。
>手続き定義開始 txtYear::入力前(参照 文字列 &編集文字列)
> &mLength = #文字数( &編集文字列 )
> &mPos = &mLength
> メソッド呼び出し @訂正.実行()
> オブジェクト操作 @フォーム.キーダウン = "1"
>手続き定義終了

<メソッド呼び出し @訂正.実行()は不要です>
エラーメッセージの内容が不明です…(当方ではエラーしませんでしたが??)
もっとも、入力前イベントが実行されるというのは訂正の場合などですから、
「メソッド呼び出し @訂正.実行()」は全く必要ないとおもいます。

>上書きモード訂正状態だと→キーでは移動も出来ませんでした、
>出来れば上書き訂正モードでも各テキストオブジェクトに→キーで移動したいのです。

<デバッグする>
さて???、上書きモードでもフォーム::キーダウンは動くと思いますが???
なぜでしょうか??(@_@)

やはり、イベントが動いているか確かめる必要がありそうですね。
そうすれば、確実です。

数値型の変数を用意して、[テキストボックス]の[ソース]に指定してから、
[フォーム::キーダウン]イベントでどんな値が返ってきているか調べてみてください。

なお、数値型の変数の値を最新状態にするために以下の2つのコマンドを追加してください。

手続き定義開始 フォーム::キーダウン(…省略…)

 &数値型変数 = &仮想キーコード     ← 追加
 メソッド呼び出し @フォーム.変数変更() ←追加

 if ( &仮想キーコード = 39 )
  &mPos = &mPos - 1
 end

 if ( &仮想キーコード = 37 .and &mPos < &mLength )
  &mPos = &mPos + 1
 end

 if ( &mPos = 0 )
  メソッド呼び出し @txtMonth.フォーカス設定()
 end

手続き定義終了

<追伸>
お好みなのでナントも申し上げられませんが。(^^ゞ

矢印キーで移動は魅力的ですが、
[Tab]、[Enter]、SHift + [→] や Ctrl + [→] で十分ではないかと思いますけれど…
水をさすようで、すいません。m(__)m

戻る