دلفي 2010 والدعم المحسن لل rtti
#1
نسخة دلفي 2010 كانت بها تحسينات على المترجم تعتبر الأكبر منذ نسخة دلفي 2 ودلفي 2009، حيث طالت تلك النسخة دعم كبير للغة دلفي على مستوى المترجم وليس فقط تحسينات لبيئة التطوير والمكونات الموجودة.

اليوم أمضيت بعض الوقت للبدء في تعلم ال Extended RTTI (Real Time Type Information التي أضيفت لدلفي، ورغم أن دلفي ومنذ بدايته كان به دعم جيد نوعاً ما لل RTTI، لكنه هذه الدعم كان محصور ضمن البيانات والطرق المعرفة ضمن جزء ال Published في أي صنف، وأيضا لم يكن على مستوى عالي مثل الموجود في الجافا ولغات الدوت نت في حيث ما يعرف ب Reflection.

لكن مع دلفي 2010 تم زيادة هذا الدعم تحت مسمى Extended RTTI، بحيث أصبح بالإمكان التعامل مع جميع محتويات الصنف وليس ال Published فقط، ومع إضافة دعم ال Attributes للغة دلفي، أصبح بالإمكان الوصول للعديد من المميزات الموجودة في دوت نت وجافا ولكن بدون تضييع مستوى الآمان، حيث لا يمكن إرجاع الكود إلى أصله، وأيضاً يمكن توقيف توليد هذه المعلومات.
يمكن الإطلاع على وحدة rtti.pas التي أضيفت إلى دلفي 2010 وبها TRTTIContext الذي يعتبر قلب التعامل مع ال RTTI، ورغم بساطته لكن يعتبر نقطة البداية في التعامل مع أي صنف من خلال ال RTTI.

سوف أتطرق اليوم لمثال بسيط، حيث سوف أقوم بتعريف صنف جديد TStudClass ومن ثم سوف أقوم بعرض جميع مع يحتويه هذا الصنف من خلال ال RTTI المحسن.


PHP كود :
{*******************************************************}
{                                                       }
{       
RTTI Sample with Delphi 2010(+)                 }
{                                                       }
{       
Copyright (C2010 Mohammed Nasman              }
{                                                       }
{*******************************************************}

program RttiDemo1;

{
$APPTYPE CONSOLE}

uses
 SysUtils
RTTI;

type
 TStudClass 
= class
 private
 
FStudIDinteger;
 
FStudNamestring;
 
FStudRegDateTDate;
 
FStudAddrstring;
 public
 
property StudID      :Integer read FStudID write FStudID;
 
property StudName    :string read FStudName write FStudName;
 
property StudRegDate :TDate read FStudRegDate write FStudRegDate;
 
property StudAddr    :string read FStudAddr write FStudAddr;

 
procedure PrintStuData;
 
end;

var
 
TRttiType;
 
TRttiContext;
 
TRTTIField;
 
TRTTIMethod;
 
TRttiProperty;

function 
GetFormattedType(s:string):string;
var
 
Integer;
begin
 P 
:= Pos('@',S);
 if 
0  then
 Result 
:= copy(S,1,P-1)
 else
 
Result := S;
end;
TStudClass }
procedure TStudClass.PrintStuData;
begin
 
//
end;

begin
:= c.GetType(TStudClass);
Writeln('============ Listing all fields of Class:',TStudClass.ClassName);
for 
f in t.GetFields do
 
Writeln(GetFormattedType(f.ToString));

Writeln;
Writeln('============ Listing all Methods of Class:',TStudClass.ClassName);
for 
M in t.GetMethods do
 if 
m.Parent c.GetType(TStudClassthen
 Writeln
(GetFormattedType(M.ToString));

Writeln;
Writeln('============ Listing all Properties of Class: ',TStudClass.ClassName);
for 
P in t.GetProperties do
 
Writeln(GetFormattedType(P.ToString));

Readln;
end

والنتيجة تكون بالشكل التالي:
[صورة مرفقة: cmd1_thumb1.png]

عندما يتم طباعة مثلا P.ToString أو F.ToString فإنه سوف عرض البيانات الخاصة بالحقل أو الخاصية بالإضافة إلى موقعها في الذاكرة بالنسبة للصنف، لذا فقد قمت بكتابة دالة صغيرة لعرض البيانات بشكل أوضح وهي GetFormattedType، ويمكن رفعها لرؤية الفرق في الناتج.

أيضاً من الملاحظ أنني لم أقم سوف بكتابة Method واحدة ضمن الصنف، لكن تم عرض الكثير منها والتي هي موروثة من الصنف الأب TObject، لذا فبعد قليل من التمحيص ضمن TRTTIMethod وجدت أن ال Parent الخاص يرجع الصنف الأب لل Method التي داخل التكرار، لذا فلو قمنا بفحصها مع النوع الراجع من TRttiContext فهكذا نضمن بأن ال Methods هي تابعة للصنف المراد عرض بياناته فقط، ويصبح جزئية عرضة ال Methods كالتالي:


PHP كود :
Writeln('============ Listing all Methods of Class:',TStudClass.ClassName);
for 
M in t.GetMethods do
if 
m.Parent c.GetType(TStudClassthen
 Writeln
(GetFormattedType(M.ToString)); 

وتظهر النتجة الآن بشكل صحيح هكذا:
[صورة مرفقة: cmd2_thumb1.png]


يمكن الحصول أيضاً على معلومات أخرى مثل ال Attributes لكن هذه تحتاج إلى موضوع آخر في الفترة القادمة إن شاء الله.

وإلى لقاء آخر بأذن الله
=======
من مدونتي
كود :
http://www.mnasman.com/blog/?p=278
#2
عمل رهيب
بارك الله فيك أخي محمد
جاري المراجعة..
ومن يتهيب صعود الجبال يعش أبد الدهر بين التلال و الحفر
#3
بارك الله فيك أخي محمد , يعني ننسى دلفي 7 [صورة مرفقة: 50.gif]؟؟
بالتوفيق,,
I'M Fly Like A G6

#4
إقتباس :بارك الله فيك أخي محمد , يعني ننسى دلفي 7 ؟؟

من وجهة نظري يجب أن تنساه، دلفي 2010 بصراحة قمة في الإنتاجية وهناك المئات من المميزات التي إن تتعود عليها لن تستطيع الرجوع إلى دلفي 7

تماماً مثلاً تتعود على ويندوز 7 ولا تستطيع الرجوع لويندوز إكس بي، رغم أن من أفضل نظم التشغيل التي عملت عليها Smile.


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف