OnNotify etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
OnNotify etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Ağustos 2012 Salı

TObjectList'in OnNotify Eventini Kullanalım

Elimizde TTask isminde bir Class'ımız ve bu class'a ait Start; isminde bir procedure'miz var.
yine TTask class'ının nesne referanslarının listesini tuttuğumuz TObjectList classından türeme bir TTaskList sınıfımız(Torbamız(!),Collection'ımız) var.

Ve şunu yapmak istiyoruz.Her taskı torbaya attığımda(eklediğimde) otomatik olarak Start; procedürü çalışsın.
Evet listeye ekledikten hemen sonra ATask.Start; şeklinde çağırabiliriz.Fakat bunu yapmak istemiyoruz....
unit uTasks;

interface

uses
  Dialogs,
  Generics.Defaults,
  Generics.Collections;
type
  TTask = class
  private
    FTaskName: string;
  public
    property TaskName: string read FTaskName write FTaskName;
    procedure Start;
  end;
  TTaskList = class(TObjectList)
  private
    procedure OnNotifyEvent(Sender: TObject; const Item: TTask;
      Action: TCollectionNotification);
  public
    constructor Create;
  end;
implementation

{ TTask }
procedure TTask.Start;
begin
  ShowMessage('Task is Started');
end;

{ TTaskList }
constructor TTaskList.Create;
begin
  inherited;
  Self.OnNotify := OnNotifyEvent;
end;

procedure TTaskList.OnNotifyEvent(Sender: TObject; const Item: TTask;
  Action: TCollectionNotification);
begin
  if Action = cnAdded then
    Item.Start;
end;
end.

unit Unit2;

interface

uses
  uTasks,
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
  ATask: TTask;
  ATaskList: TTaskList;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  ATaskList := TTaskList.Create;
  ATask := TTask.Create;
  ATask.TaskName := 'Task 1';
  ATaskList.Add(ATask);
end;
end.