我的目的是,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;
}
}
首先,节流阀的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版本):
将其设置为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;
}
也许还可以使用aTTrackBar
来TUpDown::Value
以较大的增量设置属性,因此用户不必按向上/向下箭头即可进行较小的调整:
void __fastcall TMyForm::MyTrackBarChange(TObject *Sender)
{
MyUpDown->Position = MyTrackBar->Position;
MyUpDownClick(NULL, btNext);
}
完全不用理会TEdit
。使用TCSpinEdit
或TSpinEdit
代替(取决于您的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
对于小于所需阈值的值,仍然会自行禁用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句