NumericUpDownコントロールで”00”表示する方法 – プログラミング – Home

NumericUpDownコントロール...
 
通知
すべてクリア

[解決済] NumericUpDownコントロールで”00”表示する方法

固定ページ 1 / 2

KEN
 KEN
(@KEN)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

お世話になります。

VC++ .NET2005 CLRで開発しています。

NumericUpDownコントロールにて初期値で00を表示させたいのですが方法が見つかりま
せん。NumericUpDownでは内部で数値を decimal 型として扱っているため無理そうでし
ょうか?どなたかアドバイスをお願い致します。


引用未解決
トピックタグ
iijima
 iijima
(@iijima)
ゲスト
結合: 21年前
投稿: 44
 

テキストボックス部に表示される文字列が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 );
}
}
};


返信引用
KEN
 KEN
(@KEN)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

iijimaさん

アドバイスありがとうございます。サンプルクラスとどのように連動させるのかが分か
りません。現在、フォーム上(form1)にnumericUpDown1という名前のコントロールが配
置されています。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

C++/CLIならデザインコードも見えるので,Form1クラスの中に
iijimaさんの
>ref class CustomNumericUpDown
のコードを入れて、

自動生成されている

System::Windows::Forms::NumericUpDown^ numericUpDown1;

CustomNumericUpDown^ numericUpDown1;

numericUpDown1 = gcnew System::Windows::Forms::NumericUpDown();

numericUpDown1 = gcnew CustomNumericUpDown();

に変更するだけで使えるようになると思います。

ただし、デザインモードが使えなくなるかもしれません。


返信引用
KEN
 KEN
(@KEN)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

if( this->Text->Equals( 0 ) ) {
this->Text = 00;
}

上記のコード実行時に条件式に入るのですが実際の表示は00でなく0となってしまい
ます。


返信引用
KEN
 KEN
(@KEN)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

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' の宣言を確認してくださ
い。

とエラーが出てしまいました。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>Form1クラスの中に
>iijimaさんの
>>ref class CustomNumericUpDown
>のコードを入れて、
はやりましたか?

public ref Form1 : System::Windows::Forms::Form
{
/*
ここらへんに入れる !!!
*/
publuc:
Form1()
{
// 省略
};

となっていないと使えません。


返信引用
iijima
 iijima
(@iijima)
ゲスト
結合: 21年前
投稿: 44
 

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をどこかの名前空間に入れたりするなどは、お好みに応じて。


返信引用
KEN
 KEN
(@KEN)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

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 );
}
}

上記を記述するということでしょうか?本当、初心者ですみません(><)


返信引用
iijima
 iijima
(@iijima)
ゲスト
結合: 21年前
投稿: 44
 

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++をきちんと勉強することをお勧めします。


返信引用
KEN
 KEN
(@KEN)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

たびたびすみません。

#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が追加されていません


返信引用
iijima
 iijima
(@iijima)
ゲスト
結合: 21年前
投稿: 44
 

おそらくそのコードがコンパイルされていないから。
全てヘッダファイル(*.h)に書き、どのcppファイルでもインクルードしていないので
は?

Form1.hファイルの#pragma onceの次の行に

#include CustomNumericUpDown.h

を加えてからビルドすべし。


返信引用
iijima
 iijima
(@iijima)
ゲスト
結合: 21年前
投稿: 44
 

あるいは、フォームデザイナを表示していないとかではないですか。
フォームデザイナを表示していないときはツールボックスの中身も
表示されませんので。


返信引用
KEN
 KEN
(@KEN)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

Form1.hファイルの#pragma onceの次の行に

#include CustomNumericUpDown.h

を加えてからビルドすべし。

う~ん、ヘッダファイルもインクルードしているのに追加されません。。もう少し考え
て見ます


返信引用
KEN
 KEN
(@KEN)
ゲスト
結合: 22年前
投稿: 77
Topic starter  

上記アドバイスどおりやったのですがのカスタムコントロールを作成できなかったので

String^ a = numericUpDown1->Text;

String^ b = a->PadLeft(2,'0');

numericUpDown1->Text::set(b);

と簡単に記述してみましたが00とは表示してくれませんでした・・・。

やりたいことは時刻を選択するアプリで

□:□として□をnumericUpDownで00,01,02,03と表示させたいのです。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました