Проверка на соответствие содержимого TEdit
Обычно, при вводе неправильного текста в поле редактирования, у вас возникает желание послать предупреждение пользователю и вернуть фокус обратно. Тем не менее, в данном решении трудность подстерегает при попытке установить фокус в обработчике события OnExit. Поскольку Windows остается "посередине" при передаче фокуса от одного элемента управления другому в обработчике события OnExit, вы можете получить состояние нестабильного поведения компонентов, если попытаетесь в это время изменить фокус.
Решением в данной ситуации может служить попытка послать сообщение в обработчике события компонента TEdit OnExit вашей форме. Определенное пользователем и посланное сообщение может послужить отправной точкой для начала проверки содержимого поля редактирования. Поскольку посланное сообщение располагается в конце очереди сообщений, то это дает Windows возможность завершить изменение фокуса прежде, чем вы попытаетесь передать фокус другому элементу управления.
Помещенный ниже текст модуля и текстовое представление формы (DFM) призваны продемонстрировать эту технику:
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.
object Form1: TForm1 Left = 200 Top = 99 Width = 318 Height = 205 Caption = 'Form1' Font.Color = clWindowText Font.Height = -13 Font.Name = 'System' Font.Style = [] PixelsPerInch = 96 TextHeight = 16 object Edit1: TEdit Left = 32 Top = 32 Width = 121 Height = 24 TabOrder = 0 Text = 'Edit1' OnExit = Edit1Exit end object Edit2: TEdit Left = 160 Top = 32 Width = 121 Height = 24 TabOrder = 1 Text = 'Edit2' OnExit = Edit1Exit end object Edit3: TEdit Left = 32 Top = 64 Width = 121 Height = 24 TabOrder = 2 Text = 'Edit3' OnExit = Edit1Exit end object Edit4: TEdit Left = 160 Top = 64 Width = 121 Height = 24 TabOrder = 3 Text = 'Edit4' OnExit = Edit1Exit end object Button1: TButton Left = 112 Top = 136 Width = 89 Height = 33 Caption = 'Button1' TabOrder = 4 end end
DelphiWorld 6.0