MFC表單驗證的簡單解決方案

2022-02-12 17:08:45 字數 2369 閱讀 2814

介紹 許多程式設計師的任務之一是處理無效資料輸入的運算子。mfc形式(如對話方塊、**檢視),是否盡快執行驗證控制項失去焦點或驗證整個表單當使用者單擊ok按鈕以及如何顯示錯誤(s)阻止使用者單擊ok按鈕繼續爭論的主題。 2023年我曾在乙個資料庫應用程式,有乙個極其複雜的輸入驗證。首先,我想用更有可能做驗證的驗證編輯控制項的wm_killfocus (onkillfocus)事件,但是它沒有讓你離開編輯框,直到你答對了。很不方便,你有字段的驗證取決於其他字段,可以修改。更糟的是,我遇到最惱人的問題很多使用者要求:他們想要盡可能快地輸入資料,有時使用鍵盤輸入數字和按enter鍵集中下乙個字段,如果他們犯錯誤,彈出乙個訊息框告訴關於錯誤的資訊,他們可以解決這個問題,而無需先去掉乙個錯誤訊息框。 它可以解決所有的問題在不改變形式的標準行為?答案是肯定的。嘗試各種方法之後,我想出了乙個完整的解決方案,會讓我容易做到形式的驗證。 現在我剝奪了這些類從乙個執行的程式;我不得不做一些微小的變化,它將依賴於我的應用程式以及我希望它能幫助很多人。 特性 以下是一些特點: 資料將被驗證當你點選/按下ok按鈕,任何錯誤將阻止表單關閉。重點將被設定為第乙個錯誤的領域。 單擊ok按鈕時如果有任何錯誤或者當前的重點領域是第乙個錯誤的字段,當按下ok按鈕,錯誤訊息將顯示在乙個小視窗(類似於工具提示)錯誤的字段上方一定圈的時間(預設5 s)。 如果你按任意鍵或單擊滑鼠按鈕,錯誤訊息會阻止使用者單擊ok按鈕消失,仍然把這個「道」傳好 如果你想要顯示的錯誤訊息很長一段時間,只是移動滑鼠游標。 你可以隨時離開形式使用取消按鈕或esc鍵,即使當前欄位的錯誤,就像乙個對話方塊的正常行為。 使用的** 使用類是非常簡單和舒適。讓我們以乙個對話方塊為例,從cdialogext派生類,覆蓋onvalidate函式。就是這樣。 testdialog.h:頭filehide,複製code

#include "dialogext.h"

class ctestdialog : public cdialogext

}afx_virtual

......

}

testdialog.cpp:實現filehide,複製code

void ctestdialog::onvalidate(uint &nctrlid, cstring &strerror)

}

技術細節 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(…)功能。 值得一提的是當顯示錯誤訊息。 2023年是相關聯的編輯控制項的id值組合框。組合框的id值,假設國家免疫日「下拉」風格設定。如果combobox控制項專注,您可以使用getdlgitem)(國家免疫日→getdlgitem(1001)獲得焦點的視窗。 對於多行編輯控制項,回車鍵可以傳送,但只有在編輯控制項是乙個多行編輯控制項,如果「返回」風格設定。如果你在多行編輯控制項按回車鍵,你可以在pretranslatemessage視窗處理程式:隱藏,複製codeif (pmsg→資訊= = wm_keydown,, pmsg→按鈕= = vk_return) 為了模仿的行為按回車鍵集中第二場,我只有在當前游標顯示錯誤訊息仍在第乙個錯誤的字段,當按下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年。我還沒有在其他地方或類似的任何產品中見過這種想法,所以我希望這種技術對後者有很大的貢獻。 本文**於:

關於小程式表單驗證解決方案

小程式中遇到了表單驗證,剛開始想自己寫乙個正則.但是最後還是使用了 wxvalidate.js這個東西,他只需要將乙個js檔案放進你的專案,用的時候引用一下,就可以了.非常的方便.接下來說一下怎麼使用,2.放入你的專案其中乙個資料夾下.3.在需要的頁面引用下 import wxvalidate fr...

簡單Web service 身份驗證解決方案

簡單web service 身份驗證解決方案 問題提出 為了構建乙個安全的web服務,需要對呼叫方進行身份驗證,只讓通過審核的使用者呼叫web服務。軟體件環境 web服務程式部署在分布於各地的工廠伺服器,這些伺服器位於內網之中,沒有固定外網ip,且不能通過外網進行訪問。呼叫這些web服務的是一台連線...

css表單對齊解決方案

表單的樣式一直是前端所重視的,也是最難解決的,每個人的解決方法不懂,今天在網上看到這個方法,很不錯,大家可以試試,運用到了display inline block這個屬性。sd form list 這裡使用tahoma字型使表單對齊 sd form list form position right ...