link4260 link4261 link4262 link4263 link4264 link4265 link4266 link4267 link4268 link4269 link4270 link4271 link4272 link4273 link4274 link4275 link4276 link4277 link4278 link4279 link4280 link4281 link4282 link4283 link4284 link4285 link4286 link4287 link4288 link4289 link4290 link4291 link4292 link4293 link4294 link4295 link4296 link4297 link4298 link4299 link4300 link4301 link4302 link4303 link4304 link4305 link4306 link4307 link4308 link4309 link4310 link4311 link4312 link4313 link4314 link4315 link4316 link4317 link4318 link4319 link4320 link4321 link4322 link4323 link4324 link4325 link4326 link4327 link4328 link4329 link4330 link4331 link4332 link4333 link4334 link4335 link4336 link4337 link4338 link4339 link4340 link4341 link4342 link4343 link4344 link4345 link4346 link4347 link4348 link4349 link4350 link4351 link4352 link4353 link4354 link4355 link4356 link4357 link4358 link4359 link4360 link4361 link4362 link4363 link4364 link4365 link4366 link4367 link4368 link4369 link4370 link4371 link4372 link4373 link4374 link4375 link4376 link4377 link4378 link4379 link4380 link4381 link4382 link4383 link4384 link4385 link4386 link4387 link4388 link4389 link4390 link4391 link4392 link4393 link4394 link4395 link4396 link4397 link4398 link4399 link4400 link4401
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