Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Проверка на соответствие содержимого 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 *** }

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay