А теперь посмотрим как это делается. Создадим новое приложение и отдельный модуль 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.
Thank you for the info. It sounds pretty user friendly. I guess I’ll pick one up for fun. thank u
ОтветитьУдалитьпользовательские
Этот комментарий был удален автором.
ОтветитьУдалить