我的目的是,当号码输入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;
}
}
答案 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版本中也应该考虑):
将TEdit::NumbersOnly
设为只读,通过TEdit
媒体资源向TUpDown
添加TUpDown::Associate
,并指定相应的TUpDown::Min
和TUpDown::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);
}
根本不打算使用TEdit
。请改用TCSpinEdit
或TSpinEdit
(取决于您的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;
}
无论哪种方式,用户根本无法输入非数字值,TCheckBox
仍会自动禁用小于所需阈值的值。