IT-Блог о программировании и операционных системах

Пользовательские события для начинающих

У новичков зачастую возникает проблема, создание собственных событий, отличных от событий Windows. Примером таких событий может быть, изменение каких-то данных, запуск какого-то метода и т.д. Delphi предлагает довольно простое и понятное решение для такого рода задач.

А теперь посмотрим как это делается. Создадим новое приложение и отдельный модуль uTest.
В этом модуле, создадим свой класс, который будет реализовывать хранение какой то текстовой информации.

TTextClass = class
  private
    FData: string
    procedure SetData(const Value: string);
  public
    property Data: string read FData write SetData;
end;

Теперь объявим класс-события:

TTextNotify = procedure(Sender: TObject; Text: string) of object;

Входные параметры определяются пользователем, по необходимости. В нашем случае мы определяем переменную типа TObject для передачи экземпляра класса и строковую переменную для передачи значения данных хранящихся в экземпляре.

Теперь объявим события, которые будут реагировать на 2 события:
- До редактирования текста
- После редактирования текст

TTextClass = class  
  private  
    FAfterSetText: TTextNotify;  
    FBeforeSetText: TTextNotify;  
    FData: string;  
    procedure SetData(const Value: string);  
  public  
    property Data: string read FData write SetData;  
    property BeforeSetText: TTextNotify read FBeforeSetText write FBeforeSetText;  
    property AfterSetText: TTextNotify read FAfterSetText write FAfterSetText;  
  end;

Ну а теперь осталось только написать вызовы данных событий

procedure TTextClass.SetData(const Value: string);  
begin  
  // Если определен метод обработки события, тогда вызываем его  
  if Assigned(FBeforeSetText) then FBeforeSetText(Self, Value);  
  FData := Value;  
  // Если определен метод обработки события, тогда вызываем его  
  if Assigned(FAfterSetText) then FAfterSetText(Self, Value);    
end;

Вот мы и создали свое пользовательское событие. А теперь пример использования. В главной форме приложения пишем следующий код:

unit Main;    
interface  
uses  
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  Dialogs, uTest;  
type  
  TfrmMain = class(TForm)  
    procedure FormCreate(Sender: TObject);  
    procedure FormDestroy(Sender: TObject);  
    procedure FormClick(Sender: TObject);  
  private  
    FText: TTextClass;  
  public  
     // Объявляем переменную созданного нами класса  
    property Text: TTextClass read FText write FText;      
    // Процедура реагирование на событие – ДоИзменение текста.   
    //Входные параметры должны соответствовать типу события(в нашем случае TTextNotify)  
    procedure DoBeforeSetText(Sender: TObject; Text: string);  
    // Процедура реагирование на событие – ПослеИзменение текста.  
    procedure DoAfterSetText(Sender: TObject; Text: string);       
  end;  
var  
  frmMain: TfrmMain;  
implementation  

{$R *.dfm}
  
procedure TfrmMain.FormCreate(Sender: TObject);  
begin  
  Text := TTextClass.Create;  
  Text.Data := 'Test1';    
  Text.BeforeSetText := DoBeforeSetText;  
  Text.AfterSetText := DoAfterSetText;  
end;

procedure TfrmMain.FormDestroy(Sender: TObject);  
begin  
  Text.Free;  
end;

procedure TfrmMain.DoAfterSetText(Sender: TObject; Text: string);  
begin  
  ShowMessage(Text);  
end;

procedure TfrmMain.DoBeforeSetText(Sender: TObject; Text: string);  
begin  
  ShowMessage(Text);  
end;

procedure TfrmMain.FormClick(Sender: TObject);  
begin  
  Text.Data := 'Test2';  
end;  
end.

Если все сделали правильно, то после клика по форме, сначала покажется сообщение с «Тест1», а потом «Тест2». Таким же образом можно объявлять собственные события, и для визуальных компонент, и прочих классов которые можно написать в Delphi.

2 комментария: