Предположим, вы регулярно пользуетесь компонентами TEdit (в отличие от компонентов TDBEdit), и если так, то наилучшим местом для осуществления проверки на соответствие является обработчик события OnExit компонента TEdit. Данное событие наступает при каждом покидании фокуса компонента.
Обычно, при вводе неправильного текста в поле редактирования, у вас возникает желание послать предупреждение пользователю и вернуть фокус обратно. Тем не менее, в данном решении трудность подстерегает при попытке установить фокус в обработчике события OnExit. Поскольку Windows остается "посередине" при передаче фокуса от одного элемента управления другому в обработчике события OnExit, вы можете получить состояние нестабильного поведения компонентов, если попытаетесь в это время изменить фокус.
Решением в данной ситуации может служить попытка послать сообщение в обработчике события компонента TEdit OnExit вашей форме. Определенное пользователем и посланное сообщение может послужить отправной точкой для начала проверки содержимого поля редактирования. Поскольку посланное сообщение располагается в конце очереди сообщений, то это дает Windows возможность завершить изменение фокуса прежде, чем вы попытаетесь передать фокус другому элементу управления.
Помещенный ниже текст модуля и текстовое представление формы (DFM) призваны продемонстрировать эту технику:
{ *** НАЧАЛО КОДА МОДУЛЯ UNIT1.PAS *** }unit Unit1; interface usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask; const{ Определенное пользователем сообщение }um_ValidateInput = wm_User + 100; typeTForm1 = 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; varForm1: TForm1; implementation {$R *.DFM} procedure TForm1.ValidateInput(var M: TMessage);begin{ Следующая строка является строкой проверки. Я хочу убедиться в том, }{ что первый символ является буквенным символом верхнего регистра. }{ Помните о преобразовании типа lParam к TEdit. }if not (TEdit(M.lParam).Text[1] in ['a'..'z']) then beginShowMessage('Содержимое не отвечает требованиям'); { Орем на пользователя }TEdit(M.lParam).SetFocus; { Снова устанавливаем фокус }end;end; procedure TForm1.Edit1Exit(Sender: TObject);begin{ Посылаем сообщение самому себе, говорящее о необходимости }{ проверки содержимого. Передаем экземпляр TEdit (Self) как }{ lParam сообщения. }PostMessage(Handle, um_ValidateInput, 0, longint(Sender));end; end.{ *** КОНЕЦ КОДА МОДУЛЯ UNIT1.PAS *** } { *** НАЧАЛО КОДА ФАЙЛА UNIT1.DFM *** }object Form1: TForm1Left = 200Top = 99Width = 318Height = 205Caption = 'Form1'Font.Color = clWindowTextFont.Height = -13Font.Name = 'System'Font.Style = []PixelsPerInch = 96TextHeight = 16object Edit1: TEditLeft = 32Top = 32Width = 121Height = 24TabOrder = 0Text = 'Edit1'OnExit = Edit1Exitendobject Edit2: TEditLeft = 160Top = 32Width = 121Height = 24TabOrder = 1Text = 'Edit2'OnExit = Edit1Exitendobject Edit3: TEditLeft = 32Top = 64Width = 121Height = 24TabOrder = 2Text = 'Edit3'OnExit = Edit1Exitendobject Edit4: TEditLeft = 160Top = 64Width = 121Height = 24TabOrder = 3Text = 'Edit4'OnExit = Edit1Exitendobject Button1: TButtonLeft = 112Top = 136Width = 89Height = 33Caption = 'Button1'TabOrder = 4endend{ *** КОНЕЦ КОДА ФАЙЛА UNIT1.DFM *** } |
[000945]