zoukankan      html  css  js  c++  java
  • MFC表单验证的简单解决方案

    介绍 许多程序员的任务之一是处理无效数据输入的运算符。MFC形式(如对话框、表格视图),是否尽快执行验证控件失去焦点或验证整个表单当用户单击OK按钮以及如何显示错误(s)阻止用户单击OK按钮继续争论的主题。 2001年我曾在一个数据库应用程序,有一个极其复杂的输入验证。首先,我想用更有可能做验证的验证编辑控件的WM_KILLFOCUS (OnKillFocus)事件,但是它没有让你离开编辑框,直到你答对了。很不方便,你有字段的验证取决于其他字段,可以修改。更糟的是,我遇到最恼人的问题很多用户要求:他们想要尽可能快地输入数据,有时使用键盘输入数字和按Enter键集中下一个字段,如果他们犯错误,弹出一个消息框告诉关于错误的信息,他们可以解决这个问题,而无需先去掉一个错误消息框。 它可以解决所有的问题在不改变形式的标准行为?答案是肯定的。尝试各种方法之后,我想出了一个完整的解决方案,会让我容易做到形式的验证。 现在我剥夺了这些类从一个运行的程序;我不得不做一些微小的变化,它将依赖于我的应用程序以及我希望它能帮助很多人。 特性 以下是一些特点: 数据将被验证当你点击/按下OK按钮,任何错误将阻止表单关闭。重点将被设置为第一个错误的领域。 单击OK按钮时如果有任何错误或者当前的重点领域是第一个错误的字段,当按下OK按钮,错误消息将显示在一个小窗口(类似于工具提示)错误的字段上方一定圈的时间(默认5 s)。 如果你按任意键或单击鼠标按钮,错误消息会阻止用户单击OK按钮消失,仍然把这个“道”传好 如果你想要显示的错误消息很长一段时间,只是移动鼠标光标。 你可以随时离开形式使用取消按钮或ESC键,即使当前字段的错误,就像一个对话框的正常行为。 使用的代码 使用类是非常简单和舒适。让我们以一个对话框为例,从CDialogExt派生类,覆盖OnValidate函数。就是这样。 TestDialog.h:头fileHide,复制Code

    #include "DialogExt.h"
    class CTestDialog : public CDialogExt
    {
    // Construction
    public:
    ......
    // Overrides
        virtual void OnValidate (UINT &nCtrlID, CString &strError);
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CTestDialog)
    protected:
        virtual void DoDataExchange(CDataExchange* pDX); 
    //}}AFX_VIRTUAL
    ......
    }

    TestDialog.cpp:实现fileHide,复制Code

    void CTestDialog::OnValidate(UINT &nCtrlID, CString &strError)
    {
        UpdateData();
        CString strEdit;
        GetDlgItemText(IDC_SINGLELINE_EDIT, strEdit);
        if (strEdit.IsEmpty()){
            strError = "Single-line edit cannot be empty string.";
            nCtrlID = IDC_SINGLELINE_EDIT;
            return;
        }
    }

    技术细节 CMessageTip CMessagTip来源于CWnd。使用工具简单地调用创建(…)并指定父窗口。当显示(…)成员函数叫做我安装钩和使用SetWindowPos显示消息框(…),然后启动一个计时器在0.5秒的时间间隔。任何时候我钩钩proc事件,我直接发布WM_CLOSE消息。在OnClose()处理程序,我就叫隐藏()成员函数杀死计时器,解雇和删除的消息框钩。计时器proc,我一直递减计数间隔和定期检查鼠标是否仍在窗口范围内或切换到其他应用程序。当计数为0或切换到其他应用程序隐藏()成员函数。 CDialogExt CDialogExt来源于CDialog。我宣布一个CMessagTip成员变量m_tip并覆盖WM_COMMAND消息处理程序OnCmdMsg(…)。等于在OnCmdMsg(…),当国家免疫日IDOK(点击/按下OK按钮)我叫虚拟函数OnValidate(…)得到错误的控件ID和错误消息文本中指定覆盖OnValidate(…)功能。 值得一提的是当显示错误消息。 1001年是相关联的编辑控件的ID值组合框。组合框的ID值,假设国家免疫日“下拉”风格设置。如果combobox控件专注,您可以使用GetDlgItem)(国家免疫日→GetDlgItem(1001)获得焦点的窗口。 对于多行编辑控件,回车键可以发送,但只有在编辑控件是一个多行编辑控件,如果“返回”风格设置。如果你在多行编辑控件按回车键,你可以在PreTranslateMessage窗口处理程序:隐藏,复制Codeif (pMsg→信息= = WM_KEYDOWN,, pMsg→按钮= = VK_RETURN) { CWnd * pWnd = FromHandle (pMsg→hwnd); 如果(pWnd ! = GetDlgItem (IDOK)) m_pWndFrom = pWnd; } 为了模仿的行为按回车键集中第二场,我只有在当前光标显示错误消息仍在第一个错误的字段,当按下OK按钮。 CFormViewExt CFormViewExt来源于CFormView。这是如果CDialogExt聚酯薄膜。我添加了两个虚函数OnOK()和OnCancel()。您可以覆盖它们并添加额外的代码,就像dialog一样。 CPropertyPageExt CPropertyPageExt派生自CPropertyPage。我声明了一个CMessagTip成员变量m_tip并提供了一个虚拟函数OnValidate()。ShowMessage(…)和HideMessage()将在CPropertySheetExt类中被调用。 CPropertySheetExt CPropertySheetExt派生自CPropertySheet。我重写WM_COMMAND消息处理程序OnCmdMsg(…)在这里。在OnCmdMsg(…)中,我计算页面的数量并像CDialogExt一样处理所有的页面。我注意到,Enter键不能从多行编辑控件发送。所以在显示错误消息时与CDialogExt有一点不同。 总结 本文所介绍的技术在我们的应用中已经广泛应用了近3年。我还没有在其他地方或类似的任何产品中见过这种想法,所以我希望这种技术对后者有很大的贡献。 本文转载于:http://www.diyabc.com/frontweb/news4991.html

  • 相关阅读:
    HDOJ 4747 Mex
    HDU 1203 I NEED A OFFER!
    HDU 2616 Kill the monster
    HDU 3496 Watch The Movie
    Codeforces 347A A. Difference Row
    Codeforces 347B B. Fixed Points
    Codeforces 372B B. Hungry Sequence
    HDU 1476 Sudoku Killer
    HDU 1987 How many ways
    HDU 2564 词组缩写
  • 原文地址:https://www.cnblogs.com/Dincat/p/13462130.html
Copyright © 2011-2022 走看看