Parent, Sender,Owner, ControlCount, ComponentCount
#1
السلام عليكم و رحمة الله و بركاته

Parent, Sender,Owner, ControlCount, ComponentCount

سنركز في هذا الدريس على هذه الاشياء الثلاث

بداية ما هو Sender المرسل ؟؟

تحتوي جميع احداث دلفي على الوسيط Sender لكن ما هو هذا الوسيط و كيف نستفيد منه الوسيط Sender هو من النمط TObject و هو الاب لجميع الانماط في الدلفي لذلك يمكن ان يحمل اي نمط مورث منه

فكر في [COLOR="DarkGreen"]Sender على انه طريقة لمعرفة من استدعى الحدث [/COLOR]

كيف نستفيذ منه ؟ يوفر الوسيط Sender طريقة لمعرفة من استدعى الحدث لذلك ستكون لديك مرونة كبيرة في حالة كان الكود يتكرر في العديد من الاماكن

[صورة مرفقة: 9-14-20133-13-43AM_zps20167559.png]

الفورم اعلاه يحتوي على مجموعة من SpeedButton تمة اعادة تسميتها بالطريقة btn_0, btn_1, btn_2 الخ و كما هو واضح الفورم عبارة عن آلة حاسبة بسيطة نريد عندما ننقر على الارقام كتابتها في Edit تماما مثل الالة الحاسبة ليس الهدف برمجة الة حاسبة نريد فقط توضيح الفكرة مبرمجنا لا يوضف الـ Sender لذلك سيكتب الكود عند حدث النقر على الزر 0 :

PHP كود :
procedure TForm1.btn_0Click(SenderTObject);
begin
  Edit1
.Text := btn_0.Caption;
end

شيئ بسيط و سنحصل على الكود التالي لجميع الازرار

PHP كود :
procedure TForm1.btn_0Click(SenderTObject);
begin
  Edit1
.Text := btn_0.Caption;
end;

procedure TForm1.btn_1Click(SenderTObject);
begin
  Edit1
.Text := btn_1.Caption;
end;

procedure TForm1.btn_2Click(SenderTObject);
begin
  Edit1
.Text := btn_2.Caption;
end;

procedure TForm1.btn_3Click(SenderTObject);
begin
  Edit1
.Text := btn_3.Caption;
end;

procedure TForm1.btn_4Click(SenderTObject);
begin
  Edit1
.Text := btn_4.Caption;
end;

procedure TForm1.btn_5Click(SenderTObject);
begin
  Edit1
.Text := btn_5.Caption;
end;

procedure TForm1.btn_6Click(SenderTObject);
begin
  Edit1
.Text := btn_6.Caption;
end;

procedure TForm1.btn_7Click(SenderTObject);
begin
  Edit1
.Text := btn_7.Caption;
end;

procedure TForm1.btn_8Click(SenderTObject);
begin
  Edit1
.Text := btn_8.Caption;
end;

procedure TForm1.btn_9Click(SenderTObject);
begin
  Edit1
.Text := btn_9.Caption;
end

لاحظ الالم في تكرير الكود يقوم تقريبا بنفس العمل
لنوضف الـ Sender
في حدث الضغط على الزر 0
اكتب

PHP كود :
procedure TForm1.btn_0Click(SenderTObject);
begin
  Edit1
.Text := TSpeedButton(Sender).Caption;
end

حدد جميع الازرار اذهب Events الحدث OnClick تصفح القائمة ستجد btn_0Click اختره الذي قمنا به هو اننا اسندنا الحدث btn_0Click الى الازرار btn_1, btn_2, btn_3 ... اي عندما نضغط على btn_1 كأننا ضغطنا على btn_0 كما قلنا يمكننا ان نعرف عن طريق الـ Sender الزر الذي طلب الحدث و بالتالي الاستجابة حسبه ...

[صورة مرفقة: 9-14-20133-31-23AM_zps0a995776.png]

فبدل العشر اسطر سنحصل على سطر واحد نظيف و في مكان واحد

ما هو Owner المالك ؟؟

Owner المالك هو المسؤول عن تحرير الذاكرة لجميع المكونات التي يملكها
لنلاحظ المثال التالي:

PHP كود :
procedure TForm1.Button1Click(SenderTObject);
var
  
OpenDialogTOpenDialog;
begin
  OpenDialog 
:= TOpenDialog.Create(Self);
  if 
not(OpenDialog.Executethen Exit;
    
ShowMessage(OpenDialog.FileName);
end

باني (Constructor) الغرض TOpenDialog يحتوي على وسيط AOwner اي يمكن تمرير مالك للـ OpenDialog سيكون مسؤول عن تحرير الغرض من الذاكرة عندما يتحرر بدوره من الذاكرة لذلك لا داعي لاستخدام Free قمنا بتمرير Self الى الوسيط Self هنا تعود على TForm1 اي عند استدعاء هادم TForm1 عن طريق free lمثلا سيتم استدعاء هادم OpenDialog

ما هو الـ Parent ؟؟

ليس كل المكونات يمكن لها ان تكون اباء هناك فئة من المكونات التي يمكن لها ان تكون اباء لمكونات اخرى نذكر منها TPanel, TForm, TPageControl, TTabSheet, TGroupBox و مثل في الحياة يمكن للابناء ان يحملو صفات الاباء فمثلا زر موجود على panel يمكن له ان يحمل نفس لون parent و يمكن للـ parent ان يغير جميع نوع الخط حجم الخط لجميع الابناء يكفي فقط ان تكون خاصية Button1.ParentFont := True; للابن

ComponentCount, Components[Index] ؟؟

كما يمكن الوصول الى خصائص المكونات عن طريق اسم المكون مثل Edit1.Text يمكن الوصول الى المكونات عن طريق Index رقم المكون او رتبته الخاص بها جميع المكونات على الفورم لديه Index خاص بها فمثلا فورم يحتوي فقط على مكون Edit1 سيكون index الخاص بالـ Edit1 هو 0 و بالتالي يمكن الوصول الى المكون Edit1 عن طريق معرفة Index السطرين التالين متكافئان و يقومان بنفس الامر

PHP كود :
Edit1.Text := 'Delphi4Arab';
  
TEdit(Components[0]).Text := 'Delphi4Arab.Net'

لنفترض لدينا مجموعة من الـ Edits و نريد عمل Reset افراغ جميع المكونات من النصوص مبرمج لا يضف ComponentCount سيكتب شيئ مثل

PHP كود :
procedure TForm1.Button1Click(SenderTObject);
begin
  Edit1
.Clear;
  
Edit2.Clear;
  
Edit3.Clear;
  
Edit4.Clear;
  
Edit5.Clear;
  
Edit6.Clear;
  
Edit7.Clear;
  
Edit8.Clear;
  
Edit9.Clear;
  
Edit10.Clear;
  
Edit12.Clear;
  
Edit13.Clear;
end

و مرة اخرى الم كبير في تكرير الكود
باستخدام الـ ComponentCount يمكننا عمل حلقة على جميع مكونات الفورم التحقق اذا كانت من النمط TEdit اذا كانت كذلك نقوم بعملية تسمى Type Casting و نقوم باجراء ما نريد و سيكون لدينا كود انضف بكثير

PHP كود :
procedure TForm1.Button1Click(SenderTObject);
var
  
IInteger;
begin
  
for := 0 to ComponentCount do
    if (
Components[iis TEdit)  then
      TEdit
(Components[i]).Clear;
end

لكن ماذا لو كان لدينا جميع Edits موجودة على Panel اي
كود :
Edit1.Parent <> nil
عندها الكود اعلاه لن يعمل حاول ذلك و لن يعمل ما العمل دلفي يوفر طريقة اخرى

ControlCount,Controls[Index] ؟؟

اذا كان المكونات لديها Parent نستخدم ControlCount بدل من ComponentCount

PHP كود :
procedure TForm1.Button1Click(SenderTObject);
var
  
IInteger;
begin
  
for := 0 to Panel1.ControlCount do
    if (
Panel1.Controls[iis TEditthen
      TEdit
(Panel1.Controls[i]).Clear;
end

ان شاء الله اكون قد وفقت في الطرح ان اصبت فمن الله و ان أخطأت فمن نفسي و الشيطان و السلام عليكم
[-] كل من 4 users say قال شكرا ل S.FATEH على المشاركة المفيدة
  • Ben.Ja, h-farid, taha moh, zouaidahmed
الرد
#2
بارك الله فيك
لمسات برمجية مميزة
الرد
#3
رائع تلميحات و أفكار رائعة في البرمجة الكائنية التوجه.
حقا اللغة قوية جدا و لها مميزات تكاد تخفى على الكثيرين.

شكرا على الدرس .
الرد
#4
درس مليئى بالدسم بارك الله فيك Smile
> مبرمج مبتدئ < سبحان الله بحمده... سبحان الله العظيم
الرد
#5
بارك الله فيك اخ فاتح
الفاشلون نوعان : الأول : فكر ولم يفعل .. والآخر: فعل ولم يفكر
الرد
#6
جميل .. بارك الله فيك
الرد
#7
بارك الله لك صنعك و جعله علما ينتفع به و أعانك على المزيد من العطاء.
من قال حاد عن أصله أو قال مات فقد كذب
الرد
#8
بارك الله فيك
الرد
#9
بارك الله فيك
الرد


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


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