C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: NumericUpDownコントロールの上下限チェック不具合


(過去ログ 93 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■55671 / inTopicNo.1)  NumericUpDownコントロールの上下限チェック不具合
  
□投稿者/ ホエホエ (26回)-(2010/12/09(Thu) 10:30:30)

分類:[.NET 全般] 

いつもお世話になっております、ホエホエです。

タイトルにもありますが、16進数符号なし32bit値(00000000h〜
FFFFFFFFh)を入力できる画面を作成しようと思い、
NumericUpDownコントロールを使用して実現しようと思いました。

上下限値、16進数表記設定をしたところ、キーボードからの
文字入力は7FFFFFFFhまでは入力を受付るんですが80000000h以上の
値を受付てくれません。

ただしスピンコントロールやカーソルキーの↑↓ボタン押下、
コード上でValueの値を強制的に設定すれば、きちんと
上下限の範囲で入力は可能です。


NumericUpDown numInput = new NumericUpDown();

(途中は割愛)

numInput.Maximum = (decimal)0xFFFFFFFF;
numInput.Minimum = 0;
numInput.Increment = 1;
numInput.DecimalPlaces = 0;
numInput.Hexadecimal = true;
numInput.Value = 0;


上記のような現象はNumericUpDownの仕様なのでしょうか?
そうだとしたら安易に対策できる方法はありませんか?

ちなみに環境は
WindowsXP SP3
VisualStudio2003 or 2008
です。

ご存知の方、教えてください。
引用返信 編集キー/
■55677 / inTopicNo.2)  Re[1]: NumericUpDownコントロールの上下限チェック不具合
□投稿者/ shu (264回)-(2010/12/09(Thu) 12:40:08)
No55671 (ホエホエ さん) に返信

そんなバグがあるとは。明らかにintとして扱われてますね。

テキストボックス直だけ駄目という事であれば以下の方法はどうでしょう?
(1)テキストボックス(Aとする)をもう一つ用意してNumericUpdown(Bとする)のテキストボックスの上に重ね
(2)AのValidate当たりでBのValueをAの内容をもとに更新
(3)BのValueChangeでAのテキストを変更
(4)(2),(3)の処理でぐるぐる回らないよう気を付ける

NumericUpDownのテキストボックスを捨てるという考え方です。

マイクロソフトに報告したほうがいいかもしれないです。
引用返信 編集キー/
■55679 / inTopicNo.3)  Re[2]: NumericUpDownコントロールの上下限チェック不具合
□投稿者/ ふー (1回)-(2010/12/09(Thu) 13:29:55)
すみません、↓間違っていませんか?
numInput.Maximum = (decimal)0xFFFFFFFF;

数値リテラルで最後に何もつけなかったら、intですよね。
0xFFFFFFFFのint型をdecimal型に変換したら、
その結果は当たり前のような。

longを指定
numInput.Maximum = (decimal)0xFFFFFFFFl;

decimalを指定
numInput.Maximum = 0xFFFFFFFFm;
で設定できませんか?
※未確認ですが。
引用返信 編集キー/
■55680 / inTopicNo.4)  Re[1]: NumericUpDownコントロールの上下限チェック不具合
□投稿者/ 魔界の仮面弁士 (1979回)-(2010/12/09(Thu) 13:30:34)
No55671 (ホエホエ さん) に返信
> 上下限値、16進数表記設定をしたところ、キーボードからの
> 文字入力は7FFFFFFFhまでは入力を受付るんですが80000000h以上の
> 値を受付てくれません。

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.numericupdown.hexadecimal.aspx
》 Hexadecimal プロパティを true に設定する場合、
》 Maximum プロパティを Int32.MaxValue に設定し、
》 Minimum プロパティを Int32.MinValue に設定する必要があります。

http://msdn.microsoft.com/en-us/library/system.windows.forms.numericupdown.hexadecimal.aspx
》 When the Hexadecimal property is set to true,
》 the Maximum property should be set to Int32.MaxValue and
》 the Minimum property should be set to Int32.MinValue.

と記載されています。

すなわち、16進表記モードでサポートされる最大値は
UInt32.MaxValue (0xFFFFFFFF) ではなく
 Int32.MaxValue (0x7FFFFFFF) という仕様なのでしょう。

引用返信 編集キー/
■55684 / inTopicNo.5)  Re[3]: NumericUpDownコントロールの上下限チェック不具合
□投稿者/ 魔界の仮面弁士 (1980回)-(2010/12/09(Thu) 14:30:23)
No55679 (ふー さん) に返信
> ※未確認ですが。
確認してみました。
0x7FFFFFFF.GetType().FullName は "System.Int32"  ですが、
0x80000000.GetType().FullName は "System.UInt32" ですし、
0xFFFFFFFF.GetType().FullName も "System.UInt32" ですね。


> 数値リテラルで最後に何もつけなかったら、intですよね。
int a = 0xFFFFFFFF; はエラーになります。

言語仕様書によれば、整数リテラルには
 ・10 進整数リテラル(decimal-integer-literal)
 ・16 進整数リテラル(hexadecimal-integer-literal)
の 2 種がありますが、そのいずれにおいても、
 ・サフィックスのないリテラルの場合は、int、uint、long、ulong のうち、
  その値を表すことができる最初の型になります。
だそうです。そのため、0xFFFFFFFF は 0xFFFFFFFFU と同値として扱われます。

なお、負数に関しては
 ・値 2,147,483,648 を持ち integer-type-suffix が指定されていない decimal-integer-literal が、
  単項マイナス演算子トークンの直後にトークンとして現れる場合、結果は値 -2,147,483,648 を持つ
  int 型の定数になります。
  それ以外のあらゆる状況では、このような decimal-integer-literal は uint 型になります。

 ・値 9,223,372,036,854,775,808 を持ち、integer-type-suffix が指定されていない、
  または integer-type-suffix L か l が指定された decimal-integer-literal が、
  単項マイナス演算子トークンの直後にトークンとして現れる場合、結果は
  値 -9,223,372,036,854,775,808 を持つ long 型の定数になります。
  それ以外のあらゆる状況では、このような decimal-integer-literal は ulong 型になります。
と記載されていました。

引用返信 編集キー/
■55687 / inTopicNo.6)  Re[4]: NumericUpDownコントロールの上下限チェック不具合
□投稿者/ shu (266回)-(2010/12/09(Thu) 14:47:46)
私も試してみました。(VB.NETですがまぁ同じでしょう)

NumericUpDown1.Maximum=100,000,000,000
NumericUpDown1.Minimum=-100,000,000,000
※十分に大きく設定

(1)『7FFFFFFF』を手入力 => OK
(2)(1)の状態で上ボタンをクリック => 『80000000』を表示 => OK?
(3)(2)の状態で最後の0を上書き書換え => 『FFFFFFFF80000000』を表示 => NG

※(3)はMinimumを0にしたら0になりました。






引用返信 編集キー/
■55697 / inTopicNo.7)  Re[5]: NumericUpDownコントロールの上下限チェック不具合
□投稿者/ ホエホエ (27回)-(2010/12/09(Thu) 16:20:57)
みなさま、ご返信ありがとうございます。


shuさん>
私の方でも
NumericUpDown1.Maximum = decimal.MaxValue;
NumericUpDown1.Minimum = decimal.MinValue;

で試してみましたがダメでした。

魔界の仮面弁士さんが書かれている通り、NumericUpDownコントロールが
HexadecimalをtrueにするとInt32の範囲しかダメなようです。

バグではないにしてもせめてdecimalの範囲内ぐらいはきちんと
動いて欲しいですねぇ。



ふーさん>
上記にもある通り、Maximumにdecimal.MaxValueを設定しても
ダメでした。

ちなみに「(decimal)0xFFFFFFFF」であったとしても
Maximumにはウォッチで見ると「4294967295」が入ってたので
問題ないようです。



魔界の仮面弁士さん>
貴重な情報ありがとうございます。やはりInt32までしかサポートしない
仕様なんですね。

サポートするように自信でSystem.Windows.Forms.UpDownBaseクラスの
派生を作らないとダメなんでしょうかね。
引用返信 編集キー/
■55701 / inTopicNo.8)  Re[6]: NumericUpDownコントロールの上下限チェック不具合
□投稿者/ 魔界の仮面弁士 (1981回)-(2010/12/09(Thu) 17:47:08)
No55697 (ホエホエ さん) に返信
> サポートするように自信でSystem.Windows.Forms.UpDownBaseクラスの
> 派生を作らないとダメなんでしょうかね。

継承元は、NumericUpDown で良いと思いますよ。今回の場合は
UpdateEditText や ValidateEditText をオーバーライドすれば良いかと。
http://social.msdn.microsoft.com/forums/en-US/winforms/thread/6eea9c6c-a43c-4ef1-a7a3-de95e17e77a8/
引用返信 編集キー/
■55715 / inTopicNo.9)  Re[7]: NumericUpDownコントロールの上下限チェック不具合
□投稿者/ ホエホエ (28回)-(2010/12/10(Fri) 09:16:42)
魔界の仮面弁士さん>
教えていただいたサイトを参考にしてできました!!

ありがとうございます!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -