Code:

procedure TForm1.Edit1Change(Sender: TObject);

var

  OldChange: TNotifyEvent;

  OldStart: Integer;

begin

  with (Sender as TEdit) do

  begin

    OldChange := OnChange;

    OnChange  := nil;

    OldStart  := SelStart;

    if ((SelStart > 0) and (Text[SelStart - 1] = ' ')) or (SelStart = 1) then

    begin

      SelStart  := SelStart - 1;

      SelLength := 1;

      SelText   := AnsiUpperCase(SelText);

    end;

 

    OnChange := OldChange;

    SelStart := OldStart;

  end;

end;

 

To Reproduce the Problem:

 

1. Drop two TEdits onto a form.

 

2. In the OnExit Event of Edit1 add the following code:

Code:

Application.MessageBox( 'Title','...', mb_ok );

 

Как-то раз встала такая проблема: если пользователь какое-то время ничего не вводит в элемент управления Edit, то предупредить его об этом.

Предположим, вы регулярно пользуетесь компонентами TEdit (в отличие от компонентов TDBEdit), и если так, то наилучшим местом для осуществления проверки на соответствие является обработчик события OnExit компонента TEdit. Данное событие наступает при каждом покидании фокуса компонента.

 

Обычно, при вводе неправильного текста в поле редактирования, у вас возникает желание послать предупреждение пользователю и вернуть фокус обратно. Тем не менее, в данном решении трудность подстерегает при попытке установить фокус в обработчике события OnExit. Поскольку Windows остается "посередине" при передаче фокуса от одного элемента управления другому в обработчике события OnExit, вы можете получить состояние нестабильного поведения компонентов, если попытаетесь в это время изменить фокус.