C-Builderで数値(数字)以外を入力出来ない様にする方法

このQ&Aのポイント
  • C-Builder V5で数値(数字)を入力すべきところで、実行時に文字等を入力すると、エラーメッセージが表示されるが、これを防ぐ為に数字以外をはじきたい。
  • 以前C-Builder V4で作った時は出来た様な気がしたが、どの様にやったか思い出せない。
  • Delphiのサンプルでは昔の方法を試したが、文字判定以前にEditの枠に既に文字が入ってしまっており、文字の排除が出来なかった。数字以外をはじく方法を知っている方、教えてください。
回答を見る
  • ベストアンサー

C-Builderで数値(数字)以外を入力出来ない様にしたい。

C-Builder V5 で数値(数字)を入力すべきところで、実行時に文字等を入力すると、システムからエラーメッセージが表示されるので、これを防ぐ為にEditで入力時に数字以外をはじきたいのですが、可能でしょうか。 以前C-Builder V4で作った時は出来た様な気がしたのですが、どの様にやったか思い出せないでいます。 ネットではC-Builderのサンプルが見つからず、Delphiのサンプルでは昔の記憶と同じ処理を行っていましたが、これだと文字判定以前にEditの枠に既に文字が入ってしまっており、文字の排除が出来ませんでした。 どなたか数字以外をはじく方法ご存知の方、お教え下さい。 // Edit1->ImeMode = imDisable; // 初期化部分で実行 void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key<48 || Key>57) { Key = 0; } }

質問者が選んだベストアンサー

  • ベストアンサー
noname#15691
noname#15691
回答No.1

KeyPressイベントでできます。 void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) { if(Key < '0' || Key > '9') Key = '\0'; }

TinyPine
質問者

お礼

有難う御座いました。KeyDown、KeyUp等色々やったつもりでしたがKeyPressを抜かしていた見たいです。

関連するQ&A

  • C-Builder OnChangeをマスク

    C-BuilderでEditのデーターが変化した時、ある処理をしています。 その処理の中で、入力内容が正しく無い時はエラーメッセージを表示させ、Editの内容を入力された以前の状態に戻して居る為、その状態でも再度OnChangeイベントが発生してしまいます。 現在はbInhibitフラグを作って、これをルーチン内でtrueにする事で、再度OnChangeイベントが発生した時にルーチンの最初でreturnさせて二重割り込みを防ごうとしていますが、タイミングによっては二重割り込みが発生してしまいます。 これが内部での変更で無ければ Edit1->Enabled = false; とする事により、二重の割り込みは防げますが、今回はEdit1Changeの中で書き換えを行っている為、これでは二重割り込みを防げません。 何か二重割り込みを防ぐ方法がありましたらお教え下さい。 宜しくお願い致します。 bool bInhibit = false; void __fastcall TForm1::Edit1Change(TObject *Sender) { if( bInhibit == true ) return;   bInhibit = true;   -------- bInhibit = false; } }

  • テキストボックスに数値を入力できない。

    TStatickTextというツールを StaticText1 StaticText2 StaticText3 3つ使用して、StaticText1 ,StaticText2に入れた数字の合計をStaticText3に代入するため void __fastcall TForm1::Button1Click(TObject *Sender) { int test_total=0; int x = StaticText1->Caption.ToInt(); int y = StaticText2->Caption.ToInt(); test_total = x + y; StaticText3->Caption = test_total; } このようにプログラムを作ってデバッグをしました。そのときに ”StaticText1->Caption”に数字を入力することができないのですが、入力するために必要な設定などありますでしょうか? 現在Code Gear C++ builder 2009でプログラムしています。 どうぞ教えて頂きますよう、よろしくお願いします。

  • AVIファイルを読み込む方法

    C++でプログラミング中の者です。 使っているコンポーネントはanimate、MediaPlayer、Edit、Botton、OpenDialogです。 OpenDialogで選択したファイル名をEditに表示させ、Mediaplayerを使ってAnimateに表示させるプログラミングをしたいと思っています。 なかなかうまくいかないので、アドバイスお願いいたします。 次のは現在のプログラムです。 #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //OpenDialog1->DefaultExt = "AVI"; //OpenDialog1->FileName = "*.avi"; if(OpenDialog1->Execute()==true){ // ファイル名が選択されたときに実行する処理  Edit1->Text=OpenDialog1->FileName; //Edit1に選択したファイル名を表示 //Animate1->Active=LoadFromFile(OpenDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Edit1Change(TObject *Sender) { MediaPlayer1->Open(); MediaPlayer1->Play(); } //---------------------------------- よろしくお願いします。

  • VB.net 割り込みの禁止

    Borland C-Builder++の内容をVB.net 2010に書き換えて居る者です。 TextBox等の割り込みを一時的に禁止したいのですが、良い方法はありませんでしょうか。 無ければフラグを用いて、フラグが立っている時のみ処理をバイパスさせる事を考えて居ます。 Builder では ComboBox1->OnChange = NULL ; とコーディングする事により、 void __fastcall TForm1::ComboBox1Change(TObject *Sender) { Edit1->Text = ComboBox1->Text; } への割り込みを禁止出来、 ComboBox->OnChange = ComboBox1Change; とコーディングする事により割り込みを再開出来ました。 これを void __fastcall TForm1::ComboBoxChange(TObject *Sender) {     ComboBox1->OnChange = NULL ; Edit1->Text = ComboBox1->Text;     ComboBox->OnChange = ComboBox1Change; } とコーディングする事により、2重割り込みを防止していました。 VBでこの様にイベント割り込みを一時的に禁止にする方法はありますでしょうか。 宜しくご回答下さい。

  • C++builderにおけるwhile()の使い方

    はじめまして、当方プログラムの初心者ですのでわかりづらい質問をしていますかもしれませんがよろしくお願いします. (質問)Borland C++ Builderを使っています。現在困っている点は単純に説明します.プログラムではウィンドウ上のボタンを押したというイベントが起きるとwhile()の無限ループに入るようになっています.このままだと実行したときにフリーズしてしまうのでwhile内にApplication->ProcessMessageを入れてあります. void __fastcall TMain_Form::Button1Click(TObject *Sender) {  while(1){ Application->ProcessMessage .............. } } このようなwhile突入ボタンがひとつのときはいいのですが、複数のボタンを作って、それぞれに対応するwhileを実行したいのですが、どうしてもひとつだけ動いて他が止まってしまいます. どなたか無限ループをマルチスレッドで複数、回らせる方法を教えてください. また、なんでもかんでもProcessMessageをいれてやればWINMAINに処理が移って、マルチスレッドになると思って使っているのですが間違いでしょうか? よろしくお願いします.

  • アプリケーションについて

    私は、Borland C++Builder5の環境下で、アプリケーションを作りはじめたのですが、一つ質問があります。 アプリケーションには、初めからTForm1というクラスが設定されていて、そのクラス内ではPaintBoxやEditを使用できることは分かるのですが、新たに自分で作ったクラス内(例えば、class Sampleというものを作ったとして)でPaintBoxやEditを使うことは出来ないのでしょうか? やはり、TForm1というクラスの中にSampleを入れ、一つにまとめなければ出来ないのでしょうか? 是非、ご教授下さい。

  • BCBでフォームの印刷

    Borland C++ Builder 5(Pro)を使っています。 TForm上にTImageを乗せ、そこにPolyline等で図形を描いています。 それを印刷したいのですが、TImageにはPrintメソッドがないので、 TFormのPrintメソッドを呼び出していますが、印刷できません。 プリンタのジョブを監視していると、何も印刷せずに「印刷済」になっています。 印刷ボタン、印刷設定ボタンのOnClickは以下のようになっています。 間違い等ありましたらご指摘ください。 // 印刷ボタン void __fastcall TGraphForm::PrintButtonClick(TObject *Sender) {   if(PrintDialog->Execute()){     GraphForm->Print();   } } // 印刷設定ボタン void __fastcall TGraphForm::PrtSetupButtonClick(TObject *Sender) {   PrinterSetupDialog->Execute(); }

  • Borland社のコンパイラを使ったDLL

    C++BuilderでDLLファイルを使っておりますが、Vectorコンテナの値をコールバック出来ませんでした。Vectorコンテナを使ったコールバックを可能とする記述方法を教えてください。 Edit1には、思惑通りに102が返ります。Edit2には、1が、Edit3には2が返ります。この例では、201、202を返したいのです。 本体側 #include <vector> ・ ・ extern "C" __declspec(dllimport) int __stdcall test(int*,vector<int>); #pragma package(smart_init) #pragma resource "*.dfm" using namespace std; TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { vector<int> b; b.push_back(1); b.push_back(2); int *a; *a=1; Edit1->Text = IntToStr(test(a,b)); Edit2->Text = IntToStr(b[0]); Edit3->Text = IntToStr(b[1]); b.clear(); dll側 extern "C" __declspec(dllexport) int __stdcall test(int*,vector<int>*);//コンテナの引数の実験 ・ ・ //----------------------------------------------------------------------------- int __stdcall test(int *a,vector<int> &b) { //dllの引数の可能性の実験 for(unsigned int i;i<b.size();i++){ b[i] +=200; } *a+=1; return *a+100; } //-----------------------------------------------------------------------------

  • C++ Builderでの自作関数

    C++ Builderでの自作関数 初心者のため、初歩的な質問で恐れ入ります。 今、C++ Builderを使いアプリを作成中なのですが、 下記のような自作関数を使いたいのですがどのように書くと エラーがでなくなるのでしょうか? main関数中で、あるif文に該当すると自作関数の内容を行いたいと思っています。 自作関数には、テキストファイルへ文字列データの書き出しをする内容を書いています 今、引数にはvoidを使っていますが、 「TForm1のサイズが不明、あるいはゼロ」「宣言の構文エラー」というエラーが出てしまいます。 voidにしているのが原因でしょうか? 何もわかっていなく恐縮ですが、よろしくお願いします!

  • 数字キーで数字の入力

    Hybrid W-Zero3 を使っています。 基本的な質問だとは思うのですが・・・ メールなどを書いている時、電話ダイアル用の数字キーで「数字」を入力するにはどうすればよいのでしょうか? 「1」を押すと「あ」とか出てしまいますし、「文字」キーを押しても「数字」という項目が見あたらなくて・・・ ソフトウェアキーボードを使えば可能ですが、なるべき数字キーで済ませたいと思っています。 よろしくお願いします。