■記事リスト / ▼下のスレッド
■15017 / 親記事) |
数値型項目で入力の際数値以外のキーを受け付けない
|
□投稿者/ まさやん -(2025/07/09(Wed) 15:00:38)
| 2025/07/09(Wed) 15:24:55 編集(投稿者)
いつも お世話になっております
桐9s Win11 イベント処理を行っています
フォーム入力時に 品名や 備考 などの 文字列型項目での入力では 全キーボード入力を 拒まないのですが
数値型項目入力時に 数字キー以外の キーを受け付けないという 方法はできますか?
イベント実行中 数字入力だけの (例えば 単価 とか 数量など)際に 間違って 英字キー 押して 間違ってエンターキー押すと メッセが出て その先の 処理を受け付けてくれません
そのための 回避策を探していますが そのようなことができるかどうかもわかりませんが
宜しくお願い致します。
|
|
|
▽[全レス20件(ResNo.16-20 表示)]
■15037 / ResNo.16) |
Re[11]: 数値型項目で入力の際数値以外のキーを受け付けない
|
□投稿者/ ONnoji -(2025/07/10(Thu) 20:50:28)
| 2025/07/11(Fri) 08:51:12 編集(投稿者)
> 論より証拠。 > サンプルを作りました。 > INF_Framework をダウンロードしたフォルダに解凍してください。
> 先日 ダウンロードコーナーから ダウンロードしたのがありまして > その中のと同じのかと思われますので 試してみます ↑ そのフォルダに解凍する
または
ダウンロードコーナーからダウンロードしたファイルが存在するフォルダの
・INF_Framework.cmd ・IPS_Framework.cmd
この2つのファイルを VK_使用例.wfm/kev があるフォルダにコピーしてください
p.s.
> また AKOMEさんのと もひとつのURL 見てみました > 私のレベルでは まだ 解釈不足です
そもそも初めて経験するインタフェースなのですから誰でも最初から理解・解釈出来ないのが普通ですよ。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
まず、考えずに AKomeさんの例を試してみることです。 ・・・・・・・・・・・・・・・・・・・・・
例えば、表示モードで[/][−]キーが押された時に現れる「スラッシュ・メニュー」を止めるとかなど・・・
そうすれば、なるほど!と分かってくるハズですよ。
ただ考えるのは何もしないのと同じです。(^^ゞ
p.p.s.
老婆心ながら・・・(^^ゞ
フレームワークというものは内容を理解する必要は無いのです。 ・・・・・・・・・・・・・・・・・・・・・・・・・
それよりも、使い方を理解する事が重要なんです。 ・・・・・・・・・・・・・・・・
フレームワークの内容に関心が無くて、フレームワークの使い方に関心がある人はソフトウェア開発に適性があります。
そういう人はフレームワークを利用して、短時間に[フォーム+イベント処理]アプリケーションを作っています。
それに対して、DOS桐からのベテラン組の人達は、長年一括処理、つまり[フロー駆動型]を使っていたので、
[フロー]=[コーディング]=プログラミングと認識しているようです。
つまり、全部自分でプログラムを書かないと気が済まない人が多いように思います。
勿論、その方が気分が良い人も居ることでしょう。
しかし、それではいつまでたっても[イベント駆動]のプログラミングを効率よく構築出来ないと思いますよ。 ・・・・・・・・・・・・・・・・・・・・・・・
既に出来上がっている車輪=フレームワークを利用する方が、車輪を再発明するよりも効率がよいのですから・・・
<用語>
車輪の再発明 出典: フリー百科事典『ウィキペディア(Wikipedia)』
車輪の再発明(しゃりんのさいはつめい、英: reinventing the wheel)とは、 「広く受け入れられ確立されている技術や解決法を(知らずに、または意図的に無視して)再び一から作ること」を指すための慣用句。 誰でも直観的にその意味が分かるように、車輪という誰でも知っていて古くから広く使われている既存の技術を比喩の題材として使った慣用表現で、世界中で使われている。
再利用すべき「車輪」
IT業界において、再発明するのではなく再利用すべき「車輪」の例としては以下のようなものがある[1]。
・ライブラリやフレームワーク
ドキュメントが整備されていることや日々メンテナンスされてバグが無くなっていることが必要。 使用するライブラリやフレームワークが広く知られている場合には、 開発経験をもった人をアサインすることで引き継ぎなどもスムーズに行くというメリットもある。
|
|
|
■15038 / ResNo.17) |
Re[12]: 数値型項目で入力の際数値以外のキーを受け付けない
|
□投稿者/ ONnoji -(2025/07/10(Thu) 23:53:47)
| 2025/07/11(Fri) 07:53:55 編集(投稿者)
拙作:VK_Framework で試したところ当初の予想よりも簡単に[数値以外のキーを受け付けない]が実現できました。(^^ゞ
簡単なレビューを以下にご報告します。
◇ ◇ ◇ ◇ ◇ ◇
【イベントハンドラに直接記述する】
手続き定義開始 フォーム::キーダウン(長整数 &仮想キーコード,長整数 &スキャンコード,長整数 &フラグ,参照 長整数 &処理中止)
メソッド呼び出し @フォーム.更新モード取得(&更新モード) メソッド呼び出し @フォーム.フォーカスオブジェクト取得(&STR) ┌if (&更新モード≠0) │┌if ((&仮想キーコード>=65 .and &仮想キーコード<=90 .and &仮想キーコード≠13) .or (&仮想キーコード>=106 .and &仮想キーコード≠110) ││ &比較式=#項目属性(#項目番号(#部分列(&STR,#IS全角(&STR,0))),2) ││ 条件 (&比較式≠"文字列") &処理中止=1 ││ 条件 (&比較式≠"文字列") メッセージボックス "","数字キーのみの入力です",ボタン=1 │└end └end
手続き定義終了
上↑と下↓
【VK_Framework を利用する】
手続き定義開始 txtA::入力前(参照 文字列 &編集文字列)
手続き実行 VKprcEventKeyDownON( ) 手続き実行 VKprcKeyON( ) 手続き実行 VKprcKeySet( "key", 1, "項目訂正,訂正", "手続き実行 prcTest( &VKmChr, &処理中止 )" )
手続き定義終了を
手続き定義開始 txtA::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
手続き実行 VKprcEventKeyDownOFF( ) /* キーダウンイベントをオフ */ 手続き実行 VKprcKeyOFF( ) /* 実行禁止 */ 手続き実行 VKprcKeyClear( "key", "項目訂正,訂正" ) /* クリア */
手続き定義終了
手続き定義開始 prcTest( 文字列 &key, 参照 長整数 &処理中止 ) 変数宣言 自動,文字列{ &keyList = "0,1,2,3,4,5,6,7,8,9,+,-" } /* 必要ならば小数点のドットも加える */
トレース出力 _( #対応番号( &keyList, &key ) <> 0 ) if ( #対応番号( &keyList, &key ) <> 0 ) &処理中止 = 0 end
トレース出力 _&key, " ", _&処理中止 手続き定義終了
比べてみると、
拙作:VK_Framework を利用する場合には
・65,90 といった恣意的な仮想キーコードに振り回されなくて分かり易い ・・・・・・・・・・・・・・・・・・
・[Enter][Tab][Esc]の各キーに対して透過的である
・更新モードによって実行内容を指定できる
・分かり易いから改造が簡単に出来る ・・・・・・・
というメリットがあることに気が付く事でしょう。
なお、VK_Framework は Thin INF_Framework / オートINF_Framework 等すべての INF_Framework で使用できます。
p.s.
>>なお、この方法でキーをマスクすると、キーボードが壊れたんじゃないかと不審に思われるかもしれませんね。 >> ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ >>なので、「やり過ぎ感がハンパ無しで満載」ですね。 ※何事もほどほどがいいですよ。
これは杞憂、つまり「とりこし苦労」でしたね。
[入力後]イベントハンドラで不要文字を取り除くよりも、ストレートでパフォーマンスも悪く無いでした。アハハハha
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
余談ながらトレースの結果です。
┌when 手続き"txtA::入力前("0")"を実行開始しました │ │┌when 手続き"VKprcEventKeyDownON( )"を実行開始しました │└end │ │┌when 手続き"VKprcKeyON( )"を実行開始しました │└end │ │┌when 手続き"VKprcKeySet("key",1,"項目訂正,訂正","手続き実行 prcTest( &VKmChr, &処理中止 )")"を実行開始しました │└end │ └end
┌when 手続き"フォーム::キーダウン(97,79,0,0)"を実行開始しました │ │┌when 手続き"VKprcEventKeyEval(97,79,0,0)"を実行開始しました ││ ││┌when 手続き"prcTest("1",1)"を実行開始しました │││ │││ :( #対応番号( &keyList, &key ) <> 0 ) : 1 │││ :&key : 1 &処理中止 : 0 │││ ││└end ││ │└end │ └end
┌when 手続き"フォーム::キーダウン(98,80,0,0)"を実行開始しました │ │┌when 手続き"VKprcEventKeyEval(98,80,0,0)"を実行開始しました ││ ││┌when 手続き"prcTest("2",1)"を実行開始しました │││ │││ :( #対応番号( &keyList, &key ) <> 0 ) : 1 │││ :&key : 2 &処理中止 : 0 │││ ││└end ││ │└end │ └end
┌when 手続き"フォーム::キーダウン(99,81,0,0)"を実行開始しました │ │┌when 手続き"VKprcEventKeyEval(99,81,0,0)"を実行開始しました ││ ││┌when 手続き"prcTest("3",1)"を実行開始しました │││ │││ :( #対応番号( &keyList, &key ) <> 0 ) : 1 │││ :&key : 3 &処理中止 : 0 │││ ││└end ││ │└end │ └end
┌when 手続き"フォーム::キーダウン(13,28,0,0)"を実行開始しました │ │┌when 手続き"VKprcEventKeyEval(13,28,0,0)"を実行開始しました ││ │└end │ └end
┌when 手続き"txtA::入力後("123",1,0)"を実行開始しました │ │┌when 手続き"VKprcEventKeyDownOFF( )"を実行開始しました ││ │└end │ │┌when 手続き"VKprcKeyOFF( )"を実行開始しました │└end │ │┌when 手続き"VKprcKeyClear("key","項目訂正,訂正")"を実行開始しました │└end │ └end
|
|
|
■15079 / ResNo.18) |
Re[2]: 数値型項目で入力の際数値以外のキーを受け付けない
|
□投稿者/ ONnoji -(2025/08/09(Sat) 14:53:47)
| 2025/08/09(Sat) 18:57:01 編集(投稿者)
すでに解決済との事ですが・・・
当初から、私の直感では、使用できるキーを数字と正負記号に制限するのは、解決策の本命には思えませんでした。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
結論としては、[キーダウン]イベントハンドラは必要ないです。
なぜならば、[入力後]イベントハンドラが呼び出す一般手続きですべて処理できるからです。
結局、先回りして数字と正負記号以外の文字キーをブロックしても、ほとんど無意味という事なんです。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・◎◎◎◎◎◎◎・・・・・・・・
つまり、問題解決の本質部分は、[キーダウン]イベントハンドラにあるのではなくて、[入力後]イベントハンドラにあるということです。(^^ok
ということで、[入力後]イベントハンドラの工夫次第ということで解決になります。ガッハハハha (^^♪
今回の添付ファイルには、拙作:INF_Framework を使用していません。
普通にフォームを開けば実行できますよ。
なお、サンプルは数日を目途に削除しますので、ダウンロードはお早めに願います
<参考>
名札 メイン
*
手続き定義開始 txt数値::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
手続き実行 prc数値の入力後イベント処理( &this, &編集文字列,&モード,&入力継続 )
手続き定義終了
手続き定義開始 txt整数::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
手続き実行 prc数値の入力後イベント処理( &this, &編集文字列,&モード,&入力継続 )
手続き定義終了
手続き定義開始 txt長整数::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
手続き実行 prc数値の入力後イベント処理( &this, &編集文字列,&モード,&入力継続 )
手続き定義終了
手続き定義開始 txt通貨::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
手続き実行 prc数値の入力後イベント処理( &this, &編集文字列,&モード,&入力継続 )
手続き定義終了
手続き定義開始 INFprcMsgPause( 文字列 &icon, 文字列 &title, 文字列 &msg ) 変数宣言 自動,文字列{ &iconList = "i,?,!,e" } /* 半角コンマで区切った文字列リスト */ 変数宣言 自動,文字列{ ¯o } 変数宣言 自動,整数 { &at }
&icon = #半角( #lc( #sstr( &icon, 1, 1 ) ) ) /* &icon はこの手続きの引数 */ &at = #対応番号( &iconList, &icon )
¯o = "メッセージボックス &title, &msg" + #cond( &at, ", アイコン = " + &icon ) + ", ボタン指定 = 1, 制御文字展開 = する" コマンド ¯o
手続き定義終了
手続き定義開始 prc数値の入力後イベント処理(文字列 &objectName, 参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続) 変数宣言 自動,文字列{ &icon, &title = "prc数値の入力後イベント処理( )", &msg } 変数宣言 自動,文字列{ &string } 変数宣言 自動,文字列{ &dataType } 変数宣言 自動,文字列{ &source } 変数宣言 自動,文字列{ &dataTypeList = "整数,長整数,数値,通貨,実数" } 変数宣言 自動,数値 { &num } 変数宣言 自動,数値 { &mod } 変数宣言 自動,整数 { &isError = 0 }
オブジェクト操作 &objectName{ &dataType = データ型, &source = ソース }
if ( #対応番号( &dataTypeList, &dataType ) <> 0 )
&string = &編集文字列 &string = #str( #num( &string ) )
&num = #未定義値変換( #num( &string ), 0 ) &mod = #mod( &num, 1 )
if ( &dataType = "整数" .or &dataType = "長整数" )
if ( &mod <> 0 )
&msg = "このテキストのソースは[" + &dataType + "]なので、小数点以下の数値は切り捨てられます" &msg = &msg + "\n\n⇒ " + &string &icon = "!" 手続き実行 INFprcMsgPause( &icon, &title, &msg ) &isError = 1 end
if ( ( &dataType = "整数" .and ( &num < -32768 .or &num > 32767 ) ) .or ( &dataType = "長整数" .and ( &num < -2147483648 .or &num > 2147483647 ) ) )
メソッド呼び出し &this.編集選択位置設定( 1 ,-1 )
&msg = "このテキストのソースは[" + &dataType + "型]なので、" 条件 ( &dataType = "整数" ) &msg = &msg + "\n\n-32768 〜 32767 の範囲外の整数は入力できません" 条件 ( &dataType = "長整数" ) &msg = &msg + "\n\n-2147483648 〜 2147483647 の範囲外の整数は入力できません"" &msg = &msg + "\n\n⇒ " + &string **&msg = &msg + "\n\nお手数ですが" &msg = &msg + "\n\n・値を削除する" &msg = &msg + "\n または" &msg = &msg + "\n・範囲内の値を入力してください" &icon = "e" 手続き実行 INFprcMsgPause( &icon, &title, &msg )
&isError = 1 &入力継続 = 1 end end
&編集文字列 = &string
end
手続き定義終了
|
|
|
■15080 / ResNo.19) |
Re[3]: 数値型項目で入力の際数値以外のキーを受け付けない
|
□投稿者/ まさやん -(2025/08/09(Sat) 17:21:53)
| 2025/08/09(Sat) 17:22:13 編集(投稿者)
> 当初から、私の直感では、使用できるキーを数字と正負記号に制限するのは、解決策の本命には思えませんでした。 > 結論としては、[キーダウン]イベントハンドラは必要ないです。 > > なぜならば、[入力後]イベントハンドラが呼び出す一般手続きですべて処理できるからです。 > > 結局、先回りして数字と正負記号以外の文字キーをブロックしても、ほとんど無意味という事なんです。 > ・・・・・・・・・・・・・・・・・・・・・・・・・・・・◎◎◎◎◎◎◎・・・・・・・・ > > つまり、問題解決の本質部分は、[キーダウン]イベントハンドラにあるのではなくて、[入力後]イベントハンドラにあるということです。(^^ok >
サンプルありがとうございました
確かにそうですね ありがとうございました
先日の投稿で 勝手にお名前出してすみませんでした(×_×)
|
|
|
■15081 / ResNo.20) |
Re[3]: 数値型項目で入力の際数値以外のキーを受け付けない
|
□投稿者/ まさやん -(2025/08/09(Sat) 18:31:34)
| > &string = #str( #num( &string ) )
考えてみれば
簡単に言うと
上のコマンドを 入力後イベントで処理すればいいっていうことなんですね
入力後イベント の チェックマーク入れなかったので 桐からのメッセが出て それ以降のイベントが 走らなかったので その対処策を 考えた次第です
対処策の 方法が 入力後イベント走らせたほうが 正解だったのと 自然な成り行きですもんね
確かに 今まで 数字と数字以外の混ざった データを
#num(&〇〇) で
数値だけになってました そうでした ありがとうございます。
|
|
|
■記事リスト /
レス記事表示 →
[親記事-9]
[10-19]
[20-20]
|