お世話になります。
VC++ .NET2005 CLRで開発しています。
NumericUpDownコントロールにて初期値で00を表示させたいのですが方法が見つかりま
せん。NumericUpDownでは内部で数値を decimal 型として扱っているため無理そうでし
ょうか?どなたかアドバイスをお願い致します。
テキストボックス部に表示される文字列が0のときは00に書き換えるように
カスタマイズしたNumericUpDownの派生クラスを定義してはいかがでしょうか。
// 例
using namespace System;
ref class CustomNumericUpDown : public System::Windows::Forms::NumericUpDown {
public:
CustomNumericUpDown(){}
protected:
virtual void OnTextBoxTextChanged( Object^ source, EventArgs^ e ) override
{
if( this->Text->Equals( 0 ) ) {
this->Text = 00;
}
else {
NumericUpDown::OnTextBoxTextChanged( source, e );
}
}
};
iijimaさん
アドバイスありがとうございます。サンプルクラスとどのように連動させるのかが分か
りません。現在、フォーム上(form1)にnumericUpDown1という名前のコントロールが配
置されています。
C++/CLIならデザインコードも見えるので,Form1クラスの中に
iijimaさんの
>ref class CustomNumericUpDown
のコードを入れて、
自動生成されている
System::Windows::Forms::NumericUpDown^ numericUpDown1;
を
CustomNumericUpDown^ numericUpDown1;
に
numericUpDown1 = gcnew System::Windows::Forms::NumericUpDown();
を
numericUpDown1 = gcnew CustomNumericUpDown();
に変更するだけで使えるようになると思います。
ただし、デザインモードが使えなくなるかもしれません。
if( this->Text->Equals( 0 ) ) {
this->Text = 00;
}
上記のコード実行時に条件式に入るのですが実際の表示は00でなく0となってしまい
ます。
Blueさん
System::Windows::Forms::NumericUpDown^ numericUpDown1;
を
CustomNumericUpDown^ numericUpDown1;
上記で
c:\temp\test\test\Form1.h(52) : error C2143: 構文エラー : ';' が '^' の前にあり
ません。
c:\temp\test\test\Form1.h(52) : error C4430: 型指定子がありません - int と仮定
しました。メモ: C++ は int を既定値としてサポートしていません
c:\temp\test\test\Form1.h(52) : error C4430: 型指定子がありません - int と仮定
しました。メモ: C++ は int を既定値としてサポートしていません
c:\temp\test\test\Form1.h(76) : error C2039: 'numericUpDown1' : 'test::Form1'
のメンバではありません。
c:\temp\test\test\Form1.h(22) : 'test::Form1' の宣言を確認してくださ
い。
c:\temp\test\test\Form1.h(77) : error C2039: 'numericUpDown1' : 'test::Form1'
のメンバではありません。
c:\temp\test\test\Form1.h(22) : 'test::Form1' の宣言を確認してくださ
い。
とエラーが出てしまいました。
>Form1クラスの中に
>iijimaさんの
>>ref class CustomNumericUpDown
>のコードを入れて、
はやりましたか?
public ref Form1 : System::Windows::Forms::Form
{
/*
ここらへんに入れる !!!
*/
publuc:
Form1()
{
// 省略
};
となっていないと使えません。
Blueさんがおっしゃる方法でもできますが、その後デザインモードが使えなくなる
可能性があるのであまりお勧めではありません。
(1) メニューの[プロジェクト]-[クラスの追加]で[クラスの追加]ダイアログボックス
を開く
(2) カテゴリの[C++]を選択して[追加]ボタンをクリックし[汎用C++クラスウィザード]
ダイアログボックスを開く
(3) 次のように設定して[完了]ボタンをクリック
・クラス名:CustomNumericUpDown
・基本クラス:System::Windows::Forms::NumericUpDown
・「マネージ」チェックボックスをチェック
(4) するとCustomNumericUpDownクラスのファイル(*.h, *.cpp)が生成されるので、
必要なコードを書き加える(この場合はOnTextBoxTextChangedのオーバーライド)
(5) ここで一旦ビルドすると、ツールボックスの[プロジェクト名]コンポーネントの
ところにCustomNumericUpDownが追加される。
(6) 普通のコントロールと同様にそれをフォーム上に貼り付けると、初期化に必要なコ
ードはデザイナによって自動生成される。
(7) Form1.hファイルの先頭付近に「#include CustomNumericUpDown」を加える。
これでいけると思います。
CustomNumericUpDownをどこかの名前空間に入れたりするなどは、お好みに応じて。
iijimaさん
アドバイスありがとうございます。
(4) するとCustomNumericUpDownクラスのファイル(*.h, *.cpp)が生成されるので、
必要なコードを書き加える(この場合はOnTextBoxTextChangedのオーバーライド)
上記はCustomNumericUpDown.cpp内
CustomNumericUpDown::CustomNumericUpDown(void)
{
}
に
protected:
virtual void OnTextBoxTextChanged( Object^ source, EventArgs^ e ) override
{
if( this->Text->Equals( 0 ) ) {
this->Text = 00;
}
else {
NumericUpDown::OnTextBoxTextChanged( source, e );
}
}
上記を記述するということでしょうか?本当、初心者ですみません(><)
hファイルとcppファイルに分けて定義するなら次のようになります。
// .hファイル
#pragma once
using namespace System;
ref class CustomNumericUpDown : public System::Windows::Forms::NumericUpDown {
public:
CustomNumericUpDown();
protected:
virtual void OnTextBoxTextChanged( Object^ source, EventArgs^ e ) override;
};
// .cppファイル
#include StdAfx.h
#include CustomNumericUpDown.h
CustomNumericUpDown::CustomNumericUpDown()
{
}
void CustomNumericUpDown::OnTextBoxTextChanged( Object^ source, EventArgs^ e )
{
if( this->Text->Equals( 0 ) ) {
this->Text = 00;
}
else {
NumericUpDown::OnTextBoxTextChanged( source, e );
}
}
# C++/CLIの前に標準C++をきちんと勉強することをお勧めします。
たびたびすみません。
#pragma once
using namespace System;
ref class CustomNumericUpDown :
public System::Windows::Forms::NumericUpDown
{
public:
CustomNumericUpDown(void);
protected:
virtual void OnTextBoxTextChanged( Object^ source, EventArgs^ e ) override
{
if( this->Text->Equals( 0 ) ) {
this->Text = 00;
}
else {
NumericUpDown::OnTextBoxTextChanged( source, e );
}
}
};
として上手くビルド出来たのですが肝心のCustomNumericUpDownが追加されていません
おそらくそのコードがコンパイルされていないから。
全てヘッダファイル(*.h)に書き、どのcppファイルでもインクルードしていないので
は?
Form1.hファイルの#pragma onceの次の行に
#include CustomNumericUpDown.h
を加えてからビルドすべし。
あるいは、フォームデザイナを表示していないとかではないですか。
フォームデザイナを表示していないときはツールボックスの中身も
表示されませんので。
Form1.hファイルの#pragma onceの次の行に
#include CustomNumericUpDown.h
を加えてからビルドすべし。
う~ん、ヘッダファイルもインクルードしているのに追加されません。。もう少し考え
て見ます
上記アドバイスどおりやったのですがのカスタムコントロールを作成できなかったので
String^ a = numericUpDown1->Text;
String^ b = a->PadLeft(2,'0');
numericUpDown1->Text::set(b);
と簡単に記述してみましたが00とは表示してくれませんでした・・・。
やりたいことは時刻を選択するアプリで
□:□として□をnumericUpDownで00,01,02,03と表示させたいのです。