C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблемы с MaskEdit, Стандартная ошибка при переводе фокуса
zeidel
Отправлено: 08.02.2007, 18:08


Ученик-кочегар

Группа: Участник
Сообщений: 9



MaskEdit штука очень удобная... Но есть одна известная проблема, которая обсуждалась на многих форумах (и на этом тоже), но на которую так никто толком и не ответил (или просто я не смог найти smile.gif ) Т.к. в основном эти темы полутора-двух годовой давности, я решил еще раз поднять эту тему (может мне кто-нибудь ответит sad.gif )
Например, у нас маска: ___-___
А мы введём её не полностью: 000-0__ и переведём фокус в другое поле (в какой-нибудь Edit, к примеру).
Выскакивает сообщение об ошибке:

Project xxx.exe raised exception class EDBEditError with message 'Invalid input value. Use escape key to abandon changes'. Process stoped. Use Step or Run to continue.

Если что-то писать в обработчике событий onExit — не помогает, т.к. эта стандартная проверка происходит раньше.
Подскажите, пожалуйста, как убрать это сообщение об ошибке или хотя бы заменить его чем-нибудь человеческим?

Подобное, например, находил на форуме по Delphi: http://dumpz.ru/forum/showthread.php?s=af9...8e6e135&t=34991
AVC
Отправлено: 08.02.2007, 18:32


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

MaskEdit ...
EDBEditError

???

Есть MaskEdit с маской ###-###. Переход фокуса при любом заполнении (не заполнении) ошибок не вызывает.

Проверять поля набора данных при их изменениях удобно (если работа через DataSource) тут DataSource->OnDataChange
zeidel
Отправлено: 08.02.2007, 19:00


Ученик-кочегар

Группа: Участник
Сообщений: 9



Это подходит только для цифр, а если мне нужно ввести что-то вроде G34-I98-07K

???
zeidel
Отправлено: 08.02.2007, 19:07


Ученик-кочегар

Группа: Участник
Сообщений: 9



Sorry, теперь понял, нужно что-то вроде>cc-99999;1;_
Все равно большое спасибо!!!
Termi_uc
Отправлено: 09.02.2007, 20:10


Дежурный стрелочник

Группа: Участник
Сообщений: 61



Если кому понадобится — есть ещё примерный путь решения проблемы:

Надо назначить свою функцию обработки ошибок
Application->OnException = Form1->AppException;

Описание функции примерно следующее:
CODE

void __fastcall TForm1::AppException(System::TObject* Sender, Sysutils::Exception* E)
{
AnsiString ErrorMessageHint;

if(E->Message.SubString(1, 20) == "Invalid input value.")
//Проверка на ошибку MaskEdit'а
{
if(Sender->ClassName().operator AnsiString() == AnsiString("TMaskEdit"))
//Действительноли MaskEdit?
{
TMaskEdit * me = (TMaskEdit *)Sender;
me->Clear();//Очищаем MaskEdit
me->Refresh();//Перегружаем.
//Сдесь по-хорошему надо проверять нажал пользователь Tab
// или перешол на другой компонент мышкой.
//Но в общем случае передаём фокус следующему контролу
Perform(WM_NEXTDLGCTL, 0, 0);
ErrorMessageHint = "";
}
else ErrorMessageHint = "Введено непралильное значение. Нажмите ESC!";
}

if(ErrorMessageHint != "")ShowMessage(ErrorMessageHint);
}


Вообще написанием своей функции обработки ошибок можно очень много удрать "лишнего" от пользователя.

Отредактировано Termi_uc — 09.02.2007, 20:11

Вернуться в Вопросы программирования в C++Builder