Müdavim Girişi

E-Posta
Parola

Ücretsiz Kayıt Ol


Online Müdavimler (0 Kişi)
  • Online Kişi Bulunmadı

Yazar Hakkında
x
İsmail Kocacan
İsmail Kocacan is experienced on many development platforms and continues to learn technologies. Since the age of 16-17, dealing with software technologies. And continuous learning, teaching, research, continues to develop.
Run Time Type Information RTTI

  Herkese Selamlar saygılar

 Bu makalede sizlere Delphi’nin yeniliklerinden RTTI (Run Time Type Information) yani çalışma zamanı tip bilgisi anlamına gelen konuyu bir örnekle anlatmaya çalışcağım.

Çalışma zamanında herhangi bir tip’e ait bilgileri Rtti unitini içersindeki nesneler yardımı ile kolayca ve dinamik bir şekilde öğrenip.O tipe Rtti sayesinde taklalar attırabilirsiniz.Bu bahsettiğim konu daha çok dinamik programlama tekniğinde kullanıyor.Plugin tabanlı uygulamalar buna örnek verilebilir.Tam emin olmamakla beraber Rtti Delphi XE ve üst sürümlerinde kullanılabiliyor diye biliyorum.
Bende Bu örneği Delphi XE2 Pulsar 2011 ile hazırladım.Vakit buldukça bu dilin özelliklerini ve güzelliklerini anlatmaya çalışacağım.Şimdi biz şöyle bir örnek yapalım.
 
Mademki RTTI (Çalışma zamanı tip bilgisi) anlamına geliyor.Öyleyse bir tip(class) yazalım.Ve Bu class’a ait bilgileri Run Time’da öğrenelim.Bu class’ a ait bir fonksiyon ve bir prosedürü dinamik olarak çağıralım.
                                                                                               

unitUMain;
 
interface
 
uses
  Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,
  System.Classes,Vcl.Graphics,
  Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Rtti,Vcl.StdCtrls;
 
type
 
  TPersonel=class
  private
    FAd:string;
    FYas:Byte;
  public
    Procedureprosedur1(ileti:string);
    functionfonksiyon1(p1:string;p2:Integer):string;
    propertyAd:stringreadFAdwriteFAd;
    propertyYas:BytereadFYaswriteFYas;
  end;
 
  TForm1=class(TForm)
    lbMethodlar:TListBox;
    lbOzellikler:TListBox;
    lbAlanlar:TListBox;
    Label1:TLabel;
    Label2:TLabel;
    Label3:TLabel;
    lbParametreler:TListBox;
    Label4:TLabel;
    btnProcedureCagir:TButton;
    btnfonksyion1Cagir:TButton;
    procedureFormCreate(Sender:TObject);
    procedurelbMethodlarDblClick(Sender:TObject);
    procedurebtnProcedureCagirClick(Sender:TObject);
    procedurebtnfonksyion1CagirClick(Sender:TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1:TForm1;
  personel:TPersonel;
  rttiContext:TRttiContext;
  rttiType:TRttiType;
 
  method:TRttiMethod;
  methodParametresi:TRttiParameter;
  ozellik:TRttiProperty;
  alan:TRttiField;
 
implementation
 
{$R *.dfm}
 
{
  bildigimiz prosedr
}
procedureTPersonel.prosedur1(ileti:string);
begin
  ShowMessage(ileti);
end;
 
{ bildigimiz fonksiyon.
 Arife tarif ne hacet :)
}
functionTPersonel.fonksiyon1(p1:string;p2:Integer):string;
begin
  Result:=p1+' '+IntToStr(p2);
end;
 
{ fonksiyon1 dinamik olarak ?ir }
procedureTForm1.btnfonksyion1CagirClick(Sender:TObject);
var
  personel:TPersonel;
  sonuc:TValue;
  parametreler:arrayofTValue;
begin
  { Parametreler hazırlanıyor }
  SetLength(parametreler,2);
  parametreler[0]:='İsmail Kocacan';// p1 parametresi
  parametreler[1]:=2011;// p2 parametresi
 
  personel:=TPersonel.Create;
  sonuc:=rttiType.GetMethod('fonksiyon1').Invoke(personel,parametreler);
  FreeAndNil(personel);
  ShowMessage(sonuc.ToString);
end;
 
{ procedure1 dinamik olarak çağırılıyor }
procedureTForm1.btnProcedureCagirClick(Sender:TObject);
var
  personel:TPersonel;
  parametre:TValue;
begin
  personel:=TPersonel.Create;
  parametre:='Güzel Olacak Güzel;
  rttiType.GetMethod('prosedur1').Invoke(personel,parametre);
  FreeAndNil(personel);
end;
 
procedureTForm1.FormCreate(Sender:TObject);
begin
  { Record' dan bir referans olustur }
  rttiContext:=TRttiContext.Create;
  { Referans personel nesnesinin tipini aliyriz }
  rttiType:=rttiContext.GetType(TPersonel);
 
  { Methodlari okuyoruz }
  formethodinrttiType.GetMethodsdo
  begin
      lbMethodlar.Items.Add(method.Name);
  end;
 
  { özellikleri okuyoruz }
  forozellikinrttiType.GetPropertiesdo
  begin
    lbOzellikler.Items.Add(ozellik.Name);
  end;
 
  { Field'ları okuyoruz }
  foralaninrttiType.GetFieldsdo
  begin
    lbAlanlar.Items.Add(alan.Name);
  end;
 
end;
 
procedureTForm1.lbMethodlarDblClick(Sender:TObject);
{ seçili methodun parametleri okunuyor }
var
  seciliMethod:string;
begin
  seciliMethod:=lbMethodlar.Items[lbMethodlar.ItemIndex];
  method:=rttiType.GetMethod(seciliMethod);
 
  lbParametreler.Clear;
  formethodParametresiinmethod.GetParametersdo
  begin
    lbParametreler.Items.Add(methodParametresi.Name+':'+
      methodParametresi.ParamType.ToString);
  end;
 
end;
 
end.

 İşte Sonuç ;

 

Ne Öğrendik ?
Görüldüğü üzere Rtti kullanılarak bir tip’e has özelliklere erişmek Delphi XE ile mümkün.Ve yine aynı şekilde bir tipe ait fonksiyonu veya prosedürü Rtti ile dinamik olarak çağırabileceğimizi gördük.
 
Güzel düşünün, Güzel Olsun.
Güzel Olacak Güzel…
 
Kaynak Kodları İndirmek için Tıklatın
 
İsmail Kocacan (Yazılımcı Bozuntusu)

Kategori : Delphi | 18.07.2011 20:52:00  | 377 defa okundu  | 0 Yorum |

Yazara Ait Diğer Makaleler(51) Makaleye Yapılan Yorumlar İlk yorum yazan siz olun
Ara
 
Anket
Hangi VeriTabanı Yönetim Sistemini Kullanıyorsunuz ?