【问题标题】:Validating input for phone number string in BusinessSkinForms controls在 BusinessSkinForms 控件中验证电话号码字符串的输入
【发布时间】:2020-08-11 14:31:11
【问题描述】:

我正在尝试在文本框中获取用户输入的电话号码(我正在使用 Business Skin Forms TbsSkinEdit)。文本框应该只允许数字、空格、破折号和圆括号。有没有什么业务皮肤表单控件可以解决这个问题?或者有没有其他方法可以实现这一目标? 数字可以是以下格式,格式验证不是必需的,只允许输入指定的字符-

(223)2312-1323

23324-3423-2342

23123123

2234 2343

我尝试覆盖 KeyPress 事件,但这样我只能在文本框中允许数字字符,但其他操作(如粘贴和 Ctrl+V)需要额外处理。所以检查是否有可用的现成控件。

【问题讨论】:

  • 只要焦点在文本框中,让用户输入他们输入的任何内容。然后,当他们离开文本框时,进行验证,并在提示进行更正后将焦点返回到文本框(如果需要)。

标签: c++builder borland-c++


【解决方案1】:

您可能可以使用TbsSkinMaskEdit 组件并设置其EditMask 属性。它有一些示例掩码可供选择,其中一个示例掩码用于电话号码:

!\(999\)000-0000;1;_

...但您可以自己编辑掩码并将其设置为例如:

!\(999\)0000-0000;1;_


如果还是不行,您可以创建一个OnChange 事件处理程序:

void __fastcall TForm1::bsSkinEdit1Change(TObject *Sender)
{
    TbsSkinEdit& se = *static_cast<TbsSkinEdit*>(Sender);
    decltype(se.Text) result;
    bool update = false;
    auto old_pos = se.SelStart - 1;

    for(auto ch : se.Text) {
        // numbers, spaces, dash and round brackets
        if((ch >= '0' && ch <= '9') || ch == ' ' || ch == '-' || ch == '(' || ch == ')') {
            result += ch;
        } else {
            update = true;
        }
    }
    if(update) {
        se.Text = result;
        se.SelStart = old_pos;
    }
}

【讨论】:

  • 但这只允许固定长度的字符串。如果我的字符串长度不同怎么办。请参阅给出的样本编号。
  • @NileshShinde 您可以使用可选字符,但在查看 TEditMask 文档(我已经 15 年没有这样做了)时,我发现看起来很难结合您的所有要求。跨度>
  • @NileshShinde 我添加了一个替代方案。
  • 这里不处理粘贴功能。发布了另一个相同的问题 - stackoverflow.com/questions/63611320/…
  • @NileshShinde 如果您粘贴到TbsSkinEdit 控件中,这不会验证输入吗?它对我有用。它像对待任何其他文本一样对待它。另一个问题是另一个问题,所以我不明白你为什么不接受这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2022-12-09
相关资源
最近更新 更多