過去の桐井戸端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へのコメント イメージ的には、こんな感じです。
訂正モード(項目訂正モードを含む)に入ろうとするときに発生するイベントとして、 [行訂正開始]イベント を使おうと考えてもいるのですが、 ・ファミリーで使えない ・項目訂正モードの際に、更新モード設定(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 手続き定義終了 |