0

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

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

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

问题是我应该在开始按钮中输入什么代码?

我正在使用以下代码:

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

1 回答 1

1

首先,节流阀的BitsPerSec属性是一个int,而不是一个__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()会引发异常。

处理此问题的另一种方法是将 a 添加TActionList到您的表单中,在其中创建自定义操作,将该操作分配给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数字,这是错误的)。

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

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

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

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

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

于 2015-08-13T05:10:03.090 回答