Проверка на соответствие содержимого TEdit
|
// Пример нового языка программирования
// разработанного Microsoft для новых русских
// "Microsoft Visual Fenya".
Program Vovan;
Чиста В_натуре (блин);
Мотаем_Цикл
Икс:= Продал (обменял(купил(обналичил(перевел(занял)))));
Отстегнул_долю (Крыша, 20%);
Пока (Икс > $1000000)
Рвем_когти (На_канары);
Иначе (На_нары);
Game_over.
|
Как мне проверить на соответствие содержимое компонента
TEdit?
Предположим, вы регулярно пользуетесь компонентами TEdit (в отличие от
компонентов TDBEdit), и если так, то наилучшим местом для осуществления проверки
на соответствие является обработчик события OnExit компонента TEdit. Данное
событие наступает при каждом покидании фокуса компонента.
Обычно, при вводе неправильного текста в поле редактирования, у вас возникает
желание послать предупреждение пользователю и вернуть фокус обратно. Тем не
менее, в данном решении трудность подстерегает при попытке установить фокус в
обработчике события OnExit. Поскольку Windows остается "посередине" при передаче
фокуса от одного элемента управления другому в обработчике события OnExit, вы
можете получить состояние нестабильного поведения компонентов, если попытаетесь
в это время изменить фокус.
Решением в данной ситуации может служить попытка послать сообщение в
обработчике события компонента TEdit OnExit вашей форме. Определенное
пользователем и посланное сообщение может послужить отправной точкой для начала
проверки содержимого поля редактирования. Поскольку посланное сообщение
располагается в конце очереди сообщений, то это дает Windows возможность
завершить изменение фокуса прежде, чем вы попытаетесь передать фокус другому
элементу управления.
Помещенный ниже текст модуля и текстовое представление формы (DFM) призваны
продемонстрировать эту технику:
{ *** НАЧАЛО КОДА МОДУЛЯ UNIT1.PAS *** }
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.
{ *** КОНЕЦ КОДА МОДУЛЯ UNIT1.PAS *** }
{ *** НАЧАЛО КОДА ФАЙЛА UNIT1.DFM *** }
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
{ *** КОНЕЦ КОДА ФАЙЛА UNIT1.DFM *** }
|
|