Проблема с MaskEdit'ом!

B.Boy

Member
Joined
Jul 20, 2005
Messages
65
Reaction score
0
Age
37
Location
Пенза-City
Website
www.politex.pnz.ru
У меня следующая проблема с MaskEdit'ом.
У меня стоит маска - номер телефона: "!\(999\) 000-0000;1; ".
Когда я, например, неполностью заполню поле, т.е. введу пару тройку цифр, то слетает с ошибкой: "Invalid input value. Use escape key to abandon changes"? В чем может быть проблема? Как исправить.
Такое же сообщение вылетает, если выделить текст в MaskEdit'е и удаить (DELETE).:confused: :confused: :confused:
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Мне тоже не нравится поведение TMaskEdit при выходе из контрола.

Исходный код обработчика:
Code:
procedure TCustomMaskEdit.CMExit(var Message: TCMExit);
begin
  if IsMasked and not (csDesigning in ComponentState) then
  begin
    ValidateEdit;
    CheckCursor;
  end;
  inherited;
end;

Видно, что вызывается метод ValidateEdit, который генерит исключение, да ещё и бибикает путём вызова метода ValidateError:
Code:
procedure TCustomMaskEdit.ValidateError;
begin
  MessageBeep(0);
  raise EDBEditError.CreateResFmt(@SMaskEditErr, [EditMask]);
end;

Я всегда меняю такое нехорошее поведение путём добавления свойства IsGenerateException: boolean и изменения ValidateError следующим образом:
Code:
procedure TCustomMaskEdit.ValidateError;
begin
  if FIsGenerateException then begin
    MessageBeep(0);
    raise EDBEditError.CreateResFmt(@SMaskEditErr, [EditMask]);
  end;
end;

Также я переношу в секцию public очень полезный метод Validate, которым и пользуюсь в своих обработчиках событий OnChange, OnExit и др.
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
А "нормально" - это как? Ведь всё от задачи зависит.
Как убрать исключение по умолчанию - я написал. Все изменения вносятся в модуль Mask.pas (где определён класс TCustomMaskEdit).

Стандартный собственный обработчик на OnExit после изменений:
Code:
var 
  Pos: integer;
begin
  if not Validate(MaskEdit1.EditText, Pos) then begin
    Что-то сообщаешь пользователю о неверном (неполном) вводе;
  end;
end;
 

B.Boy

Member
Joined
Jul 20, 2005
Messages
65
Reaction score
0
Age
37
Location
Пенза-City
Website
www.politex.pnz.ru
Задача следующая: У меня в этом маскедите должен вводиться номер телефона. Если я его ввожу недоконца или после ввода удаляю, то после перехода в другое поле (Edit например), вылетает ошибка.
ПС: А можно это какнить без ковыряния в mask.pas отлавливать эту ошибку?.. ЧТо в коде нужно дописать??.. Если подругому не получится, то буду в mask.pas. править. )))
 

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Отловить эту ошибку не проблема :)
Пишешь обработчик события OnException компонента ApplicationEvents и отлавливаешь на здоровье.
Но это не поможет решить твою задачу, так как курсор в другой Edit не перейдёт! Почему? А потому, что после возникновения ошибки произойдёт установка курсора обратно в TMaskEdit. Смотри вызов CheckCursor после ValidateEdit:
Code:
procedure TCustomMaskEdit.CMExit(var Message: TCMExit);
begin
  if IsMasked and not (csDesigning in ComponentState) then
  begin
    ValidateEdit;
    CheckCursor;
  end;
  inherited;
end;
Именно поэтому мне и не нравится поведение TMaskEdit при выходе из контрола.

P.S. А Jedi VCL не используешь? Там есть много на эту тему (например, TJvValidators).
 

B.Boy

Member
Joined
Jul 20, 2005
Messages
65
Reaction score
0
Age
37
Location
Пенза-City
Website
www.politex.pnz.ru
Скажи просто: что откуда удалить чтобы не вылетали сообщения об ошибке при неправильном заполнении МаскЕдита (при его недозаполнении)!
Пожалуйста!
 
Last edited by a moderator:

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Тяжёлый случай :)
Закомментируй строку
raise EDBEditError.CreateResFmt(@SMaskEditErr, [EditMask]);
(см. второй пост).
 
Top