微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题在C++Builder中实现输入有效性验证
栏目软件世界
作者mamamia
发布2001年26期
  在一个非常有组织的程序中最重要的方面是有效性验证,也就是输入到应用程序中的数据是否正确。一旦数据存在于应用程序中并被保存在某些永久性存储体中,例如数据库,它便在那里完成整个生命周期,即使这个数据是不正确的或以无效格式存在的。例如只包含数字的域却包含着字母字符,本来要确保为整型值的域却包含十进制小数。由此导致的程序崩溃是否让你欲哭无泪,因为你在编写程序的时候知道什么域该填什么类型的数据,而用户可不管这些!
  在C++Builder中实现数据有效性验证是相当简单的事情!用个别内联函数便可轻松搞定。
  图中显示了我们将要在这个实例中建立的窗体。通过在如

所示的设计中添加两个编辑域,三个单选按钮和两个静态文本域构造这个窗体。我们将在这个实例中用多种方案实现输入有效性验证。
  首先我们给“只允许输入数字”单选按钮添加一个处理程序。如果选择了这个按钮,在其上方的编辑域将会显示“只允许输入数字:”。把下列代码加入C++Builder窗体的事件处理程序中:
  void_fastcall TForm1::RadioButton1Click(TObject *Sender)
  {
  Label1->Caption="只允许输入数字:";
  Edit1->OnKeyPress=Edit1KeyPress1;
  }
  然后我们给编辑域的KeyPress事件设置有效性验证处理程序,用到的是ctype.h中所包含的isdigit函数,处理程序名为:Edit1KeyPress1。代码如下:
  void_fastcall TForm1::Edit1KeyPress1(TObject *Sender,char &Key)
  {
  if(!isdigit(Key))
  Key=0;
  }
  这个程序只显示用户输入的每一个字符。ctype.h包含文件中的isdigit函数检查是否字符在0~9的范围内,如果字符在这个范围内,函数返回true,否则返回false。isdigit的语法是C++的简写方式,表明其下语句只将在函数返回false时才执行。将Key参数设为0,告知Edit组件这个字符将被忽略。
  编译并运行这个程序,我们将只能在Edit1中输入0~9之间的数字,键盘的其它键都将失去效用。
  类似的,我们为第二个单选按钮“允许小数点输入”添加处理程序:
  void_fastcall TForm1::RadioButton2Click(TObject *Sender)
  {
  Label1->Caption="允许小数点输入:";
  Edit1->OnKeyPress=Edit1KeyPress2;
  }
  我们发现Edit1KeyPress2的函数代码与第一个输入处理程序很相像:
  void_fastcall TForm1::Edit1KeyPress2(TObject *Sender,char &Key)
  {
  if(!isdigit(Key)&&Key!='.')
  Key=0;
  }
  最后一个单选按钮允许任意输入,我们如何实现它呢?看看下面的代码,是不是给你启发呢!
  void_fastcall TForm1::RadioButton3Click(TObject *Sender)
  {
  Label1->Caption="允许任意输入:";
  Edit1->OnKeyPress=NULL;
  }
  我们将OnKeyPress设置为NULL,而并不是把事件处理程序设置为方法。这清除了该程序的事件处理程序,并允许标准Edit组件处理程序(它包含任何字符)占有优先权!
  有时候我们可能喜欢等待用户在完成输入,然后当他们试图离开该域时再验证数据。C++Builder也能很容易地实现这个目的。
  为了在用户输入后处理数据有效性验证,就必须为第二个编辑域Edit2的OnExit事件添加一个处理程序。代码如下:
  void_fastcall TForm1::Edit2Exit(TObject *Sender)
  {
  bool bFlag=true;
  char s=Edit2->Text.c_str();
  //首先确定输入的是否都是数字
  for(int I=0;I<(int)strlen(s);++i=
  {
  char c=s[i];
  if(!isdigit(c))
  bFlag=false;
  }
  //检验是否通过
  if(bFlag==false)
  }
  MessageBox(NULL,"你只能输入数字!","错误",MB_OK);
  Edit2->SetFocus();
  return;
  }
  //以下检查数字是否在0~9之间
  long lVal=atol(Edit2->Text.c_str());
  if(lVal<0||lVal>9=
  {
  MessageBox(NULL,"你应该输入0~9之间的数字!","错误",MB_OK);
  Edit2->SetFocus();
  return;
  }
  }
  这个处理程序首先验证输入只包含数字。如果它不能够实现这个测试,将显示错误消息,并且输入焦点返回到有问题的编辑域中。
  整个程序更新后的包含文件如下(粗体为要添加的部分):
  class TForm1:public TForm
  {
  _published: //IDE-managed Components
  TLabel *Label1;
  TEdit *Edit1;
  TRadioButton *RadioButton1;
  TRadioButton *RadioButton2;
  TRadioButton *RadioButton3;
  TEdit *Edit2;
  TLabel *Label2;
  TBitBtn *BitBtn1;
  void_fastcall Edit1KeyPress1(TObject *Sender,char &Key);
  void_fastcall RadioButton1Click(TObject *Sender);
  void_fastcall RadioButton2Click(TObject *Sender);
  void_fastcall RadioButton3Click(TObject *Sender);
  void_fastcall Edit2Exit(TObject *Sender);
  private: //User declarations
  void_fastcall Edit1KeyPress2(TObject *Sender,char &Key);
  public: //User declarations
  _fastcall TForm1(TComponent* Owner);
  };
  OK,在C++Builder上实现数据有效性检验的方法差不多介绍完毕,如果读者有更多更好更妙的方法,也希望通过“编程乐园”与大家一起交流!