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

Previous  Top  Next

    
 

Предположим, вы регулярно пользуетесь компонентами 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.

 

 

Code:

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

©Drkb::00973

http://delphiworld.narod.ru/

DelphiWorld 6.0