TEdit和TCheckBox验证

时间:2015-08-12 22:28:58

标签: edit c++builder tcheckbox

我的目的是,当号码输入TCheckBox少于7位数时,用户将永远无法检查TEdit。此外,TCheckBox为空时,永远无法检查此TEdit

虽然TCheckBox为空,但我的代码有时会TEdit仍然可以检查。

此外,我的另一个目标是,如果在TEdit为空时选中TCheckBox时单击开始按钮,则永远不会执行开始按钮或始终显示错误消息。

问题是我应该在开始按钮中添加什么代码?。

我使用以下代码:

//--------------------------------------------------------------------------------
void __fastcall TForm::MyTEditBoxKeyPress(TObject *Sender, System::WideChar &Key)
{
    if( Key == VK_BACK ) return;
    if((Key < '1') || (Key > '9'))
    {
        MessageDlg("Please enter number only.",mtInformation, TMsgDlgButtons()<< mbOK, 0);
        Key = 0;
    }
}
//--------------------------------------------------------------------------------
void __fastcall TForm::MyTEditBoxExit(TObject *Sender)
{
    if (MyTEditBox->Text.Length() < 7) {
        MessageDlg("Please enter at least 7 digit.",mtInformation, TMsgDlgButtons()<< mbOK, 0);
    }
}
//--------------------------------------------------------------------------------
void __fastcall TForm::MyCheckBoxClick(TObject *Sender)
{
    if (MyCheckBox->Tag == 0 ) {
        MyCheckBox->Tag = 1;
        if (MyTEditBox->Text.Length() >= 7)
            MyCheckBox->Checked = true;
        IdThrottler->BitsPerSec = StrToInt64(MyTEditBox->Text);
    }
    else {
        MyCheckBox->Tag = 0;
        if (MessageDlg("Please enter at least 7 digit.",mtInformation, TMsgDlgButtons()<< mbOK, 0) == mrYes)
            MyCheckBox->Checked = false;
    }
}

1 个答案:

答案 0 :(得分:1)

首先,节流器的BitsPerSec属性为int,而不是__int64,因此您应该使用StrtoInt()代替StrToInt64() }。

您正在TCheckBox::Enabled事件中设置TCheckBox::OnClick属性,因此用户必须实际点击TCheckBox才能自行更新。如果用户只输入TEdit并且从不点击TCheckBox,则永远不会更新。

如果您不希望用户点击TCheckBox,除非TEdit文字足够,您应该使用TEdit::OnChange事件来设置{{ 1}}属性,完全摆脱TCheckBox::Enabled处理:

TCheckBox::Tag

请注意,仅仅因为用户输入的数字超过6位并不意味着其void __fastcall TMyForm::MyTEditBoxChange(TObject *Sender) { MyCheckBox->Enabled = (MyTEditBox->GetTextLen() >= 7); } void __fastcall TMyForm::MyCheckBoxClick(TObject *Sender) { if (MyCheckBox->Checked) IdThrottler->BitsPerSec = StrToInt(MyTEditBox->Text); else IdThrottler->BitsPerSec = 0; } 代表值Text。在这种情况下,int会引发异常。

处理此问题的另一种方法是向表单添加StrToInt(),在其中创建自定义操作,将该操作分配给TActionList属性,然后使用TCheckBox::Action用于设置TAction::OnUpdate属性的事件(将启用/禁用TAction::Enabled):

TCheckBox

此方法的好处是void __fastcall TMyForm::MyActionUpdate(TObject *Sender) { MyAction1->Enabled = (MyTEditBox->GetTextLen() >= 7); } 属性将自动且实时更新,而无需手动对TCheckBox::Enabled中的更改做出反应。

话虽如此,如果您使用的是现代版本的C ++ Builder,TEdit具有TEdit属性。设置为true时,您不必再在NumbersOnly事件中过滤击键,操作系统将阻止用户为您键入非数字字符(此外,当您手动过滤时,您是不允许用户输入TEdit::OnKeyPress数字,这是错误的。)

如果您真的必须允许用户通过0输入一个号码,并且如果您的C ++ Builder版本中没有TEdit属性,那么您还有其他一些选项(无论如何,即使在现代C ++ Builder版本中也应该考虑):

  1. TEdit::NumbersOnly设为只读,通过TEdit媒体资源向TUpDown添加TUpDown::Associate,并指定相应的TUpDown::MinTUpDown::Max值如所须。使用TUpDown::Position属性更新限制程序的BitsPerSec属性:

    void __fastcall TMyForm::MyActionUpdate(TObject *Sender)
    {
        MyAction1->Enabled = (MyUpDown->Position > 999999);
    }
    
    void __fastcall TMyForm::MyUpDownClick(TObject *Sender, TUDBtnType Button)
    {
        if ((MyCheckBox->Enabled) && (MyCheckBox->Checked))
            IdThrottler->BitsPerSec = MyUpDown->Position;
        else
            IdThrottler->BitsPerSec = 0;
    }
    

    也许还使用TTrackBar以更大的增量设置TUpDown::Value属性,这样用户就不必按向上/向下箭头进行小调整:

    void __fastcall TMyForm::MyTrackBarChange(TObject *Sender)
    {
        MyUpDown->Position = MyTrackBar->Position;
        MyUpDownClick(NULL, btNext);
    }
    
  2. 根本不打算使用TEdit。请改用TCSpinEditTSpinEdit(取决于您的C ++ Builder版本)。用户可以键入数字,它将拒绝非数字输入。它提供向上/向下箭头,如TUpDown,用于进行小幅调整。并且它具有Value属性,可返回/接受int而不是String,就像TUpDown::Position属性一样。

    void __fastcall TMyForm::MyActionUpdate(TObject *Sender)
    {
        MyAction1->Enabled = (MySpinEdit->Value > 999999);
    }
    
    void __fastcall TMyForm::MySpinEditChange(TObject *Sender)
    {
        if ((MyCheckBox->Enabled) && (MyCheckBox->Checked))
            IdThrottler->BitsPerSec = MySpinEdit->Value;
        else
            IdThrottler->BitsPerSec = 0;
    }
    
  3. 无论哪种方式,用户根本无法输入非数字值,TCheckBox仍会自动禁用小于所需阈值的值。