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.