Проверка на соответствие содержимого TEdit

Проверка на соответствие содержимого TEdit Предположим, вы регулярно пользуетесь компонентами TEdit (в отличие от компонентов TDBEdit), и если так, то наилучшим местом для осуществления проверки на соответствие является обработчик события OnExit компонента 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
   = 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
   = 32
  Width = 121
  Height = 24
  TabOrder = 0
  Text = 'Edit1'
  OnExit = Edit1Exit
 end
 object Edit2: TEdit
  Left = 160
   = 32
  Width = 121
  Height = 24
  TabOrder = 1
  Text = 'Edit2'
  OnExit = Edit1Exit
 end
 object Edit3: TEdit
  Left = 32
   = 64
  Width = 121
  Height = 24
  TabOrder = 2
  Text = 'Edit3'
  OnExit = Edit1Exit
 end
 object Edit4: TEdit
  Left = 160
   = 64
  Width = 121
  Height = 24
  TabOrder = 3
  Text = 'Edit4'
  OnExit = Edit1Exit
 end
 object Button1: TButton
  Left = 112
   = 136
  Width = 89
  Height = 33
  Caption = 'Button1'
  TabOrder = 4
 end
end
http://delphiworld.narod.ru/ DelphiWorld 6.0

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...