15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Элемент управления Edit, реагирующий на событие OnTimer.

Автор: Robert Wachtel

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

Совместимость: Delphi 3.x (или выше)

  Листинг 1 (Собственно пример)

unit EditOnTime;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;

type
TEditOnTime = class(TEdit)
private
  FInterval: integer;
  FTimer: TTimer;
  FOnTimer: TNotifyEvent;
  procedure SetInterval(Interval: integer);
  procedure Timer(Sender: TObject);
protected
  procedure KeyPress(var Key: char); override;
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
published
  property Interval: integer read FInterval write SetInterval default 750;
property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
end;

procedure Register;

implementation

//******************* RegisterComponent
// Здесь мы регистрируем компонент в IDE
procedure Register;
begin
RegisterComponents('MPS', [TEditOnTime]);
end;

//******************* TEditOnTime.SetInterval
// устанавливаем интервал таймера
procedure TEditOnTime.SetInterval(Interval: integer);
begin
FInterval := Interval;
if Assigned(FTimer) then
  FTimer.Interval := FInterval;
end;

//******************* TEditOnTime.Create
constructor TEditOnTime.Create(AOwner: TComponent);
begin
FInterval := 750;
inherited Create(AOwner);
if not (csDesigning in ComponentState) then
  try
   FTimer := TTimer.Create(self);
   FTimer.Enabled := false;
   FTimer.Interval := FInterval;
   FTimer.OnTimer := Timer;
  except
   FreeAndNil(FTimer);
  end;
end;

//******************* TEditOnTime.Destroy
destructor TEditOnTime.Destroy;
begin
if Assigned(FTimer) then
  FreeAndNil(FTimer);
inherited Destroy;
end;

//******************* TEditOnTime.OnTimer
procedure TEditOnTime.Timer(Sender: TObject);
begin
FTimer.Enabled := false;
if Assigned(FOnTimer) then
  FOnTimer(self);
end;

//******************* TEditOnTime.KeyPress
procedure TEditOnTime.KeyPress(var Key: char);
begin
FTimer.Enabled := false;
inherited KeyPress(Key);
FTimer.Enabled := (Text <> '') and Assigned(FTimer) and Assigned(FOnTimer);
end;

end.