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