delphi4arab منتديات دلفي للعرب

نسخة كاملة : استخدآم كلمة self لأدل على المكون, كيف؟
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم ورحمة الله

اخواني الكرام ,, كلمة self في الكود,, ماذا تعني ؟

انا جربت استخداماها ولكنّها تدل على الفورم,, اي Form1

اود استخدامها او كلمة اخرى تفي بلغرض لأدل على المكون الذي اكتب الكود فيه,,

,,

للتوضيع

عندي ما يقارب ال 70 button;;

وكلهم اود ان اكتب فيهم نفس الكود وهو

edit1.text := self.caption

اي الكابشن للبوتون وليس الفورم بارك الله لكم,, فهل من حلّ لذلك جزاكم الله خيرا؟

ان شاء الله السؤآل وآضح الآن ؟

والسلام عليكم ورحمة الله
اخواني للدوضيح اكثر,,

هل هناك طريقة او كلمة ككلمة سيلف يمكن استخدآمها لأدل على المكون وليس الفورم الذي اكتب فيه الكود ؟

يعني مثلا
SelfComponent او شئ من هذا Rolleyes
السلام عليكم بالنسبة ل Self

لتفهم جيدا لابد من ان تكون تعاملت مع البرمجة الكائنية التوجه و Self شبيهة ب This في ++C و Me في VB.NET

http://www.delphibasics.co.uk/RTL.asp?Name=Self

أما المكونات فحلقة تكرارية كافية...

PHP كود :
procedure TForm1.FormCreate(Sender: TObject);
var 
i:Integer;
begin
for i:= 0 to ComponentCount -1 do
  if (
Components[i] is TButton) then
     
(Components[i] as TButton).Caption:= Self.Caption;
end; 
نعم اخي الكريم,, اشكرك على توضيحك Smile

اخي الكريم هل ممكن الإستفآدة من الكود الذي ذكرته وتحويله مثلا الى Procedure فيكون مثلا على الشكل التآلي,,
PHP كود :
Procedure buttPress;
begin;
if (
Components[i] is TButton) then
     
(Components[i] as TButton).Caption:= Self.Caption; 
end; 

وهل يشترط ان يكون الكود التآلي موجود؟
PHP كود :
if (Components[i] is TButton) then 


بعدها استدعي البروسيدور عند الحآجة اليه ؟ لأني لن استخدم الكود في 70 بوتون متوآصل ,,

ما رأيك ؟
اخواني الكرآم سلآم الله عليكم من جديد Smile

الآن وانا افكّر,, وفي حآلة تفكير شديد ,, قررت ان اضع السؤآل بشكل وآضح جدا بعد ان حددت ما اوده بدقة عآلية,, :eek:

السؤآل متعلّق بنفس الموضوع لذلك سأضعه هنا في هذا الموضوع,,

نعم,,

اود عمل فونكشن يقوم بلتآلي,,

اولا يأخذ الفونكشن اسم الكومبوننت المرسل,, اي الكآبشن للكونترول المرسل ويضعه في متغير,,

بعد ذلك يضع الكآبشن او ال string الذي في المتغيّر في edit1.text

انتها عمل الفونكشن,,

هذا كل شي,, فكيف استطيع عمل هذا بارك الله لكم ؟

طبعا السطر الثآني سهل,, لكن الأول كيف يكون ؟

حزاكم الله خيرا
يمكنك بدل استخدام Self استخدام Sender
mnour كتب :يمكنك بدل استخدام Self استخدام Sender

اشكرك اخي على محآولتك,,

لكن هذا لا يمكن
PHP كود :
edit1.text := Sender.caption 

ام ان هناك حل آخر؟
السلام عليكم
أخي المبرمج...
أولا Self: فهذه ترجع إلى الكائن الذي كتبت فيه الـ Procedure أو Function مثلا:

PHP كود :
procedure TForm1.FormCreate(Sender: TObject); 
في هذه الإجراء كلمة Self ترجع Form1 لأن الإجراء هو لنمط TForm1

أما:
كود :
Procedure buttPress;
أما هذا فلا يوجد فيه شيء اسمه Self، ذلك لأن هذا الإجراء لا يرجع إلى أي كلاس (هل لاحظت ذلك).
سأكمل...
نعم فهمت كلآمك اخي كاش وآحد,,

طيب ما هو الحلّ اخي الكريم اذا كنت اود ان آخذ الكآبشن لل sender واضعه مثلا متغير؟

الذي فهمت منك الآن ان علي ان انسى كلمة Self لهذا الغرض :confused:

شكرا لك
مشكلتك أخي المبرمج تحل باستعمال الـ Parameter:
PHP كود :
Sender: TObject 
هذا الـ Parameter موجود في جل الإجراءات التي تأتي من الأحداث (Events) من الـ Inspector Object
لكن المشكلة أن Sender نوعه TObject ولذلك ليس له Caption ولا Enabled ولا أكثر خواص TButton ولذلك نستعمل Transtype (باللغة العربية التغليف أو التمرير أو غير ذلك... نسيتها بالفصحى Big Grin)، والطريقة مشهورة كما يلي:
كود :
(Sender as TButton)
أي نستعمل المتغير Sender باعتباره TButton وليس ككائن TObject.
يمكن كتابة ذلك بطريقة أخرى:
كود :
TButton(Sender)
والطريقة للوصول الى Caption:
PHP كود :
TButton(Sender).Caption := '&OK'; 
أو
PHP كود :
(Sender as TButton).Caption := '&OK'; 
ولا تنسى أن Sender معرف في الإجراء لاحظ:
PHP كود :
procedure TForm1.Button1Click(Sender: TObject); 
ملاحظة:
لاستعمال نفس الإجراء مع عدة مكونات، قم بتحديدها جميعا، ثم نقر مزدوج على الحدث واكتب الأوامر باستعمال (Sender as TButton) عوضا عن اسم المكون.

في حالتك لا داعي للـ Fucntion، حدد جميع الأزرار وانقر مرتين على الحدث OnClick واكتب ما يلي:
PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1
.Text := (Sender as TButton).Caption;
end; 

ملاحظة: في الجدوال (Table) والاستعلامات (Query) نستخدم TDataSet، فمثلا لفتحها جميعا في OnCreate نكتب:
PHP كود :
procedure TForm1.FormCreate(Sender: TObject);
var
  
i: Integer;
begin
for i := 0 to Application.ComponentCount-1 do
    if (
Components[i] is TDataSet) then
      
(Components[i] as TDataSet).Open;
end; 
حيث ComponentCount تعني عدد المكونات في التطبيق.
و [Components[i تعني المكون رقم i في التطبيق.
بالتوفيق.
الصفحات : 1 2