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

النافذة الأم والنوافذ الأبناء MdiChild

بدأه Router في 19 ديسمبر 2012 · 4 رد · 1,429 مشاهدة · في C++.Net
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لدي مشروع يتضمن نافذة أم (MDI) ونوافذ أبناء (MdiCild) لكن المشكلة كلما ضغطت على زر إظهار النافذة الأبن تظهر لي نافذة جديدة بالرغم من وجود نافذة أمامي ، كيف لي أن أجعله يظهر نافذة واحدة فقط ويقف عندما يجد هذه النافذة على الشاشة ثانياً عند إستدعاء لأي كود من النافذة الأبن لا يستطيع قراءته لأنه معرف داخل كود زر الإستدعاء في النافذة الرئيسية الأم ، ترى ما الحل

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
Form1^ a = gcnew Form1;
a->Show();
}
#2
Router كتب:

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

لدي مشروع يتضمن نافذة أم (MDI) ونوافذ أبناء (MdiCild) لكن المشكلة كلما ضغطت على زر إظهار النافذة الأبن تظهر لي نافذة جديدة بالرغم من وجود نافذة أمامي ، كيف لي أن أجعله يظهر نافذة واحدة فقط ويقف عندما يجد هذه النافذة على الشاشة ثانياً عند إستدعاء لأي كود من النافذة الأبن لا يستطيع قراءته لأنه معرف داخل كود زر الإستدعاء في النافذة الرئيسية الأم ، ترى ما الحل

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
Form1^ a = gcnew Form1;
a->Show();
}

هل عيّنت أبًا لكل ابن - قبل اظهاره- بهذه الطريقة:

 newMDIChild->MdiParent =this;

وقبل هذا لا تنسى أن تُفعّل خاصية IsMdiContainer في مُشيّد الأب بهذه الطريقة:

void InitializeComponent(void) {
this->IsMdiContainer = true;
}

بعد التأكد من السابق تابع التالي:

كمثال عملي، افرض أن لدينا Form1 وهو الأب

ولدينا نافذة أخرى اسمها Child

أولًا:

نقوم بتفعيل الخاصية التالية في النافذة الأب كما ذكرت سلفا:

this->IsMdiContainer = true;

ثانياً:

نقوم بتعريف متغير من نوع static bool في الصنف class الخاص بالنافذة Child بهذه الطريقة (سميته flag):

public ref class Child : public System::Windows::Forms::Form
{
public:
static bool flag=false;
};

أما عن فائدة هذا المتغير flag، فسنستخدمه لمعرفة ما إذا كانت نافذة Child ظاهرة مسبقاً أم لا، ونستطيع الوصول إليه من الصنف الأب Form1 لأنه من النوع static حيث يمكن الوصول إليه عن طريق :: scope كما في هو واضح في كود الزر التالي:

نضيف زر في نافذة الأب ونكتب فيه الكود التالي (لا تنسى إضافة #include "Child.h" في ترويسة Form1):

	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
	             Child^ ch= gcnew Child();
	             ch->MdiParent =this;
	             if (Child::flag==false){
		             ch->Show();
		             Child::flag=true;
	             }
             }

لاحظ أننا بمجرد إظهار نافذة Child قمنا بتغيير قيمة المتغير flag من false إلى true، بحيث لو ضغطنا الزر مرة أخرى فلن يظهر لنا نافذة Child مرة أخرى لأن قيمة flag==true .

لكن الآن اذا أغلقنا نافذة Child فستظل قيمة flag==true ولن نستطيع فتح Child من جديد.

لحل هذه المشكلة نقوم بتغيير قيمة flag إلى false في حدث إغلاق النافذة Child بهذه الطريقة:

private: System::Void Child_FormClosed(System::Object^  sender, System::Windows::Forms::FormClosedEventArgs^  e) {
			     Child::flag=false;
		     }

هذا الناتج:

post-87237-030276100 1355939177_thumb.pn

المثال مرفق.

MdiExample.rar

المرفقات
Capture.PNG

تم تعديل هذه المشاركة بواسطة A.S Hack في 19 ديسمبر 2012 في 20:47

1

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#3

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

جزاك الله ألف خير ... شكراً جزيلاً يا أخي على ردك وتفاعلك معي

الكود ناجح 100 % ولكن لي سؤال أخر بعد أذنك

أقوم بإستدعاء كود مكتوب في النافذة الأبن من خلال زر في النافذة الأم لكن لا تنجح هذه العملية بسبب أن تعريف النافذة الأبن موجود داخل حدث الزر الذي يقوم بفتح النافذة الأبن فهل أقوم بتعريف النافذة الأبن كمتغير عام في النافذة الأم ولكن هذه الطريقة ستؤدي إلى تعريف جميع النوافذ كمتغيرات عامة في النافذة الأم فهل هذه طريقة صحيحة أم هناك ما هو أفضل

1
#4

أهلا بك أخي، لم أفهم سؤالك الأخير جيدًا، حبذا لو وضعت الأكواد التي كتبتها مع تحديد أين كتبتها.. بالعموم جعل كل المتغيرات عامّة غير صحي بالمرّة.

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#5

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

المشروع الذي أعمل به هو برنامج قواعد بيانات توجد به نافذة أم FrmMdi ونوافذ أبناء مثل FrmSupplier وتفتح النافذة الأبن عن طريق زر على النافذة الأم هكذا

private: System::Void BtnOpen_Click(System::Object^  sender, System::EventArgs^  e) 
{
FrmSuppliers^ fSupplier = gcnew FrmSuppliers;
if(flag == false)
{
fSupplier->MdiParent = this;
fSupplier->Show(); 
}
else
 {
 return;
}
}

ثم أقوم بالتعامل مع النافذة الأبنة FrmSupplier من خلال شريط أدوات وأزرار على النافذة الأم FrmMdi وذلك على سبيل المثال إستدعاء كود الحفظ كالتالي

private: System::Void BtnSave_Click(System::Object^  sender, System::EventArgs^  e) 
{
 fSupplier->SaveRec();
}

ولكن الكود الأخير لا يعمل وأعتقد بسبب أن تعريف متغير fSupplier جاء داخل نطاق الزر BtnOpen_Click وبالتالي ينتهي نطاقه عمل المتغير بإنتهاء حدث الضغط على الزر BtnOpen

لذلك فكرت في وضع المتغير fSupplier كمتغير عام في الفورم FrmMdi وبذلك سيكون كل النوافذ متغيرات عامة ولكن كما نصحتني يا أخي بأن هذا غير صحي فما رأيك

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…