Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > проблемы с MaskEdit |
Автор: susanin 13.4.2007, 21:43 | ||
имеется форма, но которой есть 2 компонента MaskEdit. необходимо, чтобы когда юзер нажимал первый раз Enter, то проверялось, есть ли в первом поле какая то надпись, и если есть, тоактивным бы становилась второй компонент, а если нету никакой записи, то выводилось бы сообщение... я наклепал вот такой код, но что то он работает несовсеми так, как надо....
что у меня не так сделано?? подскажите пожалуйста! |
Автор: Rodman 13.4.2007, 22:51 | ||
|
Автор: susanin 13.4.2007, 23:16 |
Rodman , выдал вот такие ошибки [C++ Error] Unit3.cpp(27): E2034 Cannot convert 'AnsiString' to 'const char *' [C++ Error] Unit3.cpp(27): E2342 Type mismatch in parameter 'Str' (wanted 'const char *', got 'AnsiString') [C++ Error] Unit3.cpp(32): E2268 Call to undefined function 'ShowMesage' как исправить? |
Автор: Anikmar 14.4.2007, 00:17 |
StrLen(MaskEdit1->Text) Заменить на MaskEdit1->Text.Length() или на StrLen(MaskEdit1->Text.c_str()) |
Автор: susanin 14.4.2007, 01:01 |
Anikmar, сделал, но эффект тот же самый, что и с моим вариантом...при нажатии на Enter при пустом поле активным все равно становится второй компонент... я уж не знаю, что и делать! ![]() |
Автор: Anikmar 14.4.2007, 01:13 |
А изначально где фокус? Вы ставите обработчик нажатия клавиши на конкретный компонене MaskEdit. Т.е., чтобы обработчик сработал, необходим фокус именно на этом компоненте. Если обработка клавиши нужна в рамках формы, то попробуйте поставить обработчик на событие формы. Например, OnShortcut |
Автор: susanin 14.4.2007, 21:20 |
Anikmar , изначально у меня на событии OnActivate у формы стоит MaskEdit1->SetFocus(); |
Автор: Klin 14.4.2007, 23:29 |
Возможно не активен CanFocus или лучше сделать в событии OnPaint |
Автор: Klin 14.4.2007, 23:47 | ||
В никаких событиях прописывать ничего не надо, просто пишешь код в OnKeyDown:
|
Автор: susanin 15.4.2007, 21:40 | ||
Klin , все равно такая же история....давайте поподробней расскажу что у меня за история.... есть программа.... при ее открытии открываются 2 формы... активная форма, как раз та, на которой находятся компоненты MaskEdit. так вот вот...эта форма, как бы выполняет регистрацию пользователя...т.е. пользователь вволит свои данные, а потом в конце работы программы эти данные( фамилия, имя) выводятся на экран при выводе результатов... я хочу сделать, чтобы если пользователь не ввел в какое какое либо из полей данные, выводилось ссобщение о том что он не ввел данные... вот код этой формы....
так вот! когда пользователь не ввел в поле "имя" свое имя, то сообщение выводится, а когда не ввел фамилию, то активным становится второй MaskEdit, хотя вместо этого должно выводится сообщение о том, что он не ввел фамилию! помогите исправить, что у меня не так!!! я уж не знаю, что делать, вроде все варианты перепробовал! |
Автор: Anikmar 15.4.2007, 22:00 | ||||||
По-моему неправильное условие:
Надо так:
или так:
|
Автор: Anikmar 15.4.2007, 22:38 |
Там точно else не пропущен? Можно еще разок взглянуть на ваш код, который неправильно работает? |
Автор: Klin 15.4.2007, 23:10 | ||||||
Я уже писал, как нужно составить условие! Пожалуйста, программисты, будьте внимательны в вашем коде. Вы пишете:
Здесь 2 ошибки: 1) "||" - означает "или", а нужно использовать "и" (&&) 2) Перевожу ваш код:
Ваша ошибка в не правильном условии, надо писать так:
|
Автор: Klin 15.4.2007, 23:43 | ||
Однако, я не считаю, ваш код полным, поскольку после того как пользователь ввел данные, то кнопка становится активной. После этого юзер может спокойно удалить все данные и наслаждаться своей смекалкой. Поэтому я предлагаю поступить так:
|
Автор: susanin 16.4.2007, 00:05 |
Klin , вы будете смеяться, но результата никакого! после первого нажатия на Enter фокус по прежнему переходит на второй компонент MaskEdit, а после второго нажатия кнопка BitBtn становится активной и все.... никаких сообщений не выводится.... |
Автор: Klin 16.4.2007, 00:09 |
Обхохочешся, вот исходник(если не получится вложите свой): |
Автор: susanin 16.4.2007, 00:27 |
Klin , сделал ваш исходник, ничего нового не обнаружил...точно такая же история.... я попробовал сделать то же самое с компонентом Edit...и с ним все получилось...сообщение выводилось.....может это зависит что то от MaskEdit????может там от масик что то зависит??? Добавлено через 11 минут и 19 секунд все! разобрался!!! все заработало! Klin , спасбо огромное! |
Автор: susanin 16.4.2007, 00:56 |
код работает, но только с MaskEdit у которого не задана маска.....что сделать, чтобы он заработал при заданной маске???? ![]() |
Автор: Klin 16.4.2007, 01:29 | ||||
Блин. а с маской придется повозиться. Плохо, что маску я не знаю, но возможно так:
p.s. но если использовать маску и недосписать строчку до конца, то при нажатии на enter выдается внутренее сообщение MaskEdit об ошибке. Постараюсь от него избавиться. Все понял! ![]() Ну а код получается примерно таким:
Вроде все учел... |
Автор: susanin 16.4.2007, 09:35 |
Klin , спасибо! все правильно теперь! один только вопос не по теме.... ![]() а за что отвечаетт событие MaskEdit1Change??? |
Автор: Klin 16.4.2007, 12:07 |
При любом изменении данных в поле Text выполняется заданные действия. з.ы. желательно сделать вопрос решенным. |
Автор: Dem_max 16.4.2007, 19:36 |
1. Непонятно зачем в MaskEdit использовать обработку вводимых символов ? void __fastcall TForm3::MaskEdit2KeyPress(TObject *Sender, char &Key) { if ( WideChar(Key)>=65 && WideChar(Key)<=122 || WideChar(Key)==32) Key=NULL; } 2. Написано WideChar(Key)>=65 - зачем ? Нужно просто Key>=65 ну и вдогонку Думаю этот ман будет ответом на твой вопрос. А вообще маска на то и маска чтоб быть строгой формой и отсеивать неверный ввод. Символы шаблона маски : ! Наличие символа «!» означает, что в EditText недостающие символы предваряются пробелами, а отсутствие символа «!» означает, что пробелы размещаются в конце. > Символ «>» означает, что все последующие за ним символы должны вводиться в верхнем регистре, пока не кончится маска или пока не встретится символ «<». < Символ «<» означает, что все последующие за ним символы должны вводиться в нижнем регистре, пока не кончится маска или пока не встретится символ «>». <> Символы «<>» означают, что анализ регистра не производится. \ Символ «\» означает, что следующий за ним символ является буквенным, а не специальным, характерным для маски. Например, символ «>» после символа «\» воспримется как знак >, а не как символ, указывающий на верхний регистр. L Символ «L» означает, что в данной позиции должна бытъ буква. l Символ «l» означает, что в данной позиции может быть только буква или ничего. A Символ «А» означает, что в данной позиции должна быть буква или цифра. a Символ «а» означает, что в данной позиции может быть буква, или цифра, или ничего. C Символ «С» означает, что в данной позиции должен быть любой символ. c Символ «с» означает, что в данной позиции может быть любой символ или ничего. 0 Символ «0» означает, что в данной позиции должна быть цифра. 9 Символ «9» означает, что в данной позиции может быть цифра или ничего. # Символ «#» означает, что в данной позиции может быть цифра, знак «+», знак «-» или ничего. : Символ «:» используется для разделения часов, минут и секунд. / Символ «/» используется для разделения месяцев, дней и годов в датах. Символ « » означает автоматическую вставку в текст пробела. |
Автор: susanin 16.4.2007, 21:59 |
Dem_max , и зачем этот мануал было писать??? это я все и так в книге читал... а дописывать надо было для того, чтобы не вводились английские буквы.. |