В одном из постов, если не ошибаюсь в блоге у Всеволода Леонова, довелось мне прочесть про забавный кейс. В программе было предусмотренно ограничение длины поля ввода пароля. При том, ограничивалось оно тихо, просто “съедая” лишние символы. Естественно, что после этого с паролями возникла неразбериха. В принципе, вопрос ограничения длины поля ввода сам по себе является философским, а возможно даже теологическим, но просто взять и “откусить хвост” вводимому тексту, на мой взгляд – не совсем правильно. Однако, в большинстве случаев, если задать свойство MaxLength для контрола, отвечающего за ввод текста, именно так и произойдет.
Компонент TcxTextEdit и другие компоненты из набора DevExpress могут красиво решать данную проблему благодаря событию OnValidate.
Код, который я использую выглядит примерно так:
procedure TfrmEditBenefit.txtBenefitNamePropertiesValidate(Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption; var Error: Boolean); begin if Length(txtBenefitName.Text)>125 then begin ErrorText:= 'Benefit name value is too long.'; Error:= True; end; end;
Для наглядности можно показать значок ошибки рядом с полем ввода.
txtBenefitName.Properties.ValidationOptions:= [evoRaiseException, evoShowErrorIcon];
Выглядеть это будет примерно так:
Ошибка генерируется если текст длиннее допустимого значения при попытке передать фокус другому контролу. При этом пользователь зразу видит что и где не так. По-моему очень удобно и наглядно.
Другие статьи серии:
DevExpress. TIPS & TRICKS #0
DevExpress. TIPS & TRICKS #1
DevExpress. TIPS & TRICKS #2
DevExpress. TIPS & TRICKS #3
DevExpress. TIPS & TRICKS #4
DevExpress. TIPS & TRICKS #5
DevExpress. TIPS & TRICKS #5.5
DevExpress. TIPS & TRICKS #6
Можно было бы добавить, что в настройках контролов от DevExpress есть возможность изменить реакцию компонента на такую ошибку — вывести сообщение, показать значок рядом с полем или ничего не делать. Можно даже разрешить менять фокус, оставив лишь показ одного значка.
Ну, в принципе, это все из кода видно. Я привел именно такой пример, потому, что именно такое поведение контрола мне больше всего нравится.
Не понял, где это MaxLength “откусывает хвост” ? По моему он просто не дает ввести больше символом чем надо. ИМНО дешево и сердито – в большинстве случаев другого и не надо.
Речь идет о случае, когда некоторое значение вставляется из буфера обмена. Тогда пользователь может тупо не заметить “обрезание”.