TObjectList'in OnNotify Eventini Kullanalım

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

TObjectList'in OnNotify Eventini Kullanalım

Mesaj gönderen ismailkocacan »

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....

uTask.pas

Kod: Tümünü seç

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<TTask>)
  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.
Unit2.pas

Kod: Tümünü seç

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.
İyi Çalışmalar...
Dosya ekleri
Using_TObjectList_OnNotifyEvent.rar
XE2
(4.75 KiB) 219 kere indirildi
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: TObjectList'in OnNotify Eventini Kullanalım

Mesaj gönderen omurolmez »

type
TTaskList =class;
TTask = class
private
FTaskName: string;
public
property TaskName: string read FTaskName write FTaskName;
procedure Start;
constructor Create(ATaskList :TTaskList; const ATaskName :string);
end;

TTaskList = class(TObjectList<TTask>)
private
procedure OnNotifyEvent(Sender: TObject; const Item: TTask;
Action: TCollectionNotification);
public
constructor Create;
end;

constructor TTask.Create(ATaskList :TTaskList; const ATaskName :string);
begin
inherited;
FTaskName :=ATaskName;
ATaskList.Add(Self);
end;

{
procedure TForm2.Button1Click(Sender: TObject);
begin
ATaskList := TTaskList.Create;
//ATask := TTask.Create;
//ATask.TaskName := 'Task 1';
//ATaskList.Add(ATask);
TTask.Create(ATaskList, 'Task 1');
end;
}
Ömür Ölmez
Cevapla