- PR -

テキストボックスの入力制限をするには? (Windows.Forms)

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-05-10 09:49
引用:

APIはあくまでも部品で自分が目的とする機能はAPIやらなんかのメソッド自分で実装するか。別の方法で要求を実現するものだと思いますが


そうですか。それは残念なことです。近年は高レベルAPIが整備されデベロッパーに優しいイージープログラミングがトレンドかと思っていました。私は Java は言語に価値があるのではなく整備された膨大な標準ライブラリに価値があると思っています。Java は言語ではなく環境だと思っているのです。

.NET Framework についても同じように思っていました。C# や VB.NET という言語に価値があるのではなく .NET Framework という整備されたライブラリ群に価値があるのだと。.NET のこのような傾向は Java よりも顕著で、Visual Studio という GUI 開発環境での利用しやすさを視野にいれて言語仕様やライブラリの仕様が決められているように思えるものもありました。

引用:

.NET Framework は Windows の API をできるだけ意識せずにプログラミングできるように作られています。しかし、意識しないとはいえ使っているのですから、理解しておく必要はあるでしょう。理解していなくてもある程度のものは作れますよ。


言いたいことは分かります。ただ、私が期待していたレベルに .NET Framework は、まだ達していなかったというだけのことです。

引用:

Swing には明るくありませんが、Swing にだって基本機能だけでできることと、そうでないことがあるでしょう?で、そこを超えたら「インラインアセンブラ」「JNI」のようなものを使うしかなくなるわけで….NET もそうだというだけだと思います。基本機能でカバーしている範囲が違うということでしょう。


その通りだと思います。そして、.NET Framework が基本機能としてカバーしている範囲が私が期待したほどのものではななかったというだけのことです。

引用:

さらにこの手の掲示板では必ずしもピンポイントの解答をもらえるわけではありません。


そうですね。そのくらいのことは承知しています。私はピンポイントの回答をよこせと言っているわけではありません。提示していただいたキーワードで検索して流し読みはしました。よねKENさんの指摘に対して流し読みしかしなかったことについては申し訳ないと思っています。

「やはりウィンドウメッセージを使わないといけませんか。」
「期待はずれでした。」
「あきらめてウィンドウメッセージを使います。」

という私の出した結論に何か問題がありましたか? 私は、これでこのスレはクローズするものと思っていましたが「知っていて聞いていたのならそう書いておけばよかったのに。」という自分の回答の稚拙さを棚に上げて、質問者には高いレベルを要求する発言がありましたので、検索を促すだけの回答のほうが質が低い、私ならそういう回答はしないという考えを述べました。質問するなら最低限のことは書かなくてはいけない、同じように、回答するなら最低限のことは書いたほうがいいと思います。それだけのことです。

引用:

TextBox に DocumentFilter がないという理由だけで、.NET Framework の採用を諦めるのですか?ないものは作ればよいという発想はないのでしょうか?


.NET Framework の採用を諦めるとは一言も言っていませんよ。私は結論として「あきらめて WM_CHAR, WM_PASTE を統合して DocumentFilter まがいのものを自作してみることにします。」と書いています。

「ないものは作ればよい」という単純な発想は私にはないですね。趣味だけでやってることではないので。「低レベルインターフェイスを使えばできる」というときに「がんばって作る」以外に「他のアーキテクチャを選定しなおす」「入力値の制限仕様を緩和する」などの選択肢も考えます。今回は「がんばって作る」を選択しましたけど。

単純に「ないものは作ればよい」なんて言っている人は、システム設計能力の低いバカだと思います。うちの会社にも「提示された仕様どおりに実現しなくては」と、ものすごい工数をかけて作業している人がいますがバカですね。「この仕様をちょっとこう変更したら簡単に作れるんですが」くらいのこと言えんのかと。
RUN
常連さん
会議室デビュー日: 2007/10/05
投稿数: 32
お住まい・勤務地: 東京都
投稿日時: 2008-05-10 12:46
引用:

未記入さんの書き込み (2008-05-10 09:49) より:

近年は高レベルAPIが整備されデベロッパーに優しいイージープログラミングがトレンドかと思っていました。

「ないものは作ればよい」という単純な発想は私にはないですね。趣味だけでやってることではないので。「低レベルインターフェイスを使えばできる」というときに「がんばって作る」以外に「他のアーキテクチャを選定しなおす」「入力値の制限仕様を緩和する」などの選択肢も考えます。今回は「がんばって作る」を選択しましたけど。

単純に「ないものは作ればよい」なんて言っている人は、システム設計能力の低いバカだと思います。



正直、プログラマというかIT技術者に向いてないんじゃね?
貴方の意見って単なるユーザー我侭レベルの意見にしか見えないんだけど。

高レベルとか低レベルとかの定義をどうするかという問題もあるが、貴方の定義の話で行くなら、
言語としての基本実装は低レベルであるべき。
と自分は思ってますよ。
低レベルって言うのは逆に言えば、組み合わせる事によって出来る事の幅が広がる状態。
高レベルといって言語側に全てを用意させようとしたら、ちょっとした不満点があるたびにこの要求に合うオブジェクトを用意しろと、いって、大量の重複ライブラリを要求するだけにしかならない。

貴方のように、既存の物で全てを賄いたい、自分では作りたくないって言うなら、
要求に見合う(有償)サードパーティツールを探すか、
なければ有償で何処かの会社に作ってもらえばよいだけでしょ。

貴方の言う理想の状態ってのは単純にプログラマという職業の否定でしかないんだよ

金融システムにしろ何とか管理システムとか付く代物にしろ、
「ないものは作ればよい」
という考えがあるからこそ、巨額の金額が投資されてプロジェクトが立ち上がってるわけだ。

「ないものは作ればよい」という理由で仕事にありついているのに、
言語側で全てを用意しろというなら、それは単なる自己否定じゃないかね?

プログラムを趣味でやってるなら、我侭言い放題でもかまわないが、仕事としてやってるんだろ?
「ないものは作ればよい」なんて言うのは馬鹿だ、全てを言語側でサポートすべきだ
って、それのどこにプロフェッショナルなプライドがあるんですか?

「ないものは作ればよい」を自然と実践できない時点で、プロ失格ただの素人だと思いますよ
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2008-05-10 12:51
引用:

未記入さんの書き込み (2008-05-10 09:49) より:
単純に「ないものは作ればよい」なんて言っている人は、システム設計能力の低いバカだと思います。うちの会社にも「提示された仕様どおりに実現しなくては」と、ものすごい工数をかけて作業している人がいますがバカですね。「この仕様をちょっとこう変更したら簡単に作れるんですが」くらいのこと言えんのかと。


まぁ「ちょっと変更しただけで・・・」と言うくらいはいいとは思うけど、色々と誤解している所があるのではないでしょうか?

日本で電化製品の電源プラグがちょっと足りなかったからと言って、そこにあったアメリカ仕様のプラグをつけてしまったら使い物にならなくなります。

ンー。ふと思ったんだけど、もうちょっと設計の経験をしてみてから考え直してみてはどうでしょ?
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-05-10 13:50
引用:

正直、プログラマというかIT技術者に向いてないんじゃね?


そうですか。私はあなたの意見を読んで、あなたのほうがIT技術者に向いていないと感じました。これは、つまり私とあなたでは考え方が違うということですから。私がIT技術者に向いていないように、あなたの目に映るのは仕方のないことなのかもしれませんね。

引用:

高レベルとか低レベルとかの定義をどうするかという問題もあるが、貴方の定義の話で行くなら、言語としての基本実装は低レベルであるべき。と自分は思ってますよ。


もちろん、逃げ手としての低レベルAPIは必要だと思います。でも低レベルAPIと高レベルAPIは共存できないものではないですよね?さらに高レベルAPIがあったら良いと思うのは技術者として失格でしょうか。

引用:

低レベルって言うのは逆に言えば、組み合わせる事によって出来る事の幅が広がる状態。
高レベルといって言語側に全てを用意させようとしたら、ちょっとした不満点があるたびにこの要求に合うオブジェクトを用意しろと、いって、大量の重複ライブラリを要求するだけにしかならない。


低レベル、高レベルというのは相対的なものですし、高レベルなAPIのすべてが汎用性を失って特定用途に特化したものではないと思います。

今回、私が例示した DocumentFilter などはウィンドウメッセージに比べれば、高レベルですが、アプリケーション開発という視点でみれば DocumentFilter もまだまだ低レベルAPIなんです。実際には入力制限の仕様に合わせて DocumentFilter のサブクラスを作成して、いくつかのメソッドをオーバーライドするわけですから。

私は実際にはもっと複雑な入力制限があると書きました。現時点では、入力制限の具体的な内容は決まっていませんが、入力制限の種類に応じて、TextBox のサブクラスをいくつか作る必要があるだろうと思っています。

守秘義務があるので、まったく関係ない例を出しますが「奇数と偶数が交互にしか入力できない TextBox」を作成する必要があるとしましょう。(これは、最初に '1' という文字が入力されたら次に入力を受け付けるのは '0', '2', '4', '6', '8' ということです。)

このときに「奇数と偶数が交互にしか入力できない TextBox が .NET で提供されていますか?」と質問したのなら、今回のような反発を受けても仕方がないとは思います。こんな特定用途に特化したものまで .NET Framework で用意されていて欲しいとは思いませんし、そのようなライブラリがすばらしいとは誰も思わないでしょう。

私の例示した DocumentFilter という要求は、そこまで特定用途に特化したものだとは思えません。「奇数と偶数しか交互に入力できない TextBox」などの特定用途の実装を作るために、キー入力とペースト、つまりテキストの変更を事前に知り、対応できる仕組みがありませんか?ということなのですよ。

DocumentFilter が「ちょっとした不満」「要求に合うオブジェクトを用意しろ」「大量の重複ライブラリ」というふうに、あなたの目に映るのなら、もう何も言いますまい。.NET 関係の開発技術者が、あなたのような低レベルAPIだけで十分という考えの人ばかりだとしたら、.NET Framework の未来は明るくないでしょうね。.NET の開発をするために、Win32APIやウィンドウメッセージを知っていなければならないことを「当たり前です」という人達ですからね。現状がそうだったとしても「残念ながら、いまの .NET ではウィンドウメッセージを使わないとできません。」くらいのこと言えないんですかね。ウィンドウメッセージを使わないといけないことを「当たり前」なんて言っていて恥ずかしくないんですか?.NET Framework を一生懸命に擁護しているあなたたちと違って、マイクロソフト自身は、もっと高いレベルの開発環境を目指しているように思えますけど。(WPFなどを見るとウィンドウメッセージ非依存を推し進めているように感じます。)

引用:

既存の物で全てを賄いたい、自分では作りたくないって言うなら、


作りたくないなんて言ってませんよ。私は誠実な人間なので、あなたたちの反発に対しても、私の考えをちゃんと説明しているつもりですが、あなたたちは私の発言の捏造、極論ばかりですね。

「作りたくない」のではなく単純に「なければ作ればよい」という発想はバカだと言ってるんです。「なければ作ればよい」という発想がバカなのと同時に「なければあきらめればよい」という発想もバカだと思います。

「なければ作ればよい」「なければあきらめればよい」どちらも、技術者として失格です。。「ないときはどうするか検討する」というのが正解でしょう。腕に自信のあるプログラマほど「なければ作ればよい」という発想で、すぐに、なんでも作ろうとするようです。

「作る」という選択は、開発コスト、開発期間はもちろんのこと枯れていないという点で品質の低下につながることもあります。仕様を変更するなど「作らない」という選択も技術者にとっては重要なことなんですよ。

「奇数と偶数が交互かどうかチェックするのは Validating のタイミングで許して」という選択もありますけど、DocumentFilter のような基本的なものは、この機会に仕組みとして作っておいたほうが良いと私は判断したので作ります。

引用:

「ないものは作ればよい」という考えがあるからこそ、巨額の金額が投資されてプロジェクトが立ち上がってるわけだ。「ないものは作ればよい」という理由で仕事にありついているのに、言語側で全てを用意しろというなら、それは単なる自己否定じゃないかね?


歪んだ構造ですね。そのような商売が、いつまでも通用すると思っているのでしょうか。アメリカ人はERPパッケージに合わせて自社の業務フローを変えるんだそうです。それに対して、日本人は自社の業務フローに合わせて、いたれりつくせりのカスタムシステムを受託開発させるんだそうです。

日本でも既存パッケージに業務を合わせていく、という流れになったら、あなたの発想では仕事にありつけなくなるかもしれないですね。

引用:

プログラムを趣味でやってるなら、我侭言い放題でもかまわないが、仕事としてやってるんだろ?


そうです。仕事でやっているから「作らない」という選択が重要になるんです。

引用:

「ないものは作ればよい」を自然と実践できない時点で、プロ失格ただの素人だと思いますよ


そうですか。私には「ないものは作ればよい」という発想こそ素人もしくは、開発期間に縛られない趣味プログラマの発想だと思いますけど。

今回のことで、このようなバカがうちの会社だけでなく、世間的にもいるんだということが分かって勉強になりました。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2008-05-10 15:08
引用:

ぶさいくろうさんがおっしゃっているのは「WM_PASTEに応答する方法は知っているけど、使いたくない」という意思表示かと。


よねKEN氏。フォローありがとです。
それもあったんだけど最初の投稿のことも言いたかったのね。
引用:

未記入さんの書き込み (2008-05-10 00:33) より:
そこまで意思表示しないといけませんでしたか。ここの回答者の方々は質問者に対する要求レベルがずいぶんと高いようですね。私に言わせれば、今回の件では、質問の質より、ぶさいくろうさんの回答の質のほうが低いと感じました。

私だったら「よくある質問」「検索結果の上位にピンポイントで回答が出てくる」ようなときくらいしか「○○で検索して」という回答はしません。今回は、検索結果の上位にピンポイントの回答は出てきませんでした。


確かに未記入氏が要求している結果は出てこない。
別解でしかないのは確かなので俺の非は認める。

少なくとも俺が「それをかいとけよ」と要求するならば俺も書いておくべきところは書いておくべきだという理屈はわかるので。
素直に謝罪しようと思う。
引用:

私の要求レベルが、ぶさいくろうさんには理解できなかったのだと思いますが「Java には


いや理解していたんだけど「それは無理だからこの方法があるよ」って書いておけばよかったんだろうね。
その点も俺に非があるだろう。

人の日記に突撃してきて返り討ちとか言っているバカがいるから一応俺の視点で説明させてほしい。
実は俺はWM_PASTEやWM_CHARで捉える方法は知らないんじゃないかと思って書いたんだね。
なぜかっていうと。
引用:

・KeyDown を処理する方法だとクリップボードからのペーストに対応できない。
・TextChanged は発生時点で Text が変更されているので手遅れ。
・MaskedTextBox で対応できるような簡単な入力制限ではない。


未記入氏が列挙した中に含まれていなかったから。
それで「そんな方法くらい知っていた」ように
引用:

やはりそうなりますか…。


とあったのでそういう意味でも「知っていたなら」と書いた。
だから「読み込みが足りない+思い込みが激しいのかと思ったら」って書いたんだよね。
これはいろんな意味で取れちゃう言葉だから俺の書き方が悪かったと思う。

仮に未記入氏が知っていたにしても知らなかったにしても当初の要求レベルを理解しておきながら別解を無言で示そうとした俺がえらそうなことをいってはいけないだろう。
まさしく未記入氏が反論してくれたとおりで言い返す言葉もなし。

ちなみにお詫びにはならんと思うがひとつだけこの件について書かせてほしい。
別に読まなくていいし参考にもしなくていい。
DocumentFilterみたいなものを作るのなら根本的にいちからコントロールを作って自分で描画するようなコントロールでないと結局WM頼りになりかねないと思われる。(といってもベースがControlなだけでWMレベルのものがもとからあったりするんだけど)
あとWMは俺もあまり好きではない。別に.NET Frameworkを擁護しているつもりもないし純粋にWMは気持ち悪いと思っているやつはいっぱいいるはずなんだけどね。

ともかくその後いろいろフォローしてくれた人にも迷惑をかけて申し訳ない。
発端は俺の投稿からだと思うので責任を感じてる。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-05-10 15:28
引用:

未記入さんの書き込み (2008-05-10 09:49) より:
「やはりウィンドウメッセージを使わないといけませんか。」
「期待はずれでした。」
「あきらめてウィンドウメッセージを使います。」

という私の出した結論に何か問題がありましたか? 私は、これでこのスレはクローズするものと思っていましたが「知っていて聞いていたのならそう書いておけばよかったのに。」という自分の回答の稚拙さを棚に上げて、質問者には高いレベルを要求する発言がありましたので、検索を促すだけの回答のほうが質が低い、私ならそういう回答はしないという考えを述べました。質問するなら最低限のことは書かなくてはいけない、同じように、回答するなら最低限のことは書いたほうがいいと思います。それだけのことです。


個別の質問・回答についてのやりとりについては意見は控えさせていただきますが、私は未記入さんの上記のご意見についてはおおむね賛同いたします。

ディベートのテクニックとして、回答者が回答を具体的にせず抽象的なまま小出しにするというのも100%は否定しなくても良いかとは思います。占い師のように、あとでどうにでも解釈できるような回答も、あればあったで面白いかもしれません。
しかし、そういう回答をする回答者が、自分を棚に上げて質問者を責めれば、それは不公平だと感じます。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-05-10 15:40
引用:

実は俺はWM_PASTEやWM_CHARで捉える方法は知らないんじゃないかと思って書いたんだね。
なぜかっていうと。


.NET Framework で WndProc をオーバーライドできてウィンドウメッセージを扱えるということは知っていました。ですが、どのメッセージを捉えなければいけないかなど、具体的にどうするかという知識は持っていませんでした。WM_PASTE は VB6.0 で利用したことがある程度です。

この程度の認識なので「がんばってウィンドウメッセージを弄べば実現できないことはないだろう、という認識は持っていました。」ということを後になって書きました。

最初の質問時点で書くとしたら「ウィンドウメッセージ使えば実現できなくはないと思いますが」と前置きしたほうがベターだったとは思います。ただ、ここまで冗長な説明記述を質問者に要求するのは、いかがなものかと(いまだに)思っています。

ここまで要求されると、特殊なハードウェア制御が C言語でできるかを質問するときに「インラインアセンブラを使えば実現できなくはない思いますが」と前置きしなければならなくなるし、Java で質問をするときにも「JNIを使えば実現できなくはないと思いますが」と前置きしなければならなくなるように思います。

引用:

とあったのでそういう意味でも「知っていたなら」と書いた。


私が知っていたのは逃げ手として WndProc という低レベルインターフェイスが用意されているということだけです。具体的に何をどうすればいいのかは知りませんでいた。

そして、いま実装をはじめようとしていて、いろいろと調べたり実験したりしています。コードによるドキュメント(テキスト)に対応するには、WM_CHAR, WM_PASTE だけでなく、WM_SETTEXT も拾わないといけないのか? WM_CHAR は拾わなくても KeyDown でいけるのか?とか調べている最中です。

引用:

DocumentFilterみたいなものを作るのなら根本的にいちからコントロールを作って自分で描画するようなコントロールでないと結局WM頼りになりかねないと思われる。(といってもベースがControlなだけでWMレベルのものがもとからあったりするんだけど)


さすがにそこまでやるのは(私には)無理です。それはキャレットや文字反転色などの表示も自分で描画するってことでしょう? そこまでやろうとすると、Swing や WPF のようなライトウェイトコンポーネントフレームワークを自作するようなイバラの道のように思えますので、今回は TextBox のサブクラスで実現できるか模索してみます。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2008-05-10 16:04
引用:

unibonさんの書き込み (2008-05-10 15:28) より:
しかし、そういう回答をする回答者が、自分を棚に上げて質問者を責めれば、それは不公平だと感じます。


まさしく今回の俺のことだね。
1つ前の投稿にも書いたので繰り返しになるけどその点は反省しておるところです。
時間からしてたぶん俺の投稿を見る前に書いたと思われるけど一応わかっているということで反応しときやす。
引用:

未記入さんの書き込み (2008-05-10 15:40) より:
.NET Framework で WndProc をオーバーライドできてウィンドウメッセージを扱えるということは知っていました。ですが、どのメッセージを捉えなければいけないかなど、具体的にどうするかという知識は持っていませんでした。WM_PASTE は VB6.0 で利用したことがある程度です。

この程度の認識なので「がんばってウィンドウメッセージを弄べば実現できないことはないだろう、という認識は持っていました。」ということを後になって書きました。


そうだったのね。それならいろいろ合点がいく。
最初からすべて知っていたのかと勘違いしてちょっと怒ったように書いてしまった俺がむなしい。
引用:

最初の質問時点で書くとしたら「ウィンドウメッセージ使えば実現できなくはないと思いますが」と前置きしたほうがベターだったとは思います。ただ、ここまで冗長な説明記述を質問者に要求するのは、いかがなものかと(いまだに)思っています。


もちろん今となってはそこに関しても否定はする気はない。
後発にあった言葉のニュアンスだけで勝手にいろいろ妄想した俺が悪いと思ってます。
引用:

そして、いま実装をはじめようとしていて、いろいろと調べたり実験したりしています。コードによるドキュメント(テキスト)に対応するには、WM_CHAR, WM_PASTE だけでなく、WM_SETTEXT も拾わないといけないのか? WM_CHAR は拾わなくても KeyDown でいけるのか?とか調べている最中です。


コードによるというのが良くわからんですが。
this.textBox1.Text = "俺は不細工朗だ";とかの場合も弾くとかそういうこと?
ユーザサイドからの入力ならWM_CHARとWM_PASTEで問題なさそうな気はするんだけど。
引用:

さすがにそこまでやるのは(私には)無理です。それはキャレットや文字反転色などの表示も自分で描画するってことでしょう? そこまでやろうとすると、Swing や WPF のようなライトウェイトコンポーネントフレームワークを自作するようなイバラの道のように思えますので、今回は TextBox のサブクラスで実現できるか模索してみます。


となるとDocumentFilterにかなり類似したものを求めているわけじゃないってことね。
途中からDocumentFilterさながらのものを求めているように見えていたけどそうじゃないんだね。
たぶん俺と同じ勘違い(未記入氏からすると読み違いになるか)をして書き込んでいる人もいると思う。
まあ食ってかかる前に相手の意図は理解しなきゃいけないんだろうけど今の俺にはそんなえらそうなこと言えないなぁ。

スキルアップ/キャリアアップ(JOB@IT)