zeidel |
Отправлено: 08.02.2007, 18:08 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 9
|
MaskEdit штука очень удобная... Но есть одна известная проблема, которая обсуждалась на многих форумах (и на этом тоже), но на которую так никто толком и не ответил (или просто я не смог найти ) Т.к. в основном эти темы полутора-двух годовой давности, я решил еще раз поднять эту тему (может мне кто-нибудь ответит )
Например, у нас маска: ___-___
А мы введём её не полностью: 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
|
|