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

9 Mayıs 2013 Perşembe

Generic Listte En Büyük Nesneyi Bulmak !

Biliyorum çok boktan bir başlık oldu.
Aşağıda TKisi recordu ve TKisi recorlarından oluşan generic bir listimiz var(TKisiList).
Amacımız bu TKisiList de ki "id" değeri en büyük olan TKisi instance'ı bulmak(!).

Bunun için TKisiList sınıfına getMaxIdKisi() methodu ekleyip listenin içindeki her bir elemanın id değerini karşılaştırarak id değeri en büyük olan kişi nesnesini buluyoruz.


unit Kisi;

interface

uses
  System.Generics.Defaults,
  System.Generics.Collections;

type
  TKisi = record
    adi: string;
    soyadi: string;
    id: Integer;
  end;

  TKisiList = class(TList)
  public
    function getMaxIdKisi(): TKisi;
  end;

implementation

{ TKisiList }
function TKisiList.getMaxIdKisi: TKisi;
var
  comparer: IComparer;
  i, c: Integer;
begin
  comparer := TComparer.Default;
  c := Self.Items[0].id;
  for i := 1 to Self.Count - 1 do
  begin
    if comparer.Compare(Self[i].id, c) > 0 then
    begin
      c := Self[i].id;
      Result := Self[i];
    end;
  end;
end;

end.


var
  Form3: TForm3;

implementation

uses Kisi;

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var
  kisi: TKisi;
  kisiList: TKisiList;

  idEnbuyukKisi:TKisi;
begin
  kisiList:=TKisiList.Create;
  kisi.id:=30;
  kisi.adi:='İSMAİL';
  kisi.soyadi:='KOCACAN';
  kisiList.Add(kisi);


  kisi.id:=20;
  kisi.adi:='KEMAL';
  kisi.soyadi:='BAYAT';
  kisiList.Add(kisi);

  kisi.id:=31;
  kisi.adi:='HAYDAR';
  kisi.soyadi:='DÜMEN';
  kisiList.Add(kisi);


  idEnbuyukKisi:=kisiList.getMaxIdKisi;
  Caption:=Format('%s %s ',[idEnbuyukKisi.adi,idEnbuyukKisi.soyadi]);
end;

Örneği(XE2) burdan indirebilirsiniz.

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.