Add new comment

DataBinding in Delphi .net Applications (2)


نتابع في موضوع الـ DataBinding في برامج دلفي .NET
الآن لنختبر الحالة المعاكسة و هي تغيير قيم الحقول FirstName,LastName للغرض Per و نراقب ما الذي سيحدث لذلك سنضيف زراً جديداً على النموذج و لنضيف إليه الشيفرة التالية التي تقوم بتغيير قيم الحقول


procedure TWinForm.Button2_Click(sender: System.Object; e: System.EventArgs);
begin
Per.FirstName := 'Mazen';
Per.LastName := 'Salman';
end;


عند تغيير قيم الحقول نجد أن هذا التغيير لا ينعكس على الـ TextBox ، عند التدقيق في الأمر نجد أن هذا الأمر منطقي لأنه من الذي سيخبر الـ TextBox بأن قيم حقول الغرض قد تغيرت ؟ ببساطة لا أحد.
لا يوجد ضمن الصف Tperson حدث Event يقوم بهذه المهمة أو بالأحرى يقوم بـ (قدح Trigger) آلية الربط (Binding) التلقائية و التي تقوم بالتعديل و لذلك مهمتنا الآن أن نقوم بإنشاء هذا الحدث ضمن الصف TPerson .
بغية استخدام آلية الربط التلقائية يجب أن يكون اسم هذا الحدث عبارة عن اسم الخاصية مضافاً إليها كلمة Changed أي FirstNameChanged أو LastNameChanged إضافة هذا الحدث لا تكفي بل يجب أيضاً أن نقوم باستدعائه بعد كل عملية اسناد قيمة جديدة للخاصية و بالتالي يصبح الصف TPerson كما يلي:


TPerson = Class
private
FLastName: String;
FFirstName: String;
FFirstNameChanged: EventHandler;
FLastNameChanged: EventHandler;
procedure set_FirstName(const Value: String);
procedure set_LastName(const Value: String);
procedure set_LastNameChanged(const Value: EventHandler);
procedure set_FirstNameChanged(const Value: EventHandler);
public
published
Property FirstName :String read FFirstName write set_FirstName;
Property LastName :String read FLastName write set_LastName;
Property FirstNameChanged : EventHandler read FFirstNameChanged write set_FirstNameChanged;
Property LastNameChanged : EventHandler read FLastNameChanged write set_LastNameChanged;
End;

implementation

{ TPerson }

procedure TPerson.set_FirstName(const Value: String);
begin
FFirstName := Value;
if Assigned(FirstNameChanged) then
Begin
FFirstNameChanged(self,EventArgs.Empty);
End;
end;

procedure TPerson.set_FirstNameChanged(const Value: EventHandler);
begin
FFirstNameChanged := Value;
end;

procedure TPerson.set_LastName(const Value: String);
begin
FLastName := Value;
if Assigned(LastNameChanged) then
Begin
FLastNameChanged(self,EventArgs.Empty);
End;
end;

procedure TPerson.set_LastNameChanged(const Value: EventHandler);
begin
FLastNameChanged := Value;
end;


بعدها عند تشغيل البرنامج و نغيير القيم الخصائص للغرض Per سنجد أن القيم الجديدة تظهر ضمن الـ TextBox

طبعأ ليس من الضروري أن تكون الخاصية نصية حتى يتم ربطها إلى الخاصية Text ، يمكن مثلاً أن نضيف خاصية جديدة Age من النوع Integer إ لى الصف TPerson ثم نقوم بربطها إلى الخاصية Text في TextBox وهذا الأمر سأتركه لكم على سبيل التدريب.
وستابع موضوعنا في مقالات لاحقة ...

Articles Categories: