TEdit和TCheckBox验证

罗密欧·勒加加尼(Romeo LeGagahne)

我的目的是,TCheckBox当输入的TEdit数字少于7位,用户将永远无法检查a 另外,TCheckBox如果的TEdit值为空则永远无法检查

TCheckBox尽管TEdit是空的,有时仍可以检查我的代码问题

此外,我的另一个目标是,如果在TCheckBox为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;
    }
}
雷米·勒博(Remy Lebeau)

首先,节流阀的BitsPerSec属性是an int,而不是an __int64,因此您应该使用StrtoInt()而不是StrToInt64()

您正在事件中设置TCheckBox::Enabled属性TCheckBox::OnClick,因此用户必须实际单击,TCheckBox以使其自行更新。如果用户仅输入,TEdit并且从未点击TCheckBox,则它将永远不会更新。

如果您根本不希望用户单击,TCheckBox除非TEdit文本足够,则应使用该TEdit::OnChange事件来设置TCheckBox::Enabled属性,并TCheckBox::Tag完全摆脱处理:

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

请注意,仅仅因为用户可以输入6位以上的数字,并不意味着它Text代表一个int值。在这种情况下,StrToInt()将引发异常。

解决此问题的另一种方法是TActionList在Form中添加一个,在其中创建一个自定义操作,将该操作分配给该TCheckBox::Action属性,然后使用该TAction::OnUpdate事件来设置TAction::Enabled属性(这将启用/禁用TCheckBox):

void __fastcall TMyForm::MyActionUpdate(TObject *Sender)
{
    MyAction1->Enabled = (MyTEditBox->GetTextLen() >= 7);
}

这种方法的好处是,该TCheckBox::Enabled属性将自动实时更新,而无需手动对TEdit所有更改做出反应

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

如果您确实必须允许用户通过来输入数字TEdit,并且如果该TEdit::NumbersOnly属性在您的C ++ Builder版本中不可用,那么您仍然可以使用其他几个选项(即使在现代C +中,您也应该考虑这些选项) + Builder版本):

  1. 将其设置为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;
    }
    

    也许还可以使用aTTrackBarTUpDown::Value以较大的增量设置属性,因此用户不必按向上/向下箭头即可进行较小的调整:

    void __fastcall TMyForm::MyTrackBarChange(TObject *Sender)
    {
        MyUpDown->Position = MyTrackBar->Position;
        MyUpDownClick(NULL, btNext);
    }
    
  2. 完全不用理会TEdit使用TCSpinEditTSpinEdit代替(取决于您的C ++ Builder版本)。用户可以输入数字,它将拒绝非数字输入。它提供了向上/向下箭头,例如TUpDown,用于进行小的调整。就像该属性一样,它具有Value返回/接受aint而不是aStringTUpDown::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;
    }
    

无论哪种方式,用户都根本无法输入非数字值,并且TCheckBox对于小于所需阈值的值,仍然会自行禁用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章