過去の桐井戸端BBS (桐ver.9)
30509 メソッド呼び出し「更新モード設定」の戻り値について教えてください 佐藤 2005/07/14-06:21
イベントで行訂正を行う際に、メソッド呼び出しで更新モードを
表示モードで行う処理を行っています。

 変数宣言 固有,数値{&設定結果}
 メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)
 条件 (&設定結果<>1) 手続き終了 /* 移行できない場合は中止 */
 /* ここで行訂正の処理 */

通常の場合、これで期待通りに動いてくれるのですが、
行訂正中に呼び出さ、しかもその訂正結果がエラーの出る類のものだった場合
(数値項目に文字列を入れようとしていた等)エラーメッセージが一旦出た後、
上記の「/* ここで行訂正の処理 */」の部分が実行されてしまい、
「KU1068:対象表が更新中またはグループ操作中のためこのコマンドは使用できません 」というエラーになります。
この問題は、とりあえず以下のように書き換えて解決はしました。

 変数宣言 固有,数値{&設定結果,&更新モード}
 メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)
 メソッド呼び出し @フォーム.更新モード取得(&更新モード)
 条件 (&更新モード<>0) 手続き終了
 /* ここで行訂正の処理 */

ここで疑問なのですが、「メソッド呼び出し 更新モード設定」では、
上記の例のように、更新モードが変更されなかった場合でも「戻り値」として1を返してしまっているような気がするのですが、
これは私の理解が何か間違っているのでしょうか?

緊急ではありませんので、もしよろしかったら教えて頂けると助かります。

30510 Re:メソッド呼び出し 更新モード設定、の戻り値について 宮城 2005/07/14-08:36
記事番号30509へのコメント
佐藤さん、こんにちは。

>ここで疑問なのですが、「メソッド呼び出し 更新モード設定」では、上記
>の例のように、更新モードが変更されなかった場合でも「戻り値」として1
>を返してしまっているような気がするのですが、これは私の理解が何か間違
>っているのでしょうか?

行訂正するんですよね? 更新モード=2では?

これが入力ミスだったにせよ、更新モードを変更して(この段階で戻り値=1でしょう)その後の入力の問題
(数値項目に文字列を入れようとしていた等)はそりゃあなんというか・・・。

行訂正できたかどうかはコマンド「行訂正」の「終了状態」あたりで判断すべきでしょう。
30511 Re:メソッド呼び出し 更新モード設定、の戻り値について 宮城 2005/07/14-09:27
記事番号30510へのコメント
どうも入力ミスでもなさそうな・・・。

> イベントで行訂正を行う際に、メソッド呼び出しで更新モードを
> 表示モードで行う処理を行っています。

ナマで表操作するのかと思ったのですが、コマンド「行訂正」を使うんですね。なら「表示モード」で正解です。

なぜ更新モード設定の戻り値が「1」になるかというところは変わりませんが。

30512 Re:メソッド呼び出し 更新モード設定、の戻り値について うにん 2005/07/14-09:28
記事番号30510へのコメント

>>ここで疑問なのですが、「メソッド呼び出し 更新モード設定」では、上記
>>の例のように、更新モードが変更されなかった場合でも「戻り値」として1
>>を返してしまっているような気がするのですが、これは私の理解が何か間違
>>っているのでしょうか?
>
>行訂正するんですよね? 更新モード=2では?

何故わざわざ0にするのか私にもわかりません。
行訂正状態で起こるイベントでは変更できないのがほとんどのようですし?
しかし試しに[編集文字列変更]で試したら変更されてしまいました。
リファレンスの「変更できません」というのは「変更すべきでない」という意味?

>これが入力ミスだったにせよ、更新モードを変更して(この段階で戻り値=
>1でしょう)その後の入力の問題(数値項目に文字列を入れようとしていた
>等)はそりゃあなんというか・・・。

つまりフォームの更新モードは設定されるが、表にデータを入れようとした時
エラーになったので元に戻っているということのようです。
更新モード設定の後でソース値更新と編集開始イベントが発生しています。

イベントの無関係な表形式編集で見てると、そういうエラーの時は項目が
一旦表示状態に描画されてますね。行訂正マークはついたままですが。

30513 Re:メソッド呼び出し 更新モード設定、の戻り値について 佐藤 2005/07/14-09:32
記事番号30510へのコメント
宮城さん、コメントありがとうございます。


>行訂正するんですよね? 更新モード=2では?
わかりにくくてすみません、更新モード=0にして、行訂正コマンドで
行の内容を書き換えたいのです。だから、この時点で、更新モード=0
に設定でいいん¥ですよね?ひょっとして私が勘違いしてるのかな?

>これが入力ミスだったにせよ、更新モードを変更して(この段階で戻り値=
>1でしょう)その後の入力の問題(数値項目に文字列を入れようとしていた
>等)はそりゃあなんというか・・・。
>
>行訂正できたかどうかはコマンド「行訂正」の「終了状態」あたりで判断す
>べきでしょう。

行訂正コマンドを使用している段階で更新モード=0でないとエラーになるので
事前に、更新モード=0にしておきたいっていうことなんです。

で、前の投稿のような処理を呼び出す時に、手作業で行訂正していて、
しかも数値項目に文字列を入れようとしていた等の処理を行っていると、
実際には更新状態のままなのにもかかわらず、

 メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)

で&設定結果に1が入ってしまうのは、おかしくないかな、という事なんです。
ひょっとして、マイナーバージョンアップとかで解決してる問題なのかもしれませんが。
30514 Re:メソッド呼び出し 更新モード設定、の戻り値について 宮城 2005/07/14-10:23
記事番号30513へのコメント
>で&設定結果に1が入ってしまうのは、おかしくないかな、という事なんです。
>ひょっとして、マイナーバージョンアップとかで解決してる問題なのかも
>しれませんが。

いや、ですからその入力前に&設定結果は「1」になっているんですったら。
もはや第一関門は通過してるんですから、次の関門でひっかかったって
&設定結果がさかのぼって「1」以外になることはありません。

30516 Re:メソッド呼び出し 更新モード設定、の戻り値について うにん 2005/07/14-14:19
記事番号30509へのコメント

>イベントで行訂正を行う際に、メソッド呼び出しで更新モードを
>表示モードで行う処理を行っています。

「項目値代入」ではいけないんでしょうか。

> メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)

このコマンドは「フォームの更新モードを変えるだけ」なので正常に終了します。
モードが変わったことにより、フォームに入力されたデータを表に代入するイベントが発生します。
エラーがあればそれに応じて更新モードはまた変わります。
ということでしょう。

> 条件 (&設定結果<>1) 手続き終了 /* 移行できない場合は中止 */

一括処理と違ってイベントでは「コマンドが書いてある順に実行される」だけではないので複雑ですね。

30517 Re:メソッド呼び出し 更新モード設定、の戻り値について アックン 2005/07/14-16:12
記事番号30509へのコメント
佐藤さん、こんにちは。
もし会話入力中の値を捨てて、行訂正コマンドの処理をしてもいいなら、こうすればどうでしょう。

 メソッド呼び出し @フォーム.更新モード設定( -1 ) ←表示モード(キャンセル)
 /* ここで行訂正の処理 */

入力中の値があっても、キャンセルして表示モードにしますから、行訂正コマンド
でエラーが出ません。
戻り値を取得してもいいです。

それはそれとして。
質問内容を再現できました。
戻り値が 1 になる原因は、私にはわかりません。
正常動作なのかどうかもわかりません。
ユーザーサポートに聞いて、回答をご報告くださると助かります。

・再現テスト方法
フォーム一覧表の明細行のテキストボックス(ソースは数値項目/イベント設定なし))1個で試しました。
コマンドボタンの左クリックイベントに佐藤さんのプログラムを記述。
確認コマンド使用

アックン(=^・^=)
30518 Re:メソッド呼び出し 更新モード設定、の戻り値について 佐藤 2005/07/14-17:05
記事番号30514へのコメント
宮城さん、ありがとうございます。

>いや、ですからその入力前に&設定結果は「1」になっているんですったら。
>もはや第一関門は通過してるんですから、次の関門でひっかかったって
>&設定結果がさかのぼって「1」以外になることはありません。

きっと、そういう事なんでしょうね。
ただ、「数値項目に文字列が入力されている」という、いわば不正状態であれば
&設定結果に1が入る前にエラーメッセージが出てもいいのではないかなと思ったわけです。

30519 Re:メソッド呼び出し 更新モード設定、の戻り値について 佐藤 2005/07/14-17:09
記事番号30516へのコメント
うにんさん有り難うございます。


>>イベントで行訂正を行う際に、メソッド呼び出しで更新モードを
>>表示モードで行う処理を行っています。
>
>「項目値代入」ではいけないんでしょうか。
>
>> メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)
>
>このコマンドは「フォームの更新モードを変えるだけ」なので正常に終了します。
>モードが変わったことにより、フォームに入力されたデータを表に代入する
>イベントが発生します。
>エラーがあればそれに応じて更新モードはまた変わります。
>ということでしょう。
>
>> 条件 (&設定結果<>1) 手続き終了 /* 移行できない場合は中止 */
>
>一括処理と違ってイベントでは「コマンドが書いてある順に実行される」だけ
>ではないので複雑ですね。
>

このあたりの桐の挙動を、私が理解してないようです。
フォームを更新モード→表示モードに変えるというイメージが、
私の考えているものとちょっと違っているようなので、また勉強してみます。
30520 Re:メソッド呼び出し 更新モード設定、の戻り値について 佐藤 2005/07/14-17:17
記事番号30517へのコメント
アックンさん有り難うございます。

>佐藤さん、こんにちは。
>もし会話入力中の値を捨てて、行訂正コマンドの処理をしてもいいなら、こうすれ
>ばどうでしょう。
>
> メソッド呼び出し @フォーム.更新モード設定( -1 ) ←表示モード(キャンセル)
> /* ここで行訂正の処理 */
>
>入力中の値があっても、キャンセルして表示モードにしますから、行訂正コマンド
>でエラーが出ません。
>戻り値を取得してもいいです。
>
>それはそれとして。
>質問内容を再現できました。
>戻り値が 1 になる原因は、私にはわかりません。
>正常動作なのかどうかもわかりません。
>ユーザーサポートに聞いて、回答をご報告くださると助かります。
>
>・再現テスト方法
>フォーム一覧表の明細行のテキストボックス(ソースは数値項目/イベント設定な
>し))1個で試しました。
>コマンドボタンの左クリックイベントに佐藤さんのプログラムを記述。
>確認コマンド使用
>
>アックン(=^・^=)

「表示モード(キャンセル)」は確かに仰る通り確実ですよね。
ただ、ここはやっぱり更新モード設定(0)にしたい所なのです。

戻り値が1になる件、こういう仕様なんですね、きっと。自分としては、ちょっと違和感あったのですが、
こういうものなら仕方ないかなと思います。
現在海外なので、ユーザーサーポートは電話代が(笑)
再現テストまでしていただいて、何か嬉しいです。ありがとうございました。

30521 Re:メソッド呼び出し 更新モード設定、の戻り値について 悲しげ 2005/07/14-18:56
記事番号30519へのコメント
似たようなことで、私も遥か昔に悩んだことがあります。
その理由は多分(あくまでも「多分」ですが)うにんさんの仰るように

>イベントでは「コマンドが書いてある順に実行される」だけではない

辺りにあるような気がします。
つまり「更新モード設定」メソッドで、表示モードにはなることはなるのだが(したがって戻り値は1になる)、
それは次行以降の記述

> 条件 (&更新モード<>0) 手続き終了
> /* ここで行訂正の処理 */

よりも後で実行されている・・・とか。(未確認)

で、この点については、当時、次のようなやり方で逃げました。
何とかうまく行ったような記憶があるのですが、もしかしたら私の記憶違いかもしれなひ・・・・。
その方法とは、「b表示」なるコマンドボタンの利用です。
機能等は
  機能名 同パラ
  表示  確定する
このボタンはフォーム内でも、枠外のワークスペースでも、どちらに置いてもいいです。
その上で、kevの

> 変数宣言 固有,数値{&設定結果}
> メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)
> 条件 (&設定結果<>1) 手続き終了 /* 移行できない場合は中止 */
> /* ここで行訂正の処理 */記述は

の記述を次のようにします。

 メソッド呼び出し @b表示.実行()
 /* ここで行訂正の処理 */

こうしたら100%実行されるので(しかも必ず先に)、戻り値変数での判断も不要だったような・・・。
挙動未確認ゆえ間違っていたらすいません。

30522 迂遠なる実行順の担保 悲しげ 2005/07/14-19:24
記事番号30521へのコメント
前述のやり方でも「必ず先に」を担保できないとしたら、次のような迂遠な方法も有り得るかも。

 ・・・・・・
 メソッド呼び出し @b表示云々.実行()
 ・・・・・・

「表示云々」ボタンの機能等

  機能名   同パラ
1 表示    確定する
2 手続き実行 ここで行訂正の処理

kevに下記の手続き定義範囲を設定

 proc ここで行訂正の処理()
  ・・・・・
  /* ここで行訂正の処理 */
  ・・・・・
 end

こうすれば、必ず実行順を固定できます。(^^;)

30523 別法 悲しげ 2005/07/14-19:41
記事番号30521へのコメント
 var 自動,長整数{&更も}
 method 更新モード取得,@フォーム.更新モード取得(&更も)
 if(&更も=0)
  行訂正 ・・・・
 else
  項目値代入 ・・・
 end

ちなみに私は、表示モードでの方が色々自由にやれるので好きです。
(ジャンプとか置換とか並べ替えとか←行挿入モドキに必須)
だから「項目値代入」は滅多に使わないので、使い方は下手です。
「行訂正」命。(^^;)

あ、話がそれましたが、幾ら「実行順が不定」とは云っても、
流石にif範囲の中までは大丈夫じゃないかと(想像)。

30524 駄洒落ですが 悲しげ 2005/07/14-20:17
記事番号30522へのコメント
コマンドボタンを、このように困った時に利用する場合、
次のような漢字を当てることがあると云われています。※註

  困人ボタン

ヨミは「こまんど」です。「困った人が使う」と云う意味
を内包しています。

※註 そんなこと云っているのは、私だけです。(^^;)

昔、NIFTY/FAPPLI/桐たんすで、この手の駄洒落をよく書いていたことを思い出しながら・・・。

30526 Re:メソッド呼び出し 更新モード設定、の戻り値について うにん 2005/07/15-00:04
記事番号30521へのコメント

>>イベントでは「コマンドが書いてある順に実行される」だけではない
>
>辺りにあるような気がします。
>つまり「更新モード設定」メソッドで、表示モードにはなることはなる
>のだが(したがって戻り値は1になる)、それは次行以降の記述
>
>> 条件 (&更新モード<>0) 手続き終了
>> /* ここで行訂正の処理 */
>
>よりも後で実行されている・・・とか。(未確認)

さすがにそれはないでしょう。
条件の前に確認コマンドで変数値を見ればわかります。(確認済み)

更新モード設定されたあと、次の行が実行される前にソース値更新などのイベントが発生しています。
イベントハンドラが書いてなくてもイベント自体は発生して、それによって
桐の内部処理が行われているでしょう。
更新モード変更によって必要になるソース値更新などが、イベントでなく
関数コールのような形で実行されてればエラーを更新モード変更のエラーとして
戻せるでしょうけど、イベントなので無理なんでしょうね。
(キューに入れるだけで終了を待たない)
単なる推測ですが。

>その方法とは、「b表示」なるコマンドボタンの利用です。機能等は
>  機能名 同パラ
>  表示  確定する

> メソッド呼び出し @b表示.実行()
> /* ここで行訂正の処理 */
>
>こうしたら100%実行されるので(しかも必ず先に)、

エラーのため入力した値を確定できない場合の話なので、どうでしょうね。(未確認)
「差し戻し」になって確定するまでループしてくれるのかな?

30527 Re:メソッド呼び出し 更新モード設定、の戻り値について 佐藤 2005/07/15-08:18
記事番号30521へのコメント
悲しげさん、有り難うございます
色々と試行錯誤してます(笑)
本職はC++なもので、ちょっと勝手が違って戸惑ってます。
表示モードって、そのレコードの内容が確定された状態というわけでもないのですかね。
いろいろな方法を教えて頂いてありがとうございました。
現場での処理は、一応問題のない形にすることができました。
30528 いくつかの論点についてのコメントです 佐田 守弘 2005/07/15-21:35
記事番号30509へのコメント
佐藤さん
一連の書き込みを何回か読んでみて、いくつかの論点になっている部分についての
コメントと、まだ私に理解できない部分についての確認をさせて頂きます。

●更新モード設定の戻り値が1である理由
これは間違いではありません。更新モードはこのコマンドによって、
表示モードに切替えられています。正しく設定ができているので、戻り値が1になります。

佐藤さんが疑問としている「行訂正でエラーが起きているにも拘わらず」ですが、
これは更新モードの設定とは無関係です。
詳しくは後から触れますが、清浄に更新モードが終了した後に実行した行訂正で、エラーが起きただけの事です。

そもそも、
 >メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)
で更新モードを表示モードに変更するのは、大概の場合できない事はないはず
です。
そもそも入力状態の各種モードから表示モードに戻せないケースとは、
どの様なケースがあるのでしょうね。(たとえば、モーダルフォームの表示中とか)

●行訂正と項目値代入
いずれも項目値に計算式で値を代入するコマンドです。使い方は全くと言って良いほど同じですが、使う状態が違います。
行訂正は、表示モードでの未使えます。行訂正などの入力状態のモードでは使えません。
逆に項目値代入コマンドは、項目(あるいはフォームのオブジェクト)に入力中の状態で使います。
どちらを使うかは、「メソッド呼び出し 更新モード取得」コマンドでその時の
更新モードを調べます。
そして0(表示)であれば行訂正を、それ以外は項目値代入を使えば良いのです。
(これは、#30523で悲しげさんが書いている事と同じです)

●この質問で言っている行訂正とは
#30513にて、
 >行訂正コマンドを使用している段階で更新モード=0でないとエラーになるのでは、上記にも書いた通りです。しかし
 >事前に、更新モード=0にしておきたいっていうことなんです。
は、項目値訂正コマンドを使えば済む話です。

しかし、次の部分が私には引っ掛かりますし、理解できない部分です。
 >で、前の投稿のような処理を呼び出す時に、手作業で行訂正していて、
先に述べましたが、行訂正とは、コマンドで項目値に値を書き込む操作です。
手作業で行うものではありません。

なお行訂正には、「行訂正 会話」というコマンドがあって、これは、手作業(会話処理)で行訂正を行うコマンドです。
しかし、更新モードを0(表示モード)に変更する前は、いわば会話処理の行訂正
と全く同じ状態ですから、なぜその様な事をするのかが分らなくなります。
(フレンチレストランに入って隣からラーメンを出前させる様な話になります)

この部分でどの様な事をしているのかをもう少し詳しく書いて頂くと、的確なコメントができるのだろうと思います。

●数値を入力すべき所に文字列を入力したエラーを回避する方法
数値等(整数なども含む)の項目に、文字列を入力しようとすれば、当然ながらエラーになります。
もし上記に書いた様に手作業での行訂正(「行訂正 会話」の様に見える)をするなら、
値の確定の前に入力値をチェックすれば済む話です。
そしてそのために、入力後イベントがあります。
 手続き定義開始 t何某::入力後( 参照 文字列 &編集文字列,長整数 &モード
        ,参照 長整数 &入力継続)
 条件 (#is数字(&編集文字列,1)=0) 代入 &入力継続=1
 手続き定義終了
これは、入力して確定しようとする文字列(&編集文字列)が全て数字でない場合には、
&入力継続に1を代入する処理です。
&入力継続に1を返すと、入力が終了せず、入力のやり直しが求められます。
まさに目的とする処理かと思います。

●参考までに
上記の説明で気がついたかと思いますが、項目値などに入力中は、仮にその
項目が数値型等であっても、文字列として扱われています。
このため、&編集文字列は文字列型です。
そして、編集が終って表の項目値に書き込まれる段階で、その項目が数値型であれば、数値に変換されるのです。

佐田守弘(KS-00119)
30529 Re:いくつかの論点についてのコメントです 佐藤 2005/07/16-06:39
記事番号30528へのコメント
佐田さん有り難うございます

どうも私の書き方がよくなかったようで、失礼しました。

●私の書こうとしていたイベント処理は、単純に言って次の2つの事を行わせたかったものです。
(1)メソッド呼び出しで 更新モード=0に設定
(2)行訂正の処理を行う(手作業ではなく、プログラムが処理を行う)

※この(2)の部分が手作業であると誤解させてしまう
 書き方だったのがまずかったですね。すみません。

●このイベントを呼び出す際(イベントの割り当てられたボタンを押す時)、使う人が
どこかの項目値を訂正している最中である可能性が考えられます。
その訂正の内容というのが
(ア)正常なものだった場合
(イ)数値項目に文字列を入れようとしていた等不正なものだった場合の2つのケースが考えられます。
(ア)の場合は何も問題ありません。
(イ)の場合、ユーザーが、上記のイベント呼び出しの前に入力を確定してくれればその場でエラーが出るので問題ありません。
しかし、入力を確定せず、たとえば”100abc”のように数値と見なされない内容をフォーム上のテキストオブジェクトに入力して、
カーソルがまだそこにある状態で、上記のイベントを呼び出すボタンを押すことも考えられます。
今回、疑問だったのは、このケースの場合の挙動です。

●更新モード=0の状態というのが、私のイメージでは、レコードの内容が確定して表の項目に書き込まれた状態だと思っていました。
ですから上記(イ)のような状態で、

メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)

を実行すれば、更新モード=0にするために数値項目の内容を確定させようとした段階でエラーが発生。
結果として、更新モード=0の状態に移行できず、当然ながら戻り値
である&設定結果には1以外の値が入るのではないかと想像したわけです。

●ところが、(イ)のような状態であっても、&設定結果には1が入るため、

 条件 (&設定結果<>1) 手続き終了 

この行の「手続き終了」は実行されることなく、そのまま処理が継続されてしまいます。
そしてその後の処理で「行訂正」コマンド(例えば、 行訂正 [分類コード]=&新コード etc)を実行すると、
そこで、「数値データ形式に誤りがあります」のエラーが出て、更に「KU1068:対象表が更新中または
グループ操作中のためこのコマンドは使用できません 」のエラーが出ます。
つまり、この段階では既に、更新モード=0の状態でなくなっているわけです。

とすると、
・一旦、更新モード=0になったが、何らかの理由で、再び更新モード<>0の状態になっている
・戻り値として&設定結果には1が入ったが実は更新モード=0の状態になっていなかった
のどちらかと考えられます。しかし、いずれにしてもそれでは
メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)
の実行時に、戻り値として受け取った&設定結果の値に意味がなくなってくるのではないかと思うのです。

●ちなみに、

(A)
 メソッド呼び出し 戻り値=&設定結果,@フォーム.更新モード設定(0)
 条件 (&設定結果<>1) 手続き終了
    ↓
(B)
 メソッド呼び出し @フォーム.更新モード設定(0)
 メソッド呼び出し @フォーム.更新モード取得(&更新モード)
 条件 (&更新モード<>0) 手続き終了

としてやると、この問題は発生しません。上記(A)と(B)の処理で違いが出る理由がわかりませんし、処理上の必然性もないはずです。
この辺り、なにか理由があるのかと思い、お尋ねしたものです。

もちろん、皆さんが教えて下さった方法で回避する事はできますので、運用上は問題ないのですが、
単純にここが素朴な疑問だったわけです。

思いがけず長文になり、失礼致しました。
回答して頂いた皆様有り難うございます。

30530 Re:数値の入力について 今村 誠 2005/07/16-08:05
記事番号30529へのコメント
 佐藤さんこんにちは、本題から少し離れますが、数値項目を
入力するときは、数値以外の入力を無視するようにすると確定時にはエラーメッセージはでません。
 ケースバイケースでしょうけど、私の場合郵便番号の項目を数値にしているのですが、
入力者がハイフンを入力してエラーがでていました。
 ONnojiさんの手続きをテキストボックスの編集文字列イベントに組み込んで快適に使用しています。

>しかし、入力を確定せず、たとえば”100abc”のように数値と見なされない
>内容をフォーム上のテキストオブジェクトに入力して、

手続き定義開始 t〒::編集文字列変更()
 call FileNameCheck()
手続き定義終了

proc FileNameCheck()
   var Str{&focus,&txt},Long{&pos[3]}
   method @フォーム.フォーカスオブジェクト取得( &focus )
   method &focus.編集文字列取得      ( &txt )
   method &focus.編集選択位置取得     ( &pos[1] , &pos[2] )
 if ( .not((#setvar(pos,3,#jis(#sstr(&txt,&pos[1]-1,1)))>47/* #jis("/")*/\
    .and &pos[3]<59/* #jis(":")*/))) /* -+等の文字で数値データに誤りがありますを表示
しないために*/
   method &focus.編集選択位置設定     ( &pos[1]-1 , 1 )
   method &focus.編集選択文字列置換    ( "" )
 end
end

(-)が先頭に必要な場合は、作った方に相談してみてください。

30531 Re:メソッド呼び出し 更新モード設定、の戻り値について 悲しげ 2005/07/16-11:24
記事番号30526へのコメント
>>よりも後で実行されている・・・とか。(未確認)
>
>さすがにそれはないでしょう。

あ、外しましたか? (*^^*)

>(キューに入れるだけで終了を待たない)

なるほど。かもしれませんね。あくまで推測の範囲ですが。(^^;)

いずれにせよ、表示モード化のための更新モード設定メソッドが思うように挙動しない
(「行訂正」→「更新中云々」エラー)と云う佐藤さんと類似の経験を、かつて私もしていた記憶が残っています。
しかも私の場合は、別途訂正モード中のものがエラーとなる類のものでなくとも不具合が発生していた記憶があるのですが、
既にうすらなものと化しています。
もしかしたら、メイン&サブがらみの要素もあったかもしれません。
いずれにせよ2、当時の私としては、コマンドボタンの機能の方で表示モード化することを利用してこの問題を回避できたので、
その経験をご紹介させて戴いた次第です。
その後、spが上がって既に改善された問題なのかもしれませんが未確認です。
何だか未確認だらけの曖昧な書き方ですいません。(^^;)



なお、上記問題とは別に

>(イ)数値項目に文字列を入れようとしていた等不正なものだった場合

の類への対策は講じておくべきでしょうね。ま、佐藤さんもそのことを
重々承知の上で書かれているのでしょうけど。
あ、場合によっては、v9で登場した「行訂正エラー」イベントなんかも
利用できるかもしれません(私は未だ使ったことありませんけど)。

30532 くどいようですが(^^;) 悲しげ 2005/07/16-11:27
記事番号30529へのコメント
>●このイベントを呼び出す際(イベントの割り当てられたボタンを押す時)、
>使う人がどこかの項目値を訂正している最中である可能性が考えられます。

あ、トリガはコマンドボタン押下で手続き実行を呼び出しているのですね。
ならば

>  機能名   同パラ
>1 表示    確定する
>2 手続き実行 ここで行訂正の処理

で試してみることはかなりオススメっぽいような・・・。くどいかな?(^^;)

ps.
ボタンの「マウス左クリック」イベントはこの場合は使わない方が無難です。
なぜならボタンの「機能」よりも先に実行されるので。

30539 Re:数値の入力について 佐藤 2005/07/18-04:39
記事番号30530へのコメント
今村さん 有り難うございます
確かに、数値項目への入力をチェックするのは必要なのかもしれないですね。
教えていただいた処理を見て、なるほどと思いました。
こういう部分のテクニックは、長く使っている方にお聞きできると本当に助かります。
30540 Re:くどいようですが(^^;) 佐藤 2005/07/18-04:46
記事番号30532へのコメント
悲しげさん 有り難うございます。

ボタンの機能に直接割り当てて、表示モードにしてから手続き実行という事ですか、これは発想にありませんでした。
参考にさせていただきます。
習い性で、コードがまとめて見える方が落ち着くんですよね(笑)

30541 元の手続きはアックンさんの投稿のものですね。 ONnoji 2005/07/18-16:58
記事番号30530へのコメント

今村さん、こんにちは。

私には身に覚えがないので、トホホでしたが…
google で検索したら見つかりました。(^^v

元の手続きはアックンさんの投稿のものですね。

過去の桐井戸端BBS (桐ver.8)
6854 テキストボックスで入力する文字種を制限したい
http://www.fuku3.com/habata/kbbs/kakov8/06854.htm
の、6855 Re:入力文字種の制限 アックン

30545 Re:元の手続きはアックンさんの投稿のものですね。 今村 誠 2005/07/19-09:01
記事番号30541へのコメント
ONnojiさんこんにちは、ご迷惑をおかけしました。
>
>私には身に覚えがないので、トホホでしたが…
>google で検索したら見つかりました。(^^v
>
>元の手続きはアックンさんの投稿のものですね。

アックンさん間違えてすいません。
大変便利に使わせていただいています。

>過去の桐井戸端BBS (桐ver.8)
>6854 テキストボックスで入力する文字種を制限したい
>http://www.fuku3.com/habata/kbbs/kakov8/06854.htm
>の、6855 Re:入力文字種の制限 アックン

戻る