過去の桐井戸端BBS (桐ver.8)
17195 フォームで、ある項目が特定の値のときだけ訂正を許可するようにしたい pokopon 2002/09/04-16:45
今日は質問モードです。桐V8SP6。

フォーム、「入力.wfm」があり、カード形式で作成しています。
そこに、複数のテキストボックスがあり、それぞれに表の項目がソースとして設定されています。

例えば、tDATA1 というオブジェクトには、[DATA1]というソース(整数)です。

さて、この項目の値が「2〜5」の時だけに、このテキストボックスにおいて、
データを訂正できるようにさせたいと思っています。
これ以外の値の場合には、「訂正できません」なんてメッセージを表示し、
訂正モードに入れないように制御したいと言うことです。

このテキストボックスが多くあるので、ファミリで対応したいと思うのですが、
良い方法、アイディア等はないでしょうか?

17197 Re:特定の値のときだけ訂正を許可する方法 ONnoji 2002/09/04-17:57
記事番号17195へのコメント
pokoponさん、こんにちは。

詳しく試していませんが、

まず、テキストボックスを上下二重ににして、上のテキストが本物、下のテキストはうそ物にして、
フォーカス取得などで上のテキストの幅を狭くして、下のテキストが見えるようにする。
で、フォーカス喪失とかで、上のテキストの幅をもとにもどす。
なんて考えてみましたが…面倒そうですね。(^^ゞ

17201 Re:特定の値のときだけ訂正を許可する方法 【多遊】 2002/09/04-20:23
記事番号17195へのコメント
pokoponさん

>例えば、tDATA1 というオブジェクトには、[DATA1]というソース(整数)です。
>さて、この項目の値が「2〜5」の時だけに、このテキストボックスにおいて、デ
>ータを訂正できるようにさせたいと思っています。
>これ以外の値の場合には、「訂正できません」なんてメッセージを表示し、訂正モ
>ードに入れないように制御したいと言うことです。

先日はどうもお世話様でした。こんなのはいかがですか
マウス左ダウンに
 メソッド呼び出し &this.ソース値取得(&変数,0)
 if(&変数<2 .or &変数>5)
   メソッド呼び出し @フォーム.更新モード設定( 0 )
   メッセージボックス・・・・・・
 end
手続き定義終了

なんかいけそうですが。試しておりません。
17202 オブジェクトが多くて・・・・ pokopon 2002/09/04-20:38
記事番号17197へのコメント
ONnojiさん こんばんは
早速、有難うございます。

>まず、テキストボックスを上下二重ににして、上のテキストが本物、
>下のテキストはうそ物にして、

ダミー方式ですね。実は、項目数(テキストボックスの数)が非常に多くて、なおかつ、
場合により、この制限のテキストボックスを変更しなければならないのです。

ですから、ファミリにこだわっております。
テキストの2重重ね、結局、その数分だけ準備する事になりますよね。
う〜む。 (^_^;)


17203 @フォーム.更新モード設定(0)が無効です pokopon 2002/09/04-21:00
記事番号17201へのコメント
【多遊】さん こんばんは
早速、有難うございます。

>マウス左ダウンに
> メソッド呼び出し &this.ソース値取得(&変数,0)
> if(&変数<2 .or &変数>5)
>   メソッド呼び出し @フォーム.更新モード設定( 0 )
>   メッセージボックス・・・・・・
> end
>手続き定義終了

マウスクリックイベント、改め、マウス左ダウンイベントですね。(^o^)丿

ところが、「項目訂正モード」での実行時には、
@フォーム.更新モード設定( 0 )
は無効となります。

すなわち、マウスをダブルクリックして訂正したい場合(いわゆる項目訂正モード)は、
そのまま更新モード(0)は実行されても、再び項目訂正モードになるようです。

マウス左ダウン → 項目訂正モードが予約?されている
なので、
更新モード設定(2)によって、訂正モードには変更できるが、
更新モード設定(0)では表示モードにできない。
(正確に言うと、一旦表示モードにはなるけど、再び項目訂正モードになります)

また、この手法では、カーソルが当たっている状態での「スペースキー」&「実際の訂正キー」での制御はできません。

困った!! (T_T)


17204 Re:特定の値のときだけ訂正を許可する方法 悲しげ 2002/09/04-21:28
記事番号17195へのコメント
どもっ、pokoさん
拙作の某「大作」の中に次のような記述がありました。
全然参考にならんかも知れませんが、もしかしたら参考になるかも知れないので、挙げてみました。
fm*はファミリを示しています。この時に、「2と5」云々の条件を付加したり、別途msgboxを出したりしてもいいのかな?
--------------------------------------
手続き定義開始 fmクリック::フォーカス取得(文字列 &喪失オブジェクト名)
 ・・・・・・・
 if((&this="t品単位" .or &this="tKcode" .or &this="t一般名") .and &行挿入F=0)
  method @フォーム.更新モード設定(0)
  オブジェクト操作 @フォーム.行訂正="0"
 end
手続き定義終了

手続き定義開始 fmクリック::フォーカス喪失(文字列 &取得オブジェクト名)
 ・・・・・・・
 if(&this="t品単位" .or &this="tKcode" .or &this="t一般名")
  オブジェクト操作 @フォーム.行訂正="1"
 end
手続き定義終了
--------------------------------------
何をやっているのか、その詳細は実は覚えていませんが(^^;)、訳あって、
別途「キーダウン」イベントで<F2>キーを殺してるみたいです。
つまり、訂正は<Space>とマウス左クリックによる単項目訂正だけ。
繰り返しますが、この時の考えは忘却の彼方に存在しています。(^^;)

17205 @フォーム.行訂正="0"は使えそう pokopon 2002/09/04-22:05
記事番号17204へのコメント
悲しげさん どうも

>  オブジェクト操作 @フォーム.行訂正="0"

おっ、これは使えそうです。 気が付きませんでした。

>この時の考えは忘却の彼方に存在しています。(^^;)

とおっしゃらずに・・・・。

手続き定義開始 Lock::フォーカス取得(文字列 &喪失オブジェクト名)
 変数宣言 自動, 整数{&sorce}
 メソッド呼び出し &this.ソース値取得(&sorce,0)
 if ( &sorce < 2 .or &sorce >5)
  オブジェクト操作 @フォーム.行訂正="0"
  確認 "この値は訂正できません!! へ〜んだ!!"
end
手続き定義終了

手続き定義開始 Lock::フォーム喪失(文字列 &取得オブジェクト名)
 オブジェクト操作 @フォーム.行訂正="1"
手続き定義終了

と、いけます!! (^o^)丿

が・・・・、スペースキー or F・2キー(訂正モード)の場合も、「訂正できません」って、出したいな〜。
また、フォーカスが当たるたびに、確認が出るのも煩わしいし・・・・。
(非常にわがまま!! (^^ゞ )

「本気で訂正しようとした時だけ」メッセージを出したいんですよ。

(メッセージは「必須」です。
クライアントに「何故、訂正モードにならないか」知らせないと、内線電話が鳴りっぱなし…)

17206 こんなイメージです pokopon 2002/09/04-22:26
記事番号17203へのコメント

イメージ的には、こんな感じです。

実際のフォームは、もっともっと多くのテキストボックスが
並んでいますが、これはテスト用です。
マウスのダブルクリック、スペースキー、
F2キー(訂正モード)などで、
本気で「訂正」しようとした時にだけ、
メッセージを出したいのです。

訂正モード(項目訂正モードを含む)に入ろうとするときに発生するイベントとして、
 [行訂正開始]イベント を使おうと考えてもいるのですが、
・ファミリーで使えない
・項目訂正モードの際に、更新モード設定(0)が活きていない
という問題で詰まっています。

ダミーのコマンドボタンに「表示」を仕込んで、それをイベント内で実行させても見ましたが、
どうも手続き内での実行では、やっぱり項目訂正モードになってしまいました。


17209 タイマイベントでは natsu 2002/09/04-23:19
記事番号17195へのコメント
[入力前]イベントでなんとかならなければ
困ったときのタイマイベントで

メソッド呼び出し @フォーム.フォーカスオブジェクト取得( &STR )
メソッド呼び出し @フォーム.更新モード取得( &実行リターン )
ケース開始
 ケース (&STR="tなんとか" .and &実行リターン=8)
  確認 "この値の項目訂正はできません"
  メソッド呼び出し @フォーム.更新モード設定( 0 )
ケース その他
ケース終了

あとは、ケースの入れ子で項目値による対応もできると思います
17210 Re:@フォーム.行訂正="0"は使えそう 悲しげ 2002/09/05-00:42
記事番号17205へのコメント
>が・・・・、スペースキー or F・2キー(訂正モード)の場合も、「訂正できません」って、出したいな〜。

拙作品では、ファミリの名前に「クリック」とか使ってますが、これは
成り行き上の名でして(^^;)、当然ながら<Space>キーの場合には対応しています。
ただ、<F2>キーだけは多分諦めたのだと思います。
   オブジェクト操作 @フォーム.行訂正="0"
を使うには、確か表示モードにしなければならず(?)、<F2>キーによる連続的な訂正では、
挙動がイマイチだったからのようなて……(曖昧模糊)

さりとて「行訂正*」系のイベントで制御することは、非常に難しかったので、
断念した記憶もうっすらとあります。「行訂正*」系イベントは、
単純な処理にしか使えないです(私の場合)。(;_;)

>また、フォーカスが当たるたびに、確認が出るのも煩わしいし・・・・。
>(非常にわがまま!! (^^ゞ )
>「本気で訂正しようとした時だけ」メッセージを出したいんですよ。

上記「フォーカス*」系イベントではmsgを出さずにオブジェクト操作だけにとどめ、
msgは別途「キーダウン」イベントとか※で出したらわ?
例えば<Space>キーを当該objで押した時とか。<F2>キーだけは私のように
絶対的に禁止するとすれば、その訳を懇切丁寧にmsg出すとか。

※項目訂正を目的としたマウス左クリックに対しては、それこそファミリの鼠左栗イベントで
msgさせることも可能です。
上述したファミリの名が「クリック」となった成り行きは、実にこのことと関係あったとか。(^^;)

17211 Re:@フォーム.行訂正="0"は使えそう 悲しげ 2002/09/05-00:59
記事番号17210へのコメント
>また、フォーカスが当たるたびに、確認が出るのも煩わしいし・・・・。

あんまり個々のケースに対応しようとすると、ファミリを使おうとする
当初の趣旨に反してしまいますね。
煩わしいと感じるのは、手前にドドーンと確認msgが出るからからだとも思います。
とすれば、こんな方法はいかが?
上部or下部にラベルorテキストobjを設けます。objの名はそのものズバリ「操作説明」とかにする。
そして、当該にフォーカスが当たる度に、説明の文言を画面に表示させるのです。
それなりに目立って、且つ煩わしくない程度のバランスで。
17212 Re:@フォーム.行訂正="0"は使えそう pokopon 2002/09/05-09:56
記事番号17211へのコメント
>こんな方法はいかが?
>上部or下部にラベルorテキストobjを設けます。objの名はそのものズバ
>リ「操作説明」とかにする。そして、当該にフォーカスが当たる度に、
>説明の文言を画面に表示させるのです。それなりに目立って、且つ煩わ
>しくない程度のバランスで。

これも良いですね。いちいちmsgが出てくるからわずらわしいんですね。

17213 Re:タイマイベントでは pokopon 2002/09/05-09:59
記事番号17209へのコメント
natsuさん こんにちは
>困ったときのタイマイベントで

>メソッド呼び出し @フォーム.フォーカスオブジェクト取得( &STR )
>メソッド呼び出し @フォーム.更新モード取得( &実行リターン )
>ケース開始
> ケース (&STR="tなんとか" .and &実行リターン=8)
>  確認 "この値の項目訂正はできません"
>  メソッド呼び出し @フォーム.更新モード設定( 0 )
> ケース その他
>ケース終了
>あとは、ケースの入れ子で項目値による対応もできると思います

行きつくところ、やっぱ、ここですかね〜。
迂回技ということで。


17216 Re:特定の値のときだけ訂正を許可する方法 原山 正洋 2002/09/06-09:54
記事番号17195へのコメント
pokoponさん 先日はどうも

オブジェクト操作 @tDATA1.フォーカスの設定 = "使用不可表示"

ではいかがですか。
後は、マウスが近くにくれば悲しげさんの「操作説明」で表示

17234 解決できました(自己レス) pokopon 2002/09/09-22:41
記事番号17195へのコメント
自己レスです。

みなさんから色々なご意見をいただき、自分なりに検討した結果、次のような方法で解決いたしました。

まとめとして、

■訂正モード
・訂正モード ・・・・ f2キー押下で得られる訂正モード、連続して訂正できるモード
 手続き内で更新モード設定(0)で表示モードに変更可能
・項目訂正モード ・・・・ カーソルの当たっているテキストボックスだけで有効な訂正モード
 マウスのダブルクリックまたは、スペースキー押下で得られる訂正モード。
 フォーカスの移動、レコードの移動で、自動的に「表示モード」になる。
 その手続き内で更新モード設定(0)で表示モードに変更不可能。
 よって、表示モードにするには、迂回技として、タイマーイベントを使わざるを得なかった。

■数値の検査のタイミング
・やはり行訂正開始イベントで
 ただし、更新モード(2)でフォーカスがあたった時には、一度、表示モードにしてから、
再度訂正モードにして、このイベントを有効にする(訂正モードではイベントの開始は無効のため)。
・レコード移動イベントで
 ただし、更新モード(2)でレコード移動が行われた時には、、一度、表示モードにしてから、
再度訂正モードにして、行訂正開始イベントを再起動する。

という内容で、目的の挙動が得られました。
(行挿入、グループ追加は、もともと想定はしていないので)

■ファミリーとして、
フォーカス取得イベントとフォーカス喪失イベントを設定し、ここで、行訂正イベントとレコード移動イベントを有効にする。
これにより、ファイミリー指定したオブジェクトにフォーカスがあたった時にだけ、
このイベントが有効となり、ファミリー指定が可能となりました。


これで、
行訂正モード、項目訂正モードなど、どちらの訂正モードでも、同様の挙動を得る事ができました。
(項目訂正モードでは、フォーカスやレコードが変われば、自動で表示モードになりますので)

この他にも色々と方法があるのかもしれませんが、一応、解決いたしましたので、ご報告いたします。

いろいろとご助言いただき、有難うございました。 m(__)m

17235 Re:解決できました(自己レス) pokopon 2002/09/09-22:42
記事番号17234へのコメント
イベント例です。

名札  メイン
 オブジェクト操作 @フォーム.レコード移動 = "0"
 オブジェクト操作 @フォーム.行訂正開始  = "0"
 オブジェクト操作 @フォーム.タイマー値1 = "0.01"
 オブジェクト操作 @フォーム.タイマー1  = "0"


手続き定義開始 入力制限::フォーカス取得(文字列 &喪失オブジェクト名)
 変数宣言 自動, 整数{&mode}
 メソッド呼び出し @フォーム.更新モード取得( &mode )
 条件 ( &mode = 2 ) メソッド呼び出し @フォーム.更新モード設定( 0 )
 オブジェクト操作 @フォーム.行訂正開始  = "1"
 オブジェクト操作 @フォーム.レコード移動 = "1"
 条件 ( &mode = 2 ) メソッド呼び出し @フォーム.更新モード設定( 2 )
手続き定義終了

手続き定義開始 入力制限::フォーカス喪失(文字列 &取得オブジェクト名)
 オブジェクト操作 @フォーム.行訂正開始  = "0"
 オブジェクト操作 @フォーム.レコード移動 = "0"
手続き定義終了

手続き定義開始 フォーム::レコード移動(長整数 &行番号,長整数 &総件数,長整数 &明細番号)
 変数宣言 自動,整数{&mode}
 メソッド呼び出し @フォーム.更新モード取得( &mode )
 if ( &mode = 2 )
   メソッド呼び出し @フォーム.更新モード設定( 0 )
   メソッド呼び出し @フォーム.更新モード設定( 2 )
 end
手続き定義終了

手続き定義開始 フォーム::行訂正開始(長整数 &明細番号)
 変数宣言 自動,整数{&Data},文字列{&ObjName}
 メソッド呼び出し @フォーム.フォーカスオブジェクト取得( &ObjName )
 メソッド呼び出し &ObjName.ソース値取得( &Data , 0 )
 if ( &Data >=2 .and &Data <= 5 )
   確認 "訂正できません。"
   オブジェクト操作 @フォーム.タイマー1 = "1" /* 更新モード設定(0)が無効となるので、迂
回技 */
 end
手続き定義終了

手続き定義開始 フォーム::タイマー1()
 変数宣言 自動,整数{&mode}
 メソッド呼び出し @フォーム.更新モード取得( &mode )
 if ( &mode <> 0 )
   メソッド呼び出し @フォーム.更新モード設定( 0 )
   オブジェクト操作 @フォーム.タイマー1 = "0" /* 1度だけ実行後、イベントを終了 */
 end
手続き定義終了


戻る