15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Расширяем возможности CEdit.

Автор: Daniel Zuppinger

  • Скачать исходник - 8 Kb
  • Скачать демонстрационный проект - 36 Kb

    Sample Image - autoedit.gif

    Описание

    Класс, который представлен здесь, позволяет определить какие символы разрешено вводить пользователю, такие как только цифры, или цифры, десятичные точки и знаки, или символы шестнадцатиричного исчисления и т.д.

    Класс CAutoEdit

    Класс CAutoEdit наследуется class is derived from the normal CEdit class.

    Метод SetMaxChar позволяет Вам определить максимальное количество символов, допустимое для данного поля. Если это количество достигнуто, то фокус автоматически перескакивает на следующее поле, осуществляя тем самым эффективный ввод данных. Следующий метод SetExitChar позволяет Вам определить один дополнительный символ, который будет использоваться для выхода из данного поля, как это делает, к примеру, TAB. Это удобно в случаях, когда Вы хотите использовать десятичную точку для перехода на следующее поле и т.д.

    Класс CAutoEdit использует в качестве обработчика ошибок класс CEditValidate с виртуальной функцией validate

    Этот класс присоединяется к CAutoEdit посредствам метода SetValidationHandler. Всякий раз, когда CAutoEdit теряет фокус, то вызывается метод validation . При этом проверяется содержимое поля, форматируется и, при необходимости генерируется сообщение об ошибке. Если сообщение об ошибке сгенерировано, то происходит следующее:

    1. Фокус остаётся на поле, содержащем ошибку и содержимое поля выделяется
    2. Сообщение об ошибке выводится в маленькое окошко прямо над полем, содержащем ошибку. Для этого используется класс CInfoWnd .

    Такой режим позволяет пользователю исправить ошибочный ввод без необходимости удаления окошка с пояснением ошибки. Как только поле ввода будет исправлено, сообщение об ошибке исчезнет автоматически. Пользователь не сможет выбрать другое поле до тех пор пока не исправит ошибку в текущем поле, за исключением кнопки CANCEL.

    Для использования этого класса в своём проекте, Вам необходимо включить в проект файлы autoedit.h, autoedit.cpp, infowmd.h и infownd.cpp. В Вашем диалоге измените поля CEdit на CAutoEdit и добавьте следующий код в OnInitDialog :

    //
    BOOL CTestDlg::OnInitDialog() 
    {
        CDialog::OnInitDialog();
    	
        // Устанавливаем режим для каждого поля редактирования
        m_Edit1.SetMaxChars(2);
        m_Edit1.SetValidChar(_T("0123456789"));
        m_dayValidate = new CDayValidate;
        m_Edit1.SetValidationHandler(m_dayValidate);
        m_Edit1.SetDefaultValue(_T("01"));
        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;  // возвращаем TRUE до тех пор, пока Вы
                      // не установите фокус на элемент управления
    }
    //