Предположим, вы регулярно пользуетесь компонентами TEdit (в отличие от компонентов TDBEdit), и если так, то наилучшим местом для осуществления проверки на соответствие является обработчик события OnExit компонента TEdit. Данное событие наступает при каждом покидании фокуса компонента.
Обычно, при вводе неправильного текста в поле редактирования, у вас возникает желание послать предупреждение пользователю и вернуть фокус обратно. Тем не менее, в данном решении трудность подстерегает при попытке установить фокус в обработчике события OnExit. Поскольку Windows остается "посередине" при передаче фокуса от одного элемента управления другому в обработчике события OnExit, вы можете получить состояние нестабильного поведения компонентов, если попытаетесь в это время изменить фокус.
Решением в данной ситуации может служить попытка послать сообщение в обработчике события компонента TEdit OnExit вашей форме. Определенное пользователем и посланное сообщение может послужить отправной точкой для начала проверки содержимого поля редактирования. Поскольку посланное сообщение располагается в конце очереди сообщений, то это дает Windows возможность завершить изменение фокуса прежде, чем вы попытаетесь передать фокус другому элементу управления.
Помещенный ниже текст модуля и текстовое представление формы (DFM) призваны продемонстрировать эту технику:
Code: |
unit Unit1;
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask;
const { Определенное пользователем сообщение } um_ValidateInput = wm_User + 100;
type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Button1: TButton; MaskEdit1: TMaskEdit; procedure Edit1Exit(Sender: TObject); private { обработчик определенного пользователем события } procedure ValidateInput(var M: TMessage); message um_ValidateInput; end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ValidateInput(var M: TMessage); begin { Следующая строка является строкой проверки. Я хочу убедиться в том, } { что первый символ является буквенным символом верхнего регистра. } { Помните о преобразовании типа lParam к TEdit. } if not (TEdit(M.lParam).Text[1] in ['a'..'z']) then begin ShowMessage('Содержимое не отвечает требованиям'); { Орем на пользователя } TEdit(M.lParam).SetFocus; { Снова устанавливаем фокус } end; end;
procedure TForm1.Edit1Exit(Sender: TObject); begin { Посылаем сообщение самому себе, говорящее о необходимости } { проверки содержимого. Передаем экземпляр TEdit (Self) как } { lParam сообщения. } PostMessage(Handle, um_ValidateInput, 0, longint(Sender)); end;
end. |
- Назад
- Вперёд >>
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!