65.9K
CodeProject 正在变化。 阅读更多。
Home

CEdit 增强

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (9投票s)

2000 年 12 月 15 日

viewsIcon

234616

downloadIcon

2878

用于高效数据捕获的 CEdit 增强功能。

引言

是否曾因在编辑字段中输入值后弹出的消息框提示您该值超出范围而烦恼?或者,在尝试更正格式化字符串中间的字符时,是否曾被掩码编辑字段惹恼?也许这种方法会为您提供您正在寻找的解决方案。

sample screen shot

CAutoEdit 类派生自普通的 CEdit 类。

使用 SetValidChar 方法,您可以定义用户可以输入哪些字符,例如仅数字字符,或数字字符、小数点和符号,或用于表示十六进制字符串的有效字符。SetMaxChar 方法允许您定义此字段中预期的最大字符数。如果达到此数字,焦点将自动设置为下一个字段,从而实现高效的数据捕获。下一个方法 SetExitChar 允许您定义一个额外的字符,该字符将用于离开此字段,就像按 TAB 键一样。当您想使用小数点跳到下一个字段等时,这很方便。

现在真正的创新在于错误处理:CAutoEdit 正在使用一个验证接口类 CEditValidate,它具有一个虚函数 validate。这个类可以使用方法 SetValidationHandler 附加到 CAutoEdit。每当 CAutoEdit 失去焦点时,就会调用已附加的验证接口类的 validation 方法。在这里,将对字段的内容进行验证、格式化,并在必要时设置错误消息。如果生成了错误消息,将发生两件事

  1. 焦点将停留在错误的字段中,并且内容将被选中。
  2. 错误消息将显示在错误字段正上方的小窗口中。CInfoWnd 类用于此目的。

这种行为允许用户解决问题,而无需首先摆脱消息框并尝试记住消息。消息就在那里,并且只有在更正字段后才会消失。用户将无法选择任何其他字段,除非按下取消按钮,否则无法解决问题。

还有一些其他方法可以定义符号、空填充等的行为,我不会详细描述,它们易于使用且易于理解。

为了在您自己的项目中使用这个类,您必须包含文件 autoedit.hautoedit.cppinfowmd.hinfownd.cpp。在您的对话框中,将您的 CEdit 字段更改为 CAutoEdit 并在 OnInitDialog 中添加初始化

//
BOOL CTestDlg::OnInitDialog() 
{
    CDialog::OnInitDialog();

    // Set up the behaviour for each edit field
    
    // leave the field after 2 (valid) characters have been entered
    m_Edit1.SetMaxChars(2);
    // allow all numeric characters
    m_Edit1.SetValidChar(_T("0123456789"));
    // create a validation interface
    m_dayValidate = new CDayValidate;
    // set the validation handler
    m_Edit1.SetValidationHandler(m_dayValidate);
    // start with this value
    m_Edit1.SetDefaultValue(_T("01"));
    // move the default into the field
    m_Edit1.SetText();

    m_Edit2.SetMaxChars(2);
    m_Edit2.SetValidChar(_T("0123456789"));
    m_monthValidate = new CMonthValidate;
    m_Edit2.SetValidationHandler(m_monthValidate);
    m_Edit2.SetDefaultValue(_T("01"));
    m_Edit2.SetText();

    m_Edit3.SetMaxChars(4);
    m_Edit3.SetValidChar(_T("0123456789"));
    m_yearValidate = new CYearValidate;
    m_Edit3.SetValidationHandler(m_yearValidate);
    m_Edit3.SetDefaultValue(_T("2000"));
    m_Edit3.SetText();

    m_Edit4.SetMaxChars(8);
    m_Edit4.SetValidChar(_T("10"));
    m_binValidate = new CBinValidate;
    m_Edit4.SetValidationHandler(m_binValidate);

    return TRUE;  // return TRUE unless you set the focus to a control
}
//

当然,这个类还有很多可能的改进,请随意使用和增强它,只是不要忘记在这里分享它 :-)

问题

有一些值得一提的问题,也许有人能找到一个(简单的?)解决方案:一方面,当 InfoWnd 显示消息并且对话框移动时,InfoWnd 不会跟随对话框。另一个问题是,即使其中一个 CAutoEdit 字段中仍然存在无效值,按“Enter”键也会关闭对话框。

注意:有一件事需要知道:您不能让取消按钮紧跟在 TAB 顺序中的 CAutoEdit 字段之后,否则验证将不起作用。原因是取消按钮作为下一个控件传递给 OnKillFocus 方法。这用于确定用户是否取消了对话框,我无法确定用户是按下了该按钮还是焦点只是传递到那里,因为它是行中的下一个控件。

© . All rights reserved.