А теперь посмотрим как это делается. Создадим новое приложение и отдельный модуль 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.
