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

ما هو Sender المرسل ؟

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

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

كيف نستفيذ منه ؟ 

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

[صورة مرفقة: attachment.php?aid=4005]

الفورم اعلاه يحتوي على مجموعة من TSpeedButton تمت اعادة تسميتها بالطريقة btn_0, btn_1, btn_2 الخ و كما هو واضح الفورم عبارة عن آلة حاسبة بسيطة نريد عندما ننقر على الارقام كتابتها في Edit1 تماما مثل الالة الحاسبة ليس الهدف برمجة الة حاسبة نريد فقط توضيح الفكرة مبرمجنا لا يوضف الـ Sender لذلك سيكتب الكود عند حدث النقر على الزر btn_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 
في حدث الضغط على الزر btn_0
اكتب

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

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

[صورة مرفقة: attachment.php?aid=4006]

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

ما هو 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 اي يمكن تمرير مالك للـ TOpenDialog سيكون مسؤول عن تحرير الغرض من الذاكرة عندما يتحرر بدوره من الذاكرة لذلك لا داعي لاستخدام Free قمنا بتمرير Self الى الوسيط, Self هنا تعود للـ TForm1 اي عند استدعاء هادم TForm1  عن طريق Free مثلا سيتم استدعاء هادم TOpenDialog 

ما هو الـ Parent الاب ؟

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

PHP كود :
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 اي

PHP كود :
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

[Screen.FormsCount, Forms[Index ؟

ماذا لو اردنا ان نغير جميع الـ Captions لجميع الفرومات في مشروعنا او خواص اخرى
يمكننا ذلك عن طريق FormsCount التابعة للنمط Screen مثال:
PHP كود :
procedure TForm1.Button1Click(SenderTObject);
var
  IInteger;
begin
  
for := 0 to Screen.FormCount -do
  begin
    TForm
(Screen.Forms[i]).Caption := 'Test' IntToStr(I);
    TForm(Screen.Forms[i]).Show;
  end;
end

ان شاء الله  اكون قد وفقت في الطرح ان اصبت فمن الله و ان أخطأت فمن نفسي و الشيطان و السلام عليكم


الملفات المرفقة
.png   calc.png (الحجم : 8.2 KB / التحميلات : 21)
.png   ObjIns.png (الحجم : 9.43 KB / التحميلات : 21)
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
[-] كل من 6 users say قال شكرا ل S.FATEH على المشاركة المفيدة
  • Ben.Ja, h-farid, invocker, taha moh, zouaidahmed, أبو معاذ
الرد
#2
بارك الله فيك
لمسات برمجية مميزة
الرد
#3
رائع تلميحات و أفكار رائعة في البرمجة الكائنية التوجه.
حقا اللغة قوية جدا و لها مميزات تكاد تخفى على الكثيرين.

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


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


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