обработчик текста
От: IvanIV  
Дата: 13.01.09 17:14
Оценка:
Доброго времени суток RSDN!

Не бейте палками если что. Пишу от того что мозг уже закипает...
Помогите если не трудно разобраться.
Задача стояла написать приложение, в которое вводится определенный текст.
Если весь введенный текст совпадает с исходником, разблочить закрывающую приложение кнопку.
Я спросил совета и начал свою работу:
Есть MFC приложение на базе диалоговых окон, а точнее одно окно.(c++)
В окно я вставил rich edit 2.0 control, инициализировал в ac**.cpp элемент управление AfxInitRichEdit2();
далее присвоил переменную для rich edit 2.0 control — value типа cstring навал её m_rich1
далее делаю обработчик en_update для все того же рич эдит 2.0 контрола
вот код:

void CacdiDlg::OnEnUpdateRichedit21()
{
        
    UpdateData(true);
    m_stat1="здесь написан любой текст более 255 символов";
    if (m_rich1==m_stat1) (m_chkbx1.EnableWindow(TRUE));
    else (m_chkbx1.EnableWindow(FALSE));
    UpdateData(false);
    
}


m_stat1 и m_chkbx1 уже объявлены.

в результате:
когда я вбиваю в элемент рич эдит 2.0 контрол текст более 255 символов у меня на 256-ом символе курсор прыгает вначало рич эита и пишет текст сначала строки не затирая старый, при этом маргая как потерпевший.
с короткими текстами проблем нет. все работает идеально.

Подскажите пожалуйста как быть в этом случае? каким образом обрабатывать вводимый в рич эдит контрол большой текст?
P.s. вы извините за такое изложение, но изучать visual c++ едва начал.
Re: обработчик текста
От: Kiper Израиль  
Дата: 15.01.09 09:05
Оценка:
Давно не работал с ричем, дам пару рекомендаций навскидку.
ИМХО, UpdateData(true) + UpdateData(false) это лишние и ненужные передергивания. Выкинь их. Тебе необходимо снимать текст каждый раз, когда юзер что-то заводит в контрол. Я правильно понимаю? Предпочтительней делать это вручную — объяви свой контрол как рич (вместо стринга,... можно и в дополнение, ничего не случится, но я бы сделал вместо), потом извлекай текст через функции самого рича (поищи в хелпе). Скажем, для простых случаев есть ф-я GetWindowText(). Для рича есть что-то свое, погляди. Сняв текст, сравнивай и т.д. Но... неужели для того, чтобы работать с твоим механизмом блокировки, нужен именно рич? Чего-то я не догоняю... сорри. Я бы юзал простой edit-box
Жизненный опыт похож на выигрышную лотерею, купленную после тиража.
Re[2]: обработчик текста
От: IvanIV  
Дата: 15.01.09 10:53
Оценка:
Здравствуйте, Kiper, Вы писали:

K>Давно не работал с ричем, дам пару рекомендаций навскидку.

K>ИМХО, UpdateData(true) + UpdateData(false) это лишние и ненужные передергивания. Выкинь их. Тебе необходимо снимать текст каждый раз, когда юзер что-то заводит в контрол. Я правильно понимаю? Предпочтительней делать это вручную — объяви свой контрол как рич (вместо стринга,... можно и в дополнение, ничего не случится, но я бы сделал вместо), потом извлекай текст через функции самого рича (поищи в хелпе). Скажем, для простых случаев есть ф-я GetWindowText(). Для рича есть что-то свое, погляди. Сняв текст, сравнивай и т.д. Но... неужели для того, чтобы работать с твоим механизмом блокировки, нужен именно рич? Чего-то я не догоняю... сорри. Я бы юзал простой edit-box

Спасибо, за пояснение. от рича отказался, он мне действительно ни к чему... использую эдит-бокс
и с функцией GetWindowText() разобрался...
а вот как мне уйти от UpdateData не могу знать...
на данный момент все работает так как мне надо, но в качестве общего развития хотелось бы увидеть код без использования UpdateData.
Еще раз спасибо за инфу.
Re[3]: обработчик текста
От: Kiper Израиль  
Дата: 15.01.09 13:10
Оценка:
Здравствуйте, IvanIV, Вы писали:

IIV>а вот как мне уйти от UpdateData не могу знать...

IIV>на данный момент все работает так как мне надо, но в качестве общего развития хотелось бы увидеть код без использования UpdateData.
IIV>Еще раз спасибо за инфу.
Пример кода:

H - file
class CMyDialog : public CDialog
{
// Construction
public:
    CMyDialog(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
    //{{AFX_DATA(CMyDialog)
    enum { IDD = IDD_MY_DLG };
    CEdit    m_PswdEdit;
    //}}AFX_DATA
private:
    CString m_strPasswordStat; //ЗДЕСЬ ТВОЙ ПОСТОЯННЫЙ ПАРОЛЬ ДЛЯ ПРОВЕРОК

//..........................  И Т.Д.
};
CPP - file
BOOL CMyDialog::OnInitDialog() 
{
    CDialog::OnInitDialog();
    
    // TODO: Add extra initialization here

    m_strPasswordStat = "MyPassword12345"; //ЗДЕСЬ ИНИЦИАЛИЗИРУЕШЬ КОННТРОЛЬНЫЙ ТЕКСТ
    //m_PswdEdit.ModifyStyle(PASSWORD);//    НЕ ЗАБУДЬ ЗАДАТЬ СТИЛЬ PASSWORD (В РЕСУРСЕ)
    return TRUE;
}

void CMyDialog::OnChangeEditTest() 
{
    CString strTmp; //create temp. string, only for checking
    m_PswdEdit.GetWindowText(strTmp); //ИЗВЛЕКАЕШЬ ТЕКСТ ВО ВРЕМЕННЫЙ(!) БУФФЕР
    if (strTmp == m_strPasswordStat)
    {
        //УСЛОВИЕ ВЫПОЛНИЛОСЬ
    }
        else
        {
              // НЕ ВЫПОЛНИЛОСЬ
        }
}

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