RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

Konuyu kısaca özetliyelim. c# ile geliştirdiğim bir projeyi delphi ile geliştirmeye başladım. Delphi 2010 'un yeni bir özelliği olan RTTI kütüphanesi çok işimi görecek fakat bir yerde takıldım. Sorun şu:

Elimdeki nesnenin ID özelliği var ve bu ID özelliğinin root ve extension özellikleri var.
bu alt özelliklere nasıl değer atayabilirim.

Örnek bir kod

Kod: Tümünü seç


Mesajobj Tobject tipinde bir parametre olarak geliyor.
var
  msj_type: TRttiType;
  ctx: TRttiContext;
  mesajObj_prop:TRttiProperty;
begin
  ctx := TRttiContext.Create;
  msj_type := ctx.GetType(mesajObj.ClassType);
  mesajObj_prop:=msj_type.GetProperty('id');// bu şekilde id property' sine ulaşıyorum
ID alanı bulunduktan sonra root ve extension alanlarına erişip setvalue ile değer ataması yapacağım.Yardımlarınız için şimdiden teşekkürler.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen aslangeri »

s.a.
belki işine yarar.
http://tr.delphipeak.com/2009/08/16/del ... ection.htm
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

aslangeri yazdı:s.a.
belki işine yarar.
http://tr.delphipeak.com/2009/08/16/del ... ection.htm
kolay gelsin.
Önceden incelemiştim ama dediğim gibi bir durum yok o sayfada.Yani nesnenin altındaki bir property'nin altındaki property' ye ulaşma durumu. Yada ben RTTI deki tecrübesizliğimden göremiyorum :)
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen sadettinpolat »

id nin tipi nedir ?
rtti ile id ye ulastiktan sonra tip cevrimi ile id yi de ilgili sinifa atayarak yine rtti ile elde ettiginiz bu yeni nesnenin propertleri uzerinde dolasabilirsiniz diye tahmin ediyorum.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

hocam elimde bir wsdl var.bu wsdl 'ı import edince (yaklaşık 40000 satır) elde ettiğim sınıf tanımlamaları var.Bunlardan biri MCCI_IN000001TR01_Message sınıfı.

Kod: Tümünü seç

MCCI_IN000001TR01_Message = class(TRemotable)
  private
    Fid: id42;
    FcreationTime: creationTime;
    FresponseModeCode: responseModeCode4;
    FinteractionId: interactionId;
    FprocessingCode: CS2;
    FprocessingModeCode: processingModeCode6;
    FacceptAckCode: acceptAckCode6;
    Freceiver: MCCI_IN000001TR01_Receiver;
    Fsender: MCCI_IN000001TR01_Sender;
    FcontrolActEvent: MCCI_IN000001TR01_ControlActEvent;
  public
    constructor Create; override;
    destructor Destroy; override;
  published
    property id:                 id42                               read Fid write Fid;
    property creationTime:       creationTime                       read FcreationTime write FcreationTime;
    property responseModeCode:   responseModeCode4                  read FresponseModeCode write FresponseModeCode;
    property interactionId:      interactionId                      read FinteractionId write FinteractionId;
    property processingCode:     CS2                                read FprocessingCode write FprocessingCode;
    property processingModeCode: processingModeCode6                read FprocessingModeCode write FprocessingModeCode;
    property acceptAckCode:      acceptAckCode6                     read FacceptAckCode write FacceptAckCode;
    property receiver:           MCCI_IN000001TR01_Receiver         read Freceiver write Freceiver;
    property sender:             MCCI_IN000001TR01_Sender           read Fsender write Fsender;
    property controlActEvent:    MCCI_IN000001TR01_ControlActEvent  read FcontrolActEvent write FcontrolActEvent;
  end;
Bu sınıfın altında id diye bir property var(yukarda ki "id42")

bu id sınıfı

Kod: Tümünü seç

id42 = class(II)
  private
    Froot: uid;
    Fextension: st;
    FnullFlavor: NullFlavor;
    FassigningAuthorityName: st;
    Fdisplayable: bl;
  published
    property root:                   uid         Index (IS_ATTR) read Froot write Froot;
    property extension:              st          Index (IS_ATTR) read Fextension write Fextension;
    property nullFlavor:             NullFlavor  Index (IS_ATTR) read FnullFlavor write FnullFlavor;
    property assigningAuthorityName: st          Index (IS_ATTR) read FassigningAuthorityName write FassigningAuthorityName;
    property displayable:            bl          Index (IS_ATTR) read Fdisplayable write Fdisplayable;
  end;
bu id alanın gördüğünüz gibi root ve extension propertyleri var. İşte bu propertylere değer atayamıyorum.
wsdl dosyasınıda ekliyorum belki gerekebilir.
Dosya ekleri
wsMuayene.rar
örnek wsdl dosyası.
(55.81 KiB) 92 kere indirildi
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen sadettinpolat »

> TID=class
> private
> froot: string;
> Fextension: string;
> published
> public
> property root:string read froot write froot;
> property extension:string read Fextension write fextension;
> end;
>
> TWSMessage=class
> private
> FID: TID;
> published
> public
> property ID:TID read FID write FID;
> end;

asagidaki sekilde deger atayabilirsin ama burda id degiskeninin tipini
onceden bilmen gerekiyor.
isini gorur mu emin degilim.
senin dedigin tarzda da deger atanabiliyordur belki ama su an icin nasil
yapilabilecegi konusunda kesin bir fikrim yok lakin
pro1.PropertyType.ToString satiri ile calisma zamaninda ilgili propertynin
sinifini ogrenebiliyorsun. belki bunun da bir faydasi olabilir.

Kod: Tümünü seç

procedure TForm5.Button1Click(Sender: TObject);
var
msg:TWSMessage;
tip1,tip2:TRttiType;
pro1,pro2:TRttiProperty;
ctx:TRttiContext;
id:TID;
begin
  msg:=TWSMessage.Create;
  ctx:=TRttiContext.Create;
  tip1:=ctx.GetType(msg.ClassType);
  pro1:=tip1.GetProperty('id');
//  ShowMessage(pro1.PropertyType.ToString);
  id :=TID.Create;
  id.root :='deneme';
  pro1.SetValue(msg,id);
  //tip2:=ctx.GetType(pro1.ClassType);//bu kod çalışmıyor
  //pro2:=tip2.GetProperty('root'); //bu kod çalışmıyor
  ShowMessage(msg.ID.root);
end;
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen sadettinpolat »

su sekilde oluyormus

Kod: Tümünü seç

unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Rtti;

type


TID=class
private
froot: string;
Fextension: string;
published
public
property root:string read froot write froot;
property extension:string read Fextension write fextension;
end;

TWSMessage=class
private
FID: TID;
published
public
constructor create;
property ID:TID read FID write FID;
end;


  TForm5 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button1Click(Sender: TObject);
var
msg:TWSMessage;
t:TRttiType;
p:TRttiProperty;
ctx:TRttiContext;
begin
  msg:=TWSMessage.Create;
  ctx:=TRttiContext.Create;
//  t:=ctx.GetType(msg.ClassType);
  t:=ctx.GetType(msg.ID.ClassType);
//  p:=t.GetProperty('id');
//  t:=ctx.GetType(p.PropertyType.Handle);
  p:=t.GetProperty('root');
  p.SetValue(msg.ID,'deneme');
  ShowMessage(msg.ID.root);
end;

{ TWSMessage }

constructor TWSMessage.create;
begin
  FID :=TID.Create;
end;

end.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

Hemen deniyorum
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

arkadaşlar henüz bir çözüm bulamadım bulunca yazacağım buraya
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen sadettinpolat »

yukarida yazdigim sekilde ben deger atamasi yapiyorum , tam olarak olmayan nedir ?
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

sadettinpolat yazdı: msg:=TWSMessage.Create;
ctx:=TRttiContext.Create;
// t:=ctx.GetType(msg.ClassType);
t:=ctx.GetType(msg.ID.ClassType);
// p:=t.GetProperty('id');
// t:=ctx.GetType(p.PropertyType.Handle);
p:=t.GetProperty('root');
p.SetValue(msg.ID,'deneme');
ShowMessage(msg.ID.root);
Hocam bu kodda msj.Id şeklinde kullanım var. Ben runtime esnasında ne msj biliyorum ne id .Zaten rtti nin olayı bu değilmi. EDN' e sordum ordan da cevap gelmedi. Daha sonra baya bir uğraşarak şöyle bir kod yazdım.

Kod: Tümünü seç

Mesaj_obj:=TWSMessage.Create;
ctx:=TRttiContext.Create;
pro1:=ctx.GetType(Mesaj_obj.ClassInfo).GetProperty('id');
VKayit:=pro1.NewInstance;
pro2:=pro1.PropertyType.GetProperty('root');
pro2.SetValue(vkayit,Tvalue('Deneme').AsString);
ShowMessage(pro2.GetValue(vkayit).ToString);
bu kod düzgün çalışıyor. Ama burda farklı bir sorun ortaya çıktı ki buna nasıl bir çözüm bulacağım bilemedim. Biliyorsunuz aslında ben yukardaki class tanımlarını örnek için vermiştim (TWSMessage). Bu kodu kendi web servisimdeki projemde kullandığımda yine çalışmadı. Şuan bunun üzerinde çalışıyorum.WSDL dosyasını yollamıştım size. Rica etsem yukardaki kodu bu WSDL'daki classlar üzerinde deneyebilirmisiniz. (İyice yüzsüzlüğe vurdum farkındayım :oops: )
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen sadettinpolat »

ben iki turlusunude denemistim. msg.id uzerinden deger degistirdigim kodu acik biraktim msg uzerinden ayni islemi yaptigim kodu ise fikir olmasi acisindan // yorum olarak biraktim hangisi isini gorurse kullanirsin diye. yani msg olarakta id degerine ulasip degerini set edebilirsin ama msg degiskenide ortalikta yokken nasil erisecegini soruyorsan simdilik o konuda birsey diyemem
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

Peki hocam sizin verdiğiniz kodda instance olarak ne kullanıcaz (msg.id dışında) . Mesela ben VKayit diye bir nesnenin içine atıyorum. Doğrumudur.

Ayrıca sizin verdiğiniz kodu WSDL ile denedim yine çalışmıyor. Zaten benim kodun hemen hemen aynısıymış.
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

Bakmak isteyen olursa küçük bir örnek proje hazırladım.
wsDeneme.rar
Örnek Proje
(58.25 KiB) 105 kere indirildi
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: RTTI ile alt özelliklerin, alt özelliklerine erişmek.

Mesaj gönderen comfort »

ayrıca bu da EDN'de devam eden thread.

https://forums.embarcadero.com/thread.j ... 643#166643

Tarzanca konuşuyom adamlara ama sağolsunlar onlar da yardımcı olmaya çalışıyorlar. :D
Cevapla