الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ارجاع قيمة الى ال MDI Parent

مغلق
بدأه jooorj في 4 ديسمبر 2006 · 15 رد · 2,058 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أرجو من الاخوة مبرمجي الدوت نت إعطاء فكرة عن كيفية أو الية إرجاع قيمة الى الMDI Parent عن طريق FORM منبتق من ال MDI Parent شكرا

ولوتكرمو بمثال بيكون رائع وشاكر لهم.

التوضيح :

لدي فورم أب MDI Parent به قائمة بها أمر جديد مثلا... وبالفورم الاب أيضا label موضوع على pannel على يمين الفورم ال Parent.

لمن أقوم بالضغط على زر الجديد من القائمة راح يفتح نافذة بها فقط زر وحيد لمن اضغط على هذا الزر ..>> يتغير ال Label.text="hi" أرجو ان يكون متالي واضحا ..:):).

حيث اني استخدم نسخة من ال MDI على هيئة Static ويا حبذا لو في بديل !!

بانتظار الاراء.......

موقوف من المشاركة لقلة الأدب

============================

#2

أنت لم تذكر اذا كانت تلك الـ Form الجديده التي تفتحها هي MDI Child أم لا. ولكن من الواضح أنها كذلك.

على كل حال, للوصول الى أي شيء من شيء آخر, اجعل هذا الشيء public ! أو اعمل Method أو Property بحيث تكون public أيضا لكي يصلح الوصول إليها من خارج الـ object.

مثلا في Form1 التي هي الـ Parent اعمل Public Property تعمل Get و Set للـ Text الخاص بالـ Label :

public string LabelText
{
get{return this.label1.Text;}
set{this.label1.Text = value;}
}

وانت في الـ Form الـ Child, يمكنك الوصول الى الفورم الأب من خلال الـ MDIParent ثم الوصول إلى الـ Text الخاص بالـ Label من خلال خاصية LabelText التي كتبتها بالأعلى :

يعني في الـ CHild Form اكتب :

Form1 currentForm1 = (Form1)this.MdiParent;
currentForm1.LabelText = "Hi";

أو كان ممكن تعمل الـ Label أصلا public ولكن هذا يعتبر تعدي على تصميم الـ Object Oriented.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#3

اولا شكرا لك جزيلا اخ معتز شمس وجعلك الله دائما مبادرا بالردود الله يحفظك.

ثانيا / عملية جعل ال label --public لاتصلح لانه كيف ساصل لل mdi-parent اساسا..

يجب ان يكون معرفا اولا وثانيا لا اظن ان كثرة التعريفات احتراف...

موقوف من المشاركة لقلة الأدب

============================

#4

ممتازة طريقتك الله يحفظك :)

قولي أخي معتز ما رأيك بهذه الطريقة :) من اختراعي طبعا ..

1- نذهب للملف program.cs

نعرف به

Public static MDIForm1  md1

الان نذهب للأسفل في داخل Main

نعدل الكود المكتوب ليصبح كالتالي :

					
 static void Main()
		{


		 md1= new MDIParent1();
		  Application.Run(md1);
}

احد الان تمام

نذهب للزر بالفورم المطلوب مثلا Form2 وفي إجراء الClick نكتب التالي :

Program.md1.label1.Text = " Jooorj";

الرجاء إبداء الرأي في أيهما أفضل من ناحية الأداء والعمل :) شكرا من جديد !

تم تعديل هذه المشاركة بواسطة jooorj في 4 ديسمبر 2006 في 23:33

موقوف من المشاركة لقلة الأدب

============================

#5

العفو أخي :)

اقتباس
ثانيا / عملية جعل ال label --public لاتصلح لانه كيف ساصل لل mdi-parent اساسا..

ستصل إلى الـ Mdi Parent ومن ثم إلى الـ public Label بنفس الطريقه التي تصل بها إلى الـ Mdi Parent ومن ثم إلى الـ public Property والتي استخدمتها في الكود الموجود في ردي السابق ! فما الفرق ؟! فيمكن الوصول إلى الـ MDI Parent من خلال خاصية الـ MdiParent الموجوده في كل Form.

بالنسبه للكود الموجود في ردك الأخير.. فمن الواضح أنك قمت بعمل الـ Label كـ public, وأنا كما ذكرت, لا أنصح بتحويل Modifier الـ Label من Private أو Protected إلى Public.. وذلك لأن هذا أمر سيء جدا في التصميم وربما به خطوره (وليس لأنه حل لا يصلح ). وأيضا أنا لا أدري لأي سبب قمت بالاعلان عن Object الـ Form الرئيسيه على أنه static.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#6

أهلا بك أخي معتز من جديد :)

اقتباس
بالنسبه للكود الموجود في ردك الأخير.. فلا أدري لأي سبب قمت بالاعلان عن الـ Form الرئيسيه على أنها static.

الصراحة عمدت لعمل ذلك حتى أتجنب عمل New عند استدعاء ال MDI الرئيسي فقط. ففي هذه الحالة سوف يتم الوصول لدوال ال Class مباشرة بدون new وهذا موجود بالجافا أيضا.

ثانيا بصراحة لا يمكن الوصول لل Label بدون Modifire الا في حالة واحدة كما ذكرتها اخي معتز وهي ال properties ولكن ستكون مجهدة خصوصا لو كان هناك عدد من الكائنات كل واحد منه يحتاج properties خاصة به كما هو الحال لل label..

بانتظار الأراء والردود..

موقوف من المشاركة لقلة الأدب

============================

#7
اقتباس
الصراحة عمدت لعمل ذلك حتى أتجنب عمل New عند استدعاء ال MDI الرئيسي فقط

في الكود الذي كتبته حصلت على الـ Object الرئيسي الموجود في الذاكره بدون أن أستخدم كلمة new :

Form1 currentForm1 = (Form1)this.MdiParent;
currentForm1.LabelText = "Hi";

فقد حصلت عليه من خلال خاصية الـ MdiParent ولم أقم بانشاء واحد جديد لأنه أصلا موجود.

وبالنسبه لموضوع الوقت أو الملل الذي قد يصيبك نتيجة لكتابة الكثير من الـ Properties, فيمكنك تجنب هذا وتكتب Property واحده أو اثنتان تستقبل وترجع Array لتقرأ مجموعه من القيم وتسند مجموعه من القيم لمجموعه من العناصر, دفعة واحده.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#8

أهلا بك أخي معتز ... حقيقي النقاش معك متعة الله يحفظك :)

صحيح اخي معتز انك لم تستخدم كلمة new وواضح هذا من اول مرة.

اما بالنسبة للفرق بين الكودين فقط كما ذكرت الجهد في كتابة ال properties

لكن الطريقة لكتابتها مرة واحدة فهذا يعني كتابة كود كبير وبه IF وربما For او حتى Switch هي حلول بالنهاية ولكن مالعيب باستخدام static MDI أليست أسهل.

وسؤالي الاخر لماذا ال Modefier بها أخطار.. كيف سنصل للمتغير من خارج ال CLass لا يوجد طرقغير كونها Public أو Static ولكل منهما فوائده وبرايك مالفائدة إذا من Modifier ...

بانتظار الردود والاقتراحات...

موقوف من المشاركة لقلة الأدب

============================

#9

السلام عليكم عندي سؤال

طيب لو كان عندي مثلاُ في الMDI Parent زر اسمة Save وعندي اكثر من MDI Child مفتوح

اريد عند الضغط على هذا الز يقوم فقط بحفظ بيانات ال MDI Child النشط فقط

كيف تتم هذه العملية .

#10

وعليكم السلام ورحمة الله وبركاته.

بالنسبه لاستفسارك أخ "المختبر":

اكتب Public Method في الـ Child Form اسمها مثلا SaveWork تكون مسئوله عن حفظ البيانات. وفي زر Save الموجود في الـ Form الأب الرئيسي اوصل للـ Child Form الـ Active الحاليه من خلال خاصية ActiveMdiChild, ثم قم باستدعاء SaveWork هذه.

مثلا, باعتبار أن الـ Child Forms بتكون من نوع Form2, اكتب في زر Save الموجود في الفورم الأب :

Form2 theActiveChildForm = (Form2)this.ActiveMdiChild;
theActiveChildForm.SaveWork();

و SaveWork هذه يمكن كتابتها هكذا في الـ Child Form :

public void SaveWork()
{
// اكتب هنا الكود الخاص بحفظ البيانات.
}

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#11

السلام عليكم

هذه المشكلة واجهتني منذ سنة تقريبا, و لم اجد لها حل يومها الا بطريقة ال Static

المشكلة هي انّ مجموعة الفورم لا ترى بعضها بما انها عبارة عن Classes , بالفعل كانت مشكلة يومئذ,

قمت بتعريف Object من الفورم التي اريد ان اصل اليها من جميع ال Forms الاخرين على انها Static

حيث باستخدامها يمكن ان تتعامل مع ال Class مباشرة دون تعريف Object.

كنت انظر الى هذه المشاركة فرأيت حل الاخ معتز شمس طريقة جميلة فعلا و بارك الله بك

لم افكر بانه يمكن عمل Cast لل MDIParent الى ال class الاساسي لكي استطيع ان ارى ال Method الخاصة به

شكرا لك مرة اخرى :)

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#12

الف شكر لك اخ معتز شمس

وبارك الله فيك وجزاك خير

#13

شِكرا للجميع

موقوف من المشاركة لقلة الأدب

============================

#14

سؤال آخر لو سمحتو بالنسبة لل MdiParent لما يكون فيه زر مثلاً يعرض أحد ال MdiChild كيف امنع هذا الزر من انشاء نسخة أخرى من MdiChild طالما هو معروض على الشاشة

#15

شاهد أخ "المختبر" هذا الموضوع :

/index.php?showtopic=104928

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#16

الطريقة كالتالي

اكتب الامر

:

if(MyChild1==null  || MyChild1.Isdisposed)
{
MyChild1 = new MyChild();
}
MyChild1.Show();

الشرح والتحليل

بالسطر الاول نفحص هل الفورم غير موجود null أو هل الفورم منهي IsDispose

عندها نعمل new

وبعدها نعرضه Show

موقوف من المشاركة لقلة الأدب

============================

هذا الموضوع مغلق.

مواضيع مشابهة