]>
git.saurik.com Git - wxWidgets.git/blob - docs/doxygen/overviews/validator.h
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     topic overview 
   4 // Author:      wxWidgets team 
   5 // Licence:     wxWindows licence 
   6 ///////////////////////////////////////////////////////////////////////////// 
  10 @page overview_validator wxValidator Overview 
  14 The aim of the validator concept is to make dialogs very much easier to write. 
  15 A validator is an object that can be plugged into a control (such as a 
  16 wxTextCtrl), and mediates between C++ data and the control, transferring the 
  17 data in either direction and validating it. It also is able to intercept events 
  18 generated by the control, providing filtering behaviour without the need to 
  19 derive a new control class. 
  21 You can use a stock validator, such as wxTextValidator (which does text control 
  22 data transfer, validation and filtering) and wxGenericValidator (which does 
  23 data transfer for a range of controls); or you can write your own. 
  25 Here is an example of wxTextValidator usage. 
  28 wxTextCtrl *txt1 = new wxTextCtrl( 
  29     this, -1, wxT(""), wxDefaultPosition, wxDefaultSize, 0, 
  30     wxTextValidator(wxFILTER_ALPHA, &g_data.m_string)); 
  33 In this example, the text validator object provides the following 
  36 @li It transfers the value of g_data.m_string (a wxString variable) to the 
  37     wxTextCtrl when the dialog is initialised. 
  38 @li It transfers the wxTextCtrl data back to this variable when the dialog is 
  40 @li It filters input characters so that only alphabetic characters are allowed. 
  42 The validation and filtering of input is accomplished in two ways. When a 
  43 character is input, wxTextValidator checks the character against the allowed 
  44 filter flag (@c wxFILTER_ALPHA in this case). If the character is inappropriate, 
  45 it is vetoed (does not appear) and a warning beep sounds (unless 
  46 wxValidator::SetBellOnError(false) has been called). 
  47 The second type of validation is performed when the dialog is about to be dismissed, 
  48 so if the default string contained invalid characters already, a dialog box is shown 
  49 giving the error, and the dialog is not dismissed. 
  51 Note that any wxWindow may have a validator; using the @c wxWS_EX_VALIDATE_RECURSIVELY 
  52 style (see wxWindow extended styles) you can also implement recursive validation. 
  54 @see wxValidator, wxTextValidator, wxGenericValidator, wxIntegerValidator, 
  55      wxFloatingPointValidator 
  59 @section overview_validator_anatomy Anatomy of a Validator 
  61 A programmer creating a new validator class should provide the following 
  64 A validator constructor is responsible for allowing the programmer to specify 
  65 the kind of validation required, and perhaps a pointer to a C++ variable that 
  66 is used for storing the data for the control. If such a variable address is not 
  67 supplied by the user, then the validator should store the data internally. 
  69 The wxValidator::Validate member function should return @true if the data in 
  70 the control (not the C++ variable) is valid. It should also show an appropriate 
  71 message if data was not valid. 
  73 The wxValidator::TransferToWindow member function should transfer the data from 
  74 the validator or associated C++ variable to the control. 
  76 The wxValidator::TransferFromWindow member function should transfer the data 
  77 from the control to the validator or associated C++ variable. 
  79 There should be a copy constructor, and a wxValidator::Clone function which 
  80 returns a copy of the validator object. This is important because validators 
  81 are passed by reference to window constructors, and must therefore be cloned 
  84 You can optionally define event handlers for the validator, to implement 
  85 filtering. These handlers will capture events before the control itself does 
  86 (see @ref overview_events_processing). 
  87 For an example implementation, see the @c valtext.h and @c valtext.cpp files in the 
  91 @section overview_validator_dialogs How Validators Interact with Dialogs 
  93 For validators to work correctly, validator functions must be called at the 
  94 right times during dialog initialisation and dismissal. 
  96 When a wxDialog::Show is called (for a modeless dialog) or wxDialog::ShowModal 
  97 is called (for a modal dialog), the function wxWindow::InitDialog is 
  98 automatically called. This in turn sends an initialisation event to the dialog. 
  99 The default handler for the @c wxEVT_INIT_DIALOG event is defined in the wxWindow 
 100 class to simply call the function wxWindow::TransferDataToWindow. 
 101 This function finds all the validators in the window's children and calls the 
 102 wxValidator::TransferToWindow function for each. Thus, data is transferred from C++ 
 103 variables to the dialog just as the dialog is being shown. 
 105 @note If you are using a window or panel instead of a dialog, you will need to 
 106 call wxWindow::InitDialog explicitly before showing the window. 
 108 When the user clicks on a button, for example the OK button, the application 
 109 should first call wxWindow::Validate, which returns @false if any of the child 
 110 window validators failed to validate the window data. The button handler should 
 111 return immediately if validation failed. Secondly, the application should call 
 112 wxWindow::TransferDataFromWindow and return if this failed. It is then safe to 
 113 end the dialog by calling wxDialog::EndModal (if modal) or wxDialog::Show (if modeless). 
 115 In fact, wxDialog contains a default command event handler for the @c wxID_OK 
 116 button. It goes like this: 
 119 void wxDialog::OnOK(wxCommandEvent& event) 
 121     if ( Validate() && TransferDataFromWindow() ) 
 127             SetReturnCode(wxID_OK); 
 134 So if using validators and a normal OK button, you may not even need to write 
 135 any code for handling dialog dismissal. 
 137 If you load your dialog from a resource file, you will need to iterate through 
 138 the controls setting validators, since validators can't be specified in a