• 0
ثنائي التميز

كيفية التعامل مع نماذج MDI

سؤال

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

 

اخواني في المنتدى الرائع لدي مشكلة في التعامل مع نموذج المتعددة (mdi)

 لدي برنامج استخدمت فيه نموذج mdi ففي الشاشة الرئيسية والتي اسمها form1 لدي نموذجين احدهما اسمها form_big والذي اريد ان يفتح الفورم بشكل كبير دائما (maximize) .

والنموذج الاخر اسمه from_small والذي اريد ان ييفتح بشكل مصغر النموذج العادي (normal) .

 

المشكلة الاولى /عند فتح الفورم form_big لايفتح بشكل كبير maximize .

المشكلة اللثانية / عند فتح الفورم form_small اريده ان يكون ثابت بحجم صغير ,وعند فتح اي فورم اخر ثم الرجوع للنموذج المسمى form_small يفتح بشكل كبير.

 

االمرفق في الرابط 

https://dl.dropboxusercontent.com/u/83357374/mdiform.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

15 إجابة على هذا السؤال .

  • 0

في مشاريع ال Multi Document Interface نحتاج للقيام بخطوتين :

الأولى: تعيين نموذج ك MDI Parent

الثانية: تعيين نموذج ليكون MDI Child

لتعيين MDI Parent نقوم باختيار الفورم المراد جعلها ك Mdi Container ونضبط الخاصية IsMdiContainer إلى True

لتعيين MDI Child نقوم بتمرير مثيل لل MdiParent إلى الباني الخاص بالفورم المراد جعلها ك MDI Child مثال

لدي فورم بإسم Form2 نقوم بتمرير مثيل من الفورم التي اخترناها ك Mdi Parent  للباني الخاص بها

اولا نعدل على الباني

Public Form2(MyMDiParent mdiprnt)

ومن ثم نقوم بتمرير المثيل إلى الفورم Form2

Form2 F2 = new Form2(this)

طبعا التمرير يتم من داخل ملف السورس الخاص بال MDi Parent Form

ومن ثم داخل ال Form2 نقوم بضبط الخاصية MdiParent برمجياً لتشير لمثيل ال MDi Parent Form الذي قمنا بتمريره لها

this.MdiParent = mdiprnt;

لجعل اي فورم كبيرة عندما تحمل نقوم بضبط الخاصية WindowState إلى القيمة Maximized

اما بخصوص الجزئية

 

وعند فتح اي فورم اخر ثم الرجوع للنموذج المسمى form_small يفتح بشكل كبير.

 

ارجوا ان تعذرني فلم افهم ماتعنيه بذلك .

 

بالتوفيق

تم تعديل بواسطه Install
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

انا استخدم السي شارب لكن لا مشكلة 

نموذجي form1  هو MDI  لدي نموذجين احدهما اسمها form_big والذي اريد ان يفتح الفورم بشكل كبير دائما (maximize) .

جعلت خاصية التكبير دائما maxmize 

وكتبت الكود التالي:

FORM_BIG frm = new FORM_BIG();

            frm.MdiParent = this;
            frm.Show();
 

والنموذج الاخر اسمه from_small والذي اريد ان ييفتح بشكل مصغر النموذج العادي (normal) .

وكتبة الكود التالي:


FORM_SMALL frm = new FORM_SMALL();

            frm.MdiParent = this;
            frm.Show();
 
المشكلة هذ انني لا اريد للنموذج الصغير ان يتكبر اريده ان يبقى دائما بحجمة الطبيعي(normal) وليس كبير مثل بقية النماذج
 
اتمنا تكون الفكرة وصلت لانه الان اذا فتحت النموذج الكبير ثم الصغير يكون النموذج الصغير دائما كبير 
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

 

انا استخدم السي شارب لكن لا مشكلة

 

ومن قال انك تستخدم غير ال C# !..

 

 

 

وكتبت الكود التالي:

FORM_BIG frm = new FORM_BIG();

            frm.MdiParent = this;
            frm.Show();

 

في أي فورم كتبت هذا الكود ؟

 

 

 

المشكلة هذ انني لا اريد للنموذج الصغير ان يتكبر اريده ان يبقى دائما بحجمة الطبيعي(normal) وليس كبير مثل بقية النماذج

 

ضع الخاصية WindowState للنموذج الصغير إلى Normal

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك اخي على محاولة المساعدة ..

لكني عملت ذلك وفي المرفق نفس الفكرة

 

االمرفق في الرابط 

https://dl.dropboxus...374/mdiform.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

فعلا مشكلة غريبة

الحل صديقي هو ان تقوم بضبط الخاصية MaximumSize للفورم الصغيرة

اضف للباني الخاص بالفورم الصغيرة الكود التالي

this.MaximumSize = this.Size;

جربت الكود انا هكذا وانحلت المشكلة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الله لا يحرمك من الجنة والأجر شكرا لك على مساعدتي على رغم من انها أيام عيد 
 

جربيتها لكن نفس المشلكة والصورة توضح ذلك 

 

علما انني نجحت في حل لكن لست مقتنع به 

 FORM_SMALL frm = new FORM_SMALL();            frm.MdiParent = this.MdiParent;            frm.MdiParent = Application.OpenForms["FORM_SMALL"];            frm.Show();

post-262758-0-03221400-1412627758_thumb.

post-262758-0-44337400-1412627790_thumb.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

علما ان السطر الثاني والثالث كلاهما يأديان نفس العمل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

 

  • frm.MdiParent = this.MdiParent;
  • frm.MdiParent = Application.OpenForms["FORM_SMALL"];

ياأخي من قال لك ان تضع هذا السطر

 

  • frm.MdiParent = Application.OpenForms["FORM_SMALL"];

يااخي ارجوك ركز معي

هل تعرف ما معنى باني Constructor ?

فقط اضف هذا السطر لباني الفورم FORM_SMALL

this.MaximumSize = this.Size;

اليست المشكلة انك عندما تقوم بفتح الفورم الصغيرة FORM_SMALL بعد الفورم الكبيرة تصبح الفورم الصغيرة كبيرة وتملئ الشاشة من تلقاء نفسها

انظر للصورة

 

 

المشكلة هي بسبب استخدام الخاصية WindowState إلى القيمة Maximized

الحل هو جعل كل الفورم على القيمة Normal ولكن ليس هذا الذي تريده انت اليس كذلك صديقي

لذلك لديك الحلول الآتية اختر مايناسبك :

 

1- إما ان تقوم بجعل كل الفورم على القيمة WindowState = Normal ومن ثم تخصص حجم من عندك للفورم الكبير اثناء اظهارها

 

2- او ان تقوم بإضافة السطر الذي تحدثت عنه انا في الأعلى إلى باني الفورم الصغير حتى تحافظ على حجمها

 

3- أو ان تقوم بالتعديل التالي لعملية إظهار الفورم الصغير

            FORM_SMALL frm = new FORM_SMALL(this);           // frm.MdiParent = this;            frm.Show();            frm.WindowState = FormWindowState.Normal;            frm.Location = new Point(20, 10);

اي frm.WindowState = FormWindowState.Normal;

ولكن هنا لديك مشكلة أخرى وهي ان الفورم الكبير سوف تتأثر بهذا التغيير وسوف تصغر ايضاً لتعود لحجمها الأصلي المحدد اثناء ال Design Time

 

في المرفقات صورة تظهر الفورم الصغيرة حافظت على حجمها الصغير حتى بعد تشغيل الفورم الكبيرة وذلك بعد ما اضفت السطر الذي تحدثت عنه

اي

this.MaximumSize = this.Size;

لذا ركز معي اخي ارجوك ونفذ مااقول لك عليه بالضبط قلت لك من الأول ان تستخدم البواني لتمرير مثيل ال Mdi Parent ولكنك لم تفعل ذلك لو لاحظت في الكود الذي اضفته انا

مررت المثيل عن طريق الباني

 

 

 

الله لا يحرمك من الجنة والأجر شكرا لك على مساعدتي على رغم من انها أيام عيد

 

ولايهمك صديقي سأبقى اتابع موضوعك حتى تحل مشكلتك

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اسف يبدوا ان الصورة لم ترفع

 

هذا رابط خارجي

 

SvM1Qx.png

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك 

لكن حتى اكون معاك واضح 

 

لم افهم 

هل تعرف ما معنى باني Constructor ?

 
وايضا الكود التالي لم يعمل
 
FORM_SMALL frm = new FORM_SMALL(this);
 
 
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

طبعاَ لن يعمل صديقي .
يبدوا انك حقاً لا تعرف ما هو الباني

صديقي الباني هو ميثود اسمها نفس اسم الكلاس كمثال

لدينا الكلاس MyClass1

Public Class MyClass1{}

الآن سوف نضيف باني لهذا الكلاس

Public Class MyClass1{Public MyClass1(){}{

الباني هنا هو الميثود MyClass1

 

اتمنى بان تكون الفكرة وضحت

الآن اريد منك ان تقوم بالتعرف على الباني الخاص بالفورم

وتقوم بإضافة السطر

this.MaximumSize = this.Size;

للباني الخاص بالفورم الصغيرة انظر الآن كمثال سوف أريك كود الفورم الصغيرة الذي قمت بتعديله :

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace mdiform{    public partial class FORM_SMALL : Form    {        public FORM_SMALL(Form1 f1)        {            this.MdiParent = f1;            this.WindowState = FormWindowState.Normal;            InitializeComponent();        }        private void FORM_SMALL_Load(object sender, EventArgs e)        {                                }    }}

لاحظ النقاط التالية :

1- الباني هنا هو الميثود FORM_SMALL

2- عادة لايوجد في الفورم إلا باني واحد وهو الباني الإفتراضي Parameterless Constructor ولكن قمت بتعديله واضفت له بارامتر وهو مثيل لل Form1 وهي ال Mdi Parent

3- اضفت السطر الذي تحدثت عنه لهذا الباني

 

الآن قم بمسح كود الفورم الصغيرة واستبدله بهذا الكود

قم بتعديل باني الفورم الكبيرة ومرر لها مثيل لل MdiParent

شغل البرنامج ولاحظ كيف ان المشكلة حلت بنجاح .!

 

كنت حقاً اود ان ارفع لك المشروع كامل ولكن يبدوا ان لديك Visual C# 2010 وانا لدي Visual C# 2013 لذلك لم اقم برفع مشروع جاهز

لانه بحاجة للتحويل حتى يعمل لديك

على كل حال حاول ان تعتمد على نفسك

وراجع مبادئ البرمجة غرضية التوجه حتى لا تقع بمثل هذه الإشكالات مرة اخرى

بالتوفيق

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

namespace mdiform{    partial class FORM_SMALL    {        public FORM_SMALL()        {            this.MaximumSize = this.Size;        }        /// <summary>        /// Required designer variable.        /// </summary>        private System.ComponentModel.IContainer components = null;

وفي النموذج الصغير كتبت التالي:

namespace mdiform{    public partial class FORM_SMALL : Form    {        public FORM_SMALL(Form1 f1)        {            this.MdiParent = f1;            this.WindowState = FormWindowState.Normal;            InitializeComponent();        }    }

وفي كود الفورم الصغير كتبت التالي:

 private void فورمصغيرToolStripMenuItem_Click(object sender, EventArgs e)        {            FORM_SMALL frm = new FORM_SMALL(this);                        frm.Show();
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

صديقي ارفع الملف ذو الصيغة .cs للفورم الصغيرة والفورم الكبيرة والفورم الرئيسية

سأقوم انا بتعديلهم لك واعيد رفعهم

الأفكار لديك غير متسقة نهائياً

 

نستخدم الباني لكي نقوم بتهيئة الحقول الخاصة بالكلاس او استدعاء ميثود ما ضرورية لعملية أخذ المثيل instantiating

او ضبط خواص من الضروري ان تكون بقيم معينة في هذه اللحظة "لحظة اخذ المثيل" او ضرورية لعمل لكلاس

وغير ذلك .

يتم تنفيذ ال Implementation الخاصة بباني الكلاس فور عملية اخذ مثيل عنه اي استخدام الكلمة المفتاحية new لذلك

لكل كلاس في بيئة عمل دوت نت باني إفتراضي حتى لو لم تقوم بتولديه انت سيقوم بذلك مترجم اللغة نيابة عنك

يمكن عمل Overload للباني بحيث ياخذ عدة اشكال ولكل شكل توقيعه الخاص Method Signature

 

لااريد تشعيب الموضوع اكثر من ذلك

ارفع الملفات الي قلتلك عليها وساقوم بتعديلها انا حتى تحل مشكلتك الآن

وبعد ذلك في حال كان لديك اي سؤال يتعلق باللغة اطرحه في هذا القسم

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

تأكد تماماً اني لا اقوم سوى بواجبي صديقي لذلك لا داعي للشكر

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اوا اعتذر عن التأخر فلقد كنت في سفر ولذلك لم افتح الرابط

اما بنسبة للشكر لا فلا بد منه من لا يشكر الناس لا يشكر الله

 

اما بنسبة للملفات المطلوبة فهي في المرفق

المفات البرمجية.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مازلنا ننتظر

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .