過去の桐井戸端BBS (桐ver.9)
25003 「ソース値更新」イベントで[Ctrl]+[←]等を使って元に戻ろうとしたときもイベントが発生してしまう。 悲しげ 2004/02/21-13:31
No.24983からのツリーと似たような案件なのですが、ちょうどよい機会なので、こちらもお知恵を拝借させて下さい。

日付入力用のフォームがあります。カードでして
テキストオブジェクト名とそのソースは次のとおりとします。
  t年  &年1
  t月  &月1
  t日  &日1
任意の時点でボタンをクリックして確定orキャンセルさせることも可能としていますが、
最終オブジェクトたるt日まで入力した時点で
  「○年○月○日でよろしいですか」
のメッセージを出して、確定の可否を問うてから次の段階に進めるようにもしています。
で、この際に、これまた「ソース値更新」イベントを利用しています(次例)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
名札 メイン
 var 固有,長整数{&年1=&年,&月1=&月,&日1=&日}



手続き定義開始 t日::ソース値更新()
 確認 \
  #str(&年1)+"年"+#str(&月1)+"月"+#str(&日1)+"日でよろしいですか?"\
  ,&実行リターン
 ・・・・・・
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
普通はこれでトントンと進むのですが、これまた値を訂正しようとして
例えば[Ctrl]+[←]やマウスで戻ろうとした時点で、「ソース値更新」イベントの確認メッセージが出てしまって、
悲しげな思いをすることになります。
あ、これは「入力後」イベントでも基本的には同じことです。
で、対策としてはこれまた「キーダウン」イベントの[Enter]とか[Ctrl]キーと組合わせる方法とかも考えられますが、
さて他にどのような方法があるでしょう?


25006 Re:「ソース値更新」と[Ctrl]+[←]等 アックン(=^・^=) 2004/02/21-16:26
記事番号25003へのコメント
悲しげさん>
その処理は極めてDOS桐的で、Windowsのユーザインターフェイスだと、
確定させる(キャンセルさせる)ボタンを付けるのがいいと思いますです。
Ctrl+矢印キーまたはマウスで他項目に戻って値を訂正したとして、それじゃ今度はどの時点で
確認コマンドなりメッセージコマンドを出して確定させるか(あるいはキャンセルさせるか)が問題になってきます。
さらに他の項目に移ったら、と考えると、うーん、インターフェイス変えた方がいいんじゃないかと思うんだけど。

25007 Re:「ソース値更新」と[Ctrl]+[←]等 悲しげ 2004/02/21-17:43
記事番号25006へのコメント
どもっ、アックン君

>その処理は極めてDOS桐的で、Windowsのユーザインターフェイスだと、
>確定させる(キャンセルさせる)ボタンを付けるのがいいと思います

説明不足でしたね。(^^;)
え〜と、#25003で書いたように

>任意の時点でボタンをクリックして確定orキャンセルさせることも可能
>としていますが、

確定とキャンセルのボタンはあるのです。で、初期値も本日の値がセットされているので、
多くはそのまんま確定ボタンを押すことで済みます。
で、たまに日付を初期入力済値から変更する場合に、年・月・日の値を上書き訂正入力するのですが
(訂正不要な場合は[Enter]空打ちで次々と進ませることが多い)、そして訂正する場合でもせいぜい最後の日の値を
訂正するだけってことが多いのですが、タンタンと[Enter]キーで進んで最後も[Enter]キーで仕上げるようにしています。
つまり、最初でも途中でも任意の時点においてボタンで確定させるのと、
個々の値を入力([Enter])と2系統を用意している訳です。
が、まれに[Enter]空打ちし過ぎて、つまり行き過ぎてしまって戻って
値を訂正する必要が出た時──例えば、月の変わり目辺りで、いつもの癖で
日のところまで[Enter]キーで進めてしまったので、月のところに戻って
訂正入力したい場合など──に今回のようなことが起こる訳です。

ちなみにメッセージの出し方は、ちょっと省略して書いてしまいましたが、
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 t日::ソース値更新()
 call 確定()
手続き定義終了

proc 確定()  /*確定ボタンの手続き実行と兼用*/
 確認 \
  #str(&年1)+"年"+#str(&月1)+"月"+#str(&日1)+"日でよろしいですか?"\
  ,&実行リターン
 ・・・・・・
end
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
のようにしています。
細かく云うとキリがないので省略してますが、実は「キーダウン」イベントの[F4]キーでも確定ボタン押下と同じことをさせてます。
さらに細かく云えば、例示したのは年月日の3要素ですが、
他にも期始年月日〜期末年月日+αと7要素もあるようなケースもあって、
こんな時は[Enter]をタンタンタンタンタンタヌキ・・・と行き過ぎてしまう方が多かったりしまして、
その都度[Ctrl]+[←]とかマウスで戻ることになる訳です。(^^;)

で、いずれにせよ、最後の項目から戻る時には「ソース値更新」
(または「入力後」)イベントは出て欲しくないので、と云うのが質問の本旨です。

25008 Re:「ソース値更新」と[Ctrl]+[←]等 アックン(=^・^=) 2004/02/21-17:59
記事番号25007へのコメント
悲しげさん>
あじゃ。ぼくの読み不足でした。以下、またまた解答にならなくてすみません。

>つまり、最初でも途中でも任意の時点においてボタンで確定させるのと、
>個々の値を入力([Enter])と2系統を用意している訳です。
 ぼくだったら、Enterでメッセージ出さにゃい。ボタンにフォーカス移すだけにします。
ボタンだけで確定・キャンセルさせるようにしますけど。
それがごく一般的なWindowsのユーザインタフェイスだと思うんです。
DOSの操作性を混在させるから、ややこしくなるわけであります。
って、おいらもやってるんだけど。(^^;
質問主旨に戻って、ではどうすっかということになると、・・・・・・どうすんでしょうね。<(^^;?

25012 Re:「ソース値更新」と[Ctrl]+[←]等 アックン 2004/02/21-21:36
記事番号25007へのコメント
悲しげさん> 桐を今試せないから、めちゃはずしている公算大ですが。(^^;
[日]のソース値更新をやめて、[日]の次にフォーカスするオブジェクト(なければダミーオブジェクト)で、
確認コマンドなりメッセージコマンドを出してみたらどうなるかなと、当初より思っているんですが(試してないちゃん)。

ダミーオブジェクトのフォーカス取得イベントで、&喪失オブジェクトが t日 であれば、そのイベントでメッセージ出すか
(この時点で出せるのかなっと)、あるいはフラグ立てておいて、入力前イベントあたりでメッセージを出すとか(出せるのかなっと)。

ともかく、[日]をソースとするオブジェクトでメッセージを出そうとしたら、うまくいかないと思うんです。
そこで、Enterで素直に次のオブジェクトにいったん移して、そこでどのオブジェクトから移行してきたかを判断して、
メッセージ出すか出さないか処理するというわけですが・・・・(論理的に破綻していたらスマソ)。

もしこれでうまくいくようなら、ダミーオブジェクトを意識しない細工をしてやればいいわけですが・・・・
(そんなにうまくいかないのが世の常、桐の常でしてね)。

25013 Re:「ソース値更新」と[Ctrl]+[←]等 悲しげ 2004/02/21-23:01
記事番号25008へのコメント
アックン(=^・^=)君、wrote

>ボタンだけで確定・キャンセルさせるようにしますけど。
>それがごく一般的なWindowsのユーザインタフェイスだと思うんです。
>DOSの操作性を混在させるから、ややこしくなるわけであります。

云えてます。で、実は確定・キャンセルをボタンだけにして試したこともあるんですよ〜(特に人に使ってもらう場合)。
でも、やはり[Enter]でタンタンタヌキ併用の便利さも忘れがたく……。(^^;)

現時点でひとつ思い付いている方法はあります。
行き詰まったらともかく「キーダウン」イベント頼みとしがちな私としては、
#24996で尾形さんが仰っているように「キーダウン」イベントで
&キー=&仮想キーコード として別変数にキープしておいた上で「ソース
値更新」では &キー=13(つまり[Enter]押下)時のみで判断させるとか。
だから、これ以外のやり方を覚えたいっつー希望があったりします。(^^;)

あと、実はもうひとつ悲しげな挙動があります。
確定ボタン押下または最終テキスト(t日)での[Enter]のどちらでも
確認のメッセージが出るのだから、実はt日にフォーカスが在る状態で確定ボタンを押下したら、
確認メッセージが2連発で出ると云う。(^^;)
これは実行制御用のフラグ変数をひとつ噛ませる等で対処しようとは思っています
(未着手ですが、上述の &キー=13 を兼用できるかも)。


25014 デフォルト入力できる項目は 佐田 守弘 2004/02/21-23:30
記事番号25007へのコメント
悲しげさん
充分に理解できてない部分もあるのですが、何と無くアックンさんが書いておられる様に
インタフェースを考え直した方が良さそうな気もしないではないですね。
いみじくも、「その処理は極めてDOS桐的で」と言っておられますが、私もMS-DOS桐時代には、
メニュー2を使って入力データの確認を行なう方法の様な感触を受けました。

もちろんこれが悪いという事ではないのですが、MS-DOS版桐の場合には、
ステップバイステップで入力して行くことが多く、後戻りできない形で作るケースもあったので、
最後に入力データの確認が必須でした。

今の桐でのフォーム編集なら、データの一覧性があるので、確認は不要なのではないかと思います。
私は最近では入力データの確認を出すことはほとんどありません。
でも、レセプトの入力の様に入力項目が多く、しかも誤入力を避けなければならないとすると、
やはり必要なのかどうか。細かい点は解りません。

似た様なものを私が作るとしたら、多分次の様にするでしょう。

●デフォルト設定できる項目
まず議論のポイントとなっている日付の入力ですが、ほとんどがデフォルト値(本日値)で済む様ですね。
私だったら、大半ないしほとんどがデフォルトで済む場合には、その項目にはフォーカスさせません。
つまり、Enterキーをポンポンと押す操作さえパスして、「日付はこれで良いよね。」スタイルにしてしまいます。

しかし実際には以前のデータを入力する必要もありますから、その様な場合には、
マウス操作などで日付の項目に戻って、訂正を行います。
そして日付の訂正をしたら、以降同じ日付の入力が続くであろうと考えて、(そうでない
場合もあるけど)デフォルト値を最後に入力した日付に変更します。
このあたりは入力のしやすさで決めればよいのですが、1つの方法として、
日付のデフォルト値は、起動時には当日日付、以降は直前入力の日付にセットするわけです。

●レコードデータの確定
これも私はその様にする事が多いのですが、日付をプリセットした段階で、
一度表示モードに戻してレコ−ドデータを確定してしまいます。これはそれ以降に多量のデータを入力する事を想定し、
誤って行入力を取り消してしまう事のない様にするためです。

上記の方法と組み合わせて、次の様なインタフェースが考えられますし、
案外と悲しげさんの目的に合っているかも知れません。
つまり、フォーム開始時あるいは新規行の追加操作が行われた段階で、
メッセージボックスを使って、日付の確認を求めます(この段階ではまだ行挿入状態です)。
OKなら一度表示に戻して行を確定し、再び行訂正に入って、編集を続けます。
NOなら、日付のテキストボックスにフォーカスを移して、日付の訂正を行なわせてます。
おそらくこの段階で入力をしない時には、ESCないし中止操作のボタンで行挿入を
取り消させる事もできるかと思います。

●日付の入力
私の場合、日付は日時値型のまま入力や訂正をしています。編集操作自体は、
年月日に分けた方が楽は楽なのですが、面倒なのでやっておりません。
その代りに、日付項目には、日付変更のボタンを用意して、1日ないし5日ずつ日付を前後させる様にしています。
これは5日でなくて7日でも構わないでしょう。
マウス操作は伴いますけど、それ程の面倒さは感じてません。
必要なら、アクセスキーを設定して、キー操作だけですませることもできます。

佐田守弘(KS-00119)
25016 Re:デフォルト入力できる項目は 悲しげ 2004/02/22-01:47
記事番号25014へのコメント
どもっ、佐田さん

入力済みデータの確認の要・不要については、確かに不要かもしれませんが、
とりあえずは必要であるとの前提で話を進めさせていただきます。

>●デフォルト設定できる項目
>まず議論のポイントとなっている日付の入力ですが、ほとんどがデフォルト値(本日値)
>で済む様ですね。
>私だったら、大半ないしほとんどがデフォルトで済む場合には、その項目にはフォーカス
>させません。つまり、Enterキーをポンポンと押す操作さえパスして、「日付はこれで
>良いよね。」スタイルにしてしまいます。

初期フォーカス位置は異なるにせよ、基本的にそのようなスタイルにしています。
つまり多くの場合、初っぱなから確定ボタン押下(または某キー押下で全確定)も可能としています。

>しかし実際には以前のデータを入力する必要もありますから、その様な場合には、
>マウス操作などで日付の項目に戻って、訂正を行います。

ここで、マウスを使うこともできますが、基本的にマウスを使わないでキー入力だけで
タンタンと進めることができるようにしています。
いちいちマウスに持ちかえなくてもいいようにと云うことで。で、そのキー操作のまま最後のテキストまで行けて、
確定まで出来ちゃうと云う便利さは捨て難いものがあったりします。
勿論キーボードから手を離してマウスに持ちかえての確定もできますが。(^^;)

>そして日付の訂正をしたら、以降同じ日付の入力が続くであろうと考えて、(そうでない
>場合もあるけど)デフォルト値を最後に入力した日付に変更します。
>このあたりは入力のしやすさで決めればよいのですが、1つの方法として、日付の
>デフォルト値は、起動時には当日日付、以降は直前入力の日付にセットするわけです。

この点も全くそのようにしています。

>●レコードデータの確定

本件は編集対象表を持たず、変数をテキストソースとするカードwfmです。
実は日付取得専用として汎用的に呼び出すフォームでもあります。

>●日付の入力
>私の場合、日付は日時値型のまま入力や訂正をしています。編集操作自体は、年月日
>に分けた方が楽は楽なのですが、面倒なのでやっておりません。

日時型にすると、作るのは簡単なのですが、入力が少し面倒になるので(他の人が使う想定で)
ここは年・月・日への分割入力にこだわっています。
場合により始年月日+末年月日+αの7項目を扱います(項目とは云っても表ではないけど)。
これだけあると日付チェック・再確認が必要な機会もそれなりには発生したような気がします。

と云う訳で・・・・(^^;)
とりあえずは、確認メッセージを出すとした場合、最終テキストから前テキストオブジェクトに戻る時の扱いで頭をひねっているところです。

25019 Re:「ソース値更新」と[Ctrl]+[←]等 アックン 2004/02/22-22:18
記事番号25013へのコメント
悲しげさん> 今夜も珍しく自宅からアクセスしてます。相変わらず桐で試せないの
で、すいません。

>でも、やはり[Enter]でタンタンタヌキ併用の便利さも忘れがたく……。(^^;)
 ええ、ええ。充分承知しております。使い慣れたインタフェースがいいですもんね。

>&キー=&仮想キーコード として別変数にキープしておいた上で「ソース
>値更新」では &キー=13(つまり[Enter]押下)時のみで判断させるとか。
 うーみゅみゅ・・・おそらくそれは通用しないんじゃないでしょうか。
入力後イベントの段階でも通用しないですから、ましてやソース値更新イベントとなるとなおさらかと。
Ctrl+矢印キーまたはマウスで直にフォーカス移動すると、ソース値が更新されたことになりますから
(←この点が今回の動きを理解する上で大切だと思いまふ〜)、判断して
メッセージを出す出さないというレベルではなくなっていて、どうしてもメッセージが出ちゃう。(^^;

それで、ぼくが昨夜提案したのは、[日]オブジェクト内のイベントでメッセージを出すのをあきらめて、
[日]の次にフォーカスさせたオブジェクトのイベントでメッセージを出す判断をしてはどうだろうかと。
そうすれば、[日]オブジェクト上で、Ctrl+矢印キーまたはマウスで直にフォーカス移動しても、何ら影響がないわけですし。

ともかく、試してみる方が早いですね。で、ぼくは明日は時間とれないかもしれないんで、のんびりやってちょーらいねっと。(^^;

25020 Re:デフォルト入力できる項目は アックン 2004/02/22-23:03
記事番号25014へのコメント
佐田さん> こんばんは。

>その代りに、日付項目には、日付変更のボタンを用意して、1日ないし5日ずつ日付
>を前後させる様にしています。これは5日でなくて7日でも構わないでしょう。

こういう発想はぼくにはなかったです。さっそく近いうちに使わせていただきます。m(__)m
現状では紙の伝票を入力する際、日付(日時型)が前後していて、テンキー入力がけっこう面倒なんです。
(オプションで初期値を本日日付または空欄のどちらかを選べるようにしてます。)
日付の前後○日移動の動作は、キーで変更できるようにしてみます。
(どうやるかは明日以降考えてみます。)
これは便利に使えそうです。ありがとうございます。

以下、余談です。
桐でアプリケーションソフトを作るときは、入力まわりのプログラミングに最も力を多く注ぐ、
ということを、いかすぱさんが以前言ってました。
オペレータがデータを入力するのに時間がかかるんだから、効率よく入力できるインタフェイスを作ることが最も大切だと。
いったんデータを入力しさえすれば、後は桐ならなんとでもできるんだからと。会話処理でもできるんだからと。
この点、佐田さんもDOS時代から、同じ見解をことあるごとにおっしゃってますね。
悲しげさんの今回のテーマも、まさにそれですね。
25021 日付のセット 佐田 守弘 2004/02/23-00:21
記事番号25020へのコメント
アックンさん
>日付の前後○日移動の動作は、キーで変更できるようにしてみます。
>(どうやるかは明日以降考えてみます。)
単純な方法です。単にマウスクリックイベントで、「#日数加算」関数を
使って、日数の加減算をしているだけです。キー操作も使うなら、一般手続きにすれば良いでしょう。

ついでに言うと、[本日]というボタンもあって、これをクリックすると、
本日日付にセットされます。

佐田守弘(KS-00119)

25023 Re:日付のセット アックン(=^・^=) 2004/02/23-07:29
記事番号25021へのコメント
佐田さん、おはようございます。
あ、答え全部教えてもらっちゃった。(^^;
さっそく今日午後からやってみますね。

この時間は店オープンしてます。早いでしょ。

25027 Re:「ソース値更新」と[Ctrl]+[←]等 悲しげ 2004/02/23-13:03
記事番号25019へのコメント
どもっ、アックン君

>>&キー=&仮想キーコード として別変数にキープしておいた上で「ソース
>>値更新」では &キー=13(つまり[Enter]押下)時のみで判断させるとか。
> うーみゅみゅ・・・おそらくそれは通用しないんじゃないでしょうか。
>入力後イベントの段階でも通用しないですから、ましてやソース値更新イ
>ベントとなるとなおさらかと。

試してみましたが、この方法は可能でした。

▼固有か局所変数として長整数 &キー を宣言。

▼「キーダウン」イベントで次のように取得しておく。
    &キー=&仮想キーコード
 (「キーダウン」は「入力後」や「ソース値更新」よりも前なので)

▼「ソース値更新」(または「入力後」)イベントの記述

手続き定義開始 t日1::ソース値更新()
 cond(&キー=13) call 確定()
 &キー=""
手続き定義終了

proc 確定()
 確認 ・・・・・○年○月○日で云々・・・・
 ・・・・
end

つまり、「ソース値更新」(または「入力後」)イベントは通るのだが、
メッセージは出さない([Ctrl]+[←]で戻るときは &キー<>13 だし)。
結構シンプルで済むので、これの方向に傾いてきました。>尾形さん



>[日]の次にフォーカスさせたオブジェクトのイベントでメッセージ

次のオブジェクトを[OK]ボタンにする手もありますね。
でもそうなると、[Enter]2回押下が必要になりますね(1回目の打鍵ではフォーカス移動だけだから)。
別のダミーオブジェクトを設定するのなら、メッセージを出すのは、
う〜ん、「フォーカス取得」イベントだろうか?
あ、それは[OK]ボタンでも同じか?(後で試してみます)。

PS.
「日付の前後○日移動」ボタンも付けようかなぁ。(^^;)

PS2.
今日も猛吹雪です。今朝は戸が開かなかったし、午後からはもっとひどくなって来ました。
こないだの二の舞になるのだろうか?(T_T)
今年は『長い冬』(by Laura Ingalls Wilder) なのか?

25028 Re:「ソース値更新」と[Ctrl]+[←]等 アックン(=^・^=) 2004/02/23-13:30
記事番号25027へのコメント
悲しげさん>
>試してみましたが、この方法は可能でした。
そうだったのですか。じゃ、それがわかりやすくていいですね。

ところで、今のうちに買い出ししておくのがええんとちゃう?
でも、無理しないでくださいね。

25032 すいません、余談です(^^;) 悲しげ 2004/02/23-21:23
記事番号25028へのコメント
どもっ、アックン君

>ところで、今のうちに買い出ししておくのがええんとちゃう?
>でも、無理しないでくださいね。

今回は米の備蓄はあります。(わらひ)
それと吹雪は止んだみたいです。さっき外に出てみたら月が出ていました。
文字どおり冴え冴えと。
今は、一昼夜にして出現した屋根までもある雪の山を前に、途方にくれていたりします。
「トホホホ」とはこの「途方」から来ているのかと実感?

25073 Re:日付のセット 悲しげ 2004/02/24-23:54
記事番号25023へのコメント
ちょっと話題がずれてきていますが、(^^;)
私も試してみました。

日付のソースを日時型変数にして、「本日」「翌日」「前日」等の
ボタンを設けてみました。なるほど、なかなか面白いですね。(^^)v
と云うか、ソースが日時値の単項目だと、値の訂正がかなり面倒なので(痛感)、
このようなボタンでの操作が必要不可欠ではないかと感じました。

戻る