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

فئة بسيطة للتحكم في النوافذ المنبثقة Popup

مغلق
بدأه رغيد الطيب في 8 مارس 2005 · 9 رد · 2,280 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

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

منذ ايام و اثناء إستخدامي لبرنامج الورد لكتابة بعض المستندات الشخصية لفت انتباهي إعتماد البرنامج على القوائم المنبثقة بشكل كبير فمعظم الأشياء التي تراها امامك عبارة عن قوائم منبثقة يمكنك التعامل معها او إهمالها بسهولة ( و دون إزعاجك! )، بينما يلجأ الكثير من المبرمجين إلى إستخدام مربعات الحوار ( MsgBox ) و النماذج الفرعية Forms لتأدية الامور التكميلية و بالتالي يجد المستخدم نفسه متنقلا بين فورم و اخرى اثناء إستخدامه لبرامجنا !.

و لنضرب مثلاً اننا نريد تمكين المستخدم من إختيار لون معين لغرض ما في برنامجنا .. فالكثير منا سيلجأ الى إستخدام الـ [Microsoft Common Dialog Control 6.0] و الذي طالما استخدمناه في العمليات مثل ( فتح ملف ، حفظ ملف الى القرص الصلب ) و كذلك الحال بالنسبة للطباعة و اللالوان و الخطوط فهو عبارة عن مجموعة من مربعات الحوار الشائعة التي يمكن إستخدامها بسهولة ويسر في برامجنا ... عن طريق احد الأوامر :

ShowOpen
ShowSave
ShowPrinter
ShowFont
ShowColor

و نحن في مثالنا سنستخدم الامر الاخير لتمكين مستخدمنا من إختيار اللون الذي يريده حيث سيظهر له مربع حوار كالتالي :

RgheedCommonColors.JPG

.. و هي طريقة سهلة جدا توفر علينا العناء، غير ان معظم البرامج الرسومية الشائعة لا تعتمد عليها فهذه البرامج توفر لمستخدمها طريقة تمكنه من اختيار اللون الذي يناسبه دون الإضطرار للإنتقال الى فورم فرعي و كذلك الحال بالنسبة للبرنامج الورد الذي يوفر لك طريقة مثل :

RgheedMSWordColors.JPG

للإختيار الالون.

و لا يقتصر الأمر على مسئلة الالوان بل على الكثير و الكثير من الامور الفرعية التي نحتاجها تخيل معي ان لديك قائمة كبيرة (ListBox او ComboBox ) و فيها اسماء الكثير من الكتب و اردت ان توفر لمستخدمك طريقة للبحث السريع عن إسم كتاب معين فأن الفكرة التي ستطرأ علينا مباشرة هي تصميم فورم مستقلة ينتقل اليها المستخدم لتأدية عمليات البحث هناك ثم العودة مرة اخرى الى الفورم الاصلية لإستكمال عمله ... بينما انه اذا فكرنا في طريقة سهلة تمكنه من إجراء عملية البحث مباشرة من الفورم الاصلية كأن تظهر له قائمة منبثقة تحتوي على عناصر البحث بحيث يمكنه ان يقوم بعملية البحث مباشرة ويرى النتائج في الفورم الاصلية او يمكنه ببساطة إلغاء الفكرة و العودة الى الفورم الاصلية بسهولة .

و بإختصار فإن فكرة الفئة Class التي سأضعها هنا هي القيام بذلك ... و ما اقصده هو تسهيل عملية الربط بين الفورم الاصلية و الفورم المنبثقة حيث يمكنك ان تصمم الفورم الفرعية التي تروق لك ثم تقوم بإستدعاءها و التعامل معها عن طريق الـفئة التي سنناقشها هنا بإذن الله تعالى و المسماه RgheedPopup ومن إسمها Popup يمكن استنتاج كونها توفر طريقة لعرض الفورم بطريقة منبثقة.

تخيل معي الان انك تريد تصميم فورم مستقل للاوان و تريد تمكين المستخدم من التعمل معه بشكل سلس كما في برنامج الورد ... و قمت بتصميم فورم إسمها frmColors كالتالي :

RgheedColorsForm.JPG

او مثلا انك تريد توفير قائمة تمكن المستخدم من إختيار ايام الإجازة الرسمية تبعه .. فصممت فورم frmList بشيء مشابه لـ :

RgheedWeekendList.JPG

او كمثال أخير اردت تصميم قائمة فرعية لإنتقاء بعض الخيارات المتاحة للمستخدم ( frmMenu ) بشكل كالتالي :

RgheedSubMenu.JPG

و جميعها عبارة عن فورمات ( Forms ) مستقلة ... و لكي نجمعها الان في فورم واحدة بحيث يمكن للمستخدم التنقل بين احدها و الفورم الرئيسية بسهولة لا تشكل للمستخدم اي ازعاج فيمكن هنا استخدام الفئة تبعنا RgheedPopup و التي ستزودك بشيء مثل :

RgheedPopup.JPG

--------------------------------------------------

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

هذا بالإضافة الى بعض المهام الفرعية التي ستزودك بها كالمؤثرات الجمالية عن طريق إظهار ظل حول الفورم المنبثقة.

و كشرح سريع للفئة وكيفية تضمينها قم اولا بتصميم الفورم الرئيسية frmMain وجميع الفورات التي تريد ظهورها بشكل منبثق عن طريق هذة الفئة و لنفرض ان الفورمات هم بالضبط ما سبق ان وضعنا صورهم frmList و frmColors و frmMenu .

و الان لكي تضمن الفئة تبعنا في برنامج قم بإضافة الملف المسمى RgheedPopup.vb و الذي يحتوي على شفرة الفئة كاملة .

ثم في الفورم الرئيسية اكتب السطر التالي في اعلى شفرتها :

Dim WithEvents Popup As New RgheedPopup(Me)

و بهذا يكون لديك كائن اسمه Popup مرتبط بالفورم الرئيسية و يمكنك إستخدامه بسهولة ... كما ان تعريفك له بإستخدام الكلمة WithEevents يسمح لك بالتعامل مع الاحداث التي يزودك بها و في الواقع ان فئتنا هذه لا تزودك سوى بحدث واحد هو Closed و يتم إستدعاءه عند إغلاق الفورم المنبثقة بحيث يمكنك معرفة القيمة التي تعيدها الفورم المنبثقة الى الفروم الاصلية إن وجدت ... لاحظ تعريف الحدث :

Sub Popup_Closed( Value As Object, popupForm As System.Windows.Forms.Form)

و المتغير Value يمثل القيمة التي تعيدها لك الفورم المنبثقة و يمكنك ايضاً الوصول اليه اما عن طريق :

MsgBox( Value )

او :

MsgBox( RgheedPopup.Value )

و المتغير الثاني في الحدث Closed هو popupForm و يمثل الفورم المنبثقة التي تم إغلاقها.

اما لكي تقوم بإظهار الفورم الفرعية فيمكنك ان تقوم بإستدعاء الطريقة Show التابعة للفئة Popup التي عرفنها سابقاً و هذه الطريقة تتطلب الفورم المنبثقة التي تريد إظهارها بالاضافة الى الموقع الذي تريد اظهارها فيه ... و الموقع يمكن ان يكون إختيارياً حيث انك اذا لم تحدد موقع العرض سوف تقوم الفئة داخليا بإستنتاج الموقع المناسب عن طريق حساب موقع الزر او الكنترول الذي قام باستدعاء الطريقة Show.

و هنا سيتم إنشاء الظل المناسب للفورم التي يتم عرضها كما و سيتم إستدعاء الحدث Closed بمجرد إغلاق الفورم المنبثه ويمكنك هناك معالجة القيمة الراجعة و التعامل معها بالشكل الذي تريده في برنامجك .

دعنا الان نضرب مثالا كاملا عن كيفية عرض فورم منبثقة و التعامل مع القيمة الراجعة منها ... و لنفرض مثلا اننا نريد اظهار الفورم الخاصة بالالوان تبعنا frmColors بحيث نقوم بجعل لون الفورم الاصلية هو اللون الذي اختاره المستخدم من فورم الالوان المنبثقة ... وهنا ستكون شفرتنا بإذن الله تعالى كالتالي :

	Dim WithEvents Popup As New RgheedPopup(Me)

	Private Sub Popup_Closed(ByVal Value As Object, ByVal popupForm As System.Windows.Forms.Form) Handles Popup.Closed
   Me.BackColor = Value
	End Sub

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Popup.Show(New frmColors)
	End Sub

لاحظ انه عند النقر على الزر Button1 نقوم بإستدعاء الطريقة Show لنسخة جديدة من الـ frmColors مع عدم تعيين الموضع الذي نريد ان تعرض فيه و بالتالي فإن الفئة Popup هي التي ستقوم بحساب الموقع المناسب للفورم المنبثقة.

كما انه و عند إغلاق الفورم المنبثقة يتم إستدعاء الحدث Closed التابع لـ Popup و فيه جعلنا لون خلفية الفورم BackColor يساوي القيمة الراجعة لنا من الفروم frmColors.

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

	Private Sub Button1_Click(...) Handles Button1.Click
  Popup.Show(New frmColors)
	End Sub

	Private Sub Button2_Click(...) Handles Button2.Click
  Popup.Show(New frmMenu)
	End Sub

و اما الان فلدينا فورمين frmColors و frmMenu ... و هنا فان الحدث Closed سيكون مشترك بينهما و بالتالي فانه ينبغي معرفة اي الفورمين هي التي تم إغلاقها حتى نتعامل مع القيمة الراجعة كما ينبغي .. فمثلاً لو كنا نريد ان نقوم بجعل لون الفورم يساوي القيمة الراجعة value في حالة ان الفورم المنبثقة التي تم إغلاقها هي frmColors، بينما نريد ان نقوم بعرض القيمة Value في حالة ان الفروم التي تم إغلاقها هي الفورم frmMenu ... فهنا ينبغي علينا تحديد الفورم التي تم إغلاقها وهذا يكون عن طريق البارميتر popupForm في الحدث Closed بالشكل التالي :

	Private Sub Popup_Closed(ByVal Value As Object, ByVal popupForm As Form) 
  Select Case popupForm.Name
 	 Case "frmColors" 
          Me.BackColor = Value
 	 Case "frmMenu" 
          Me.Text = Value.ToString
  End Select
	End Sub

لاحظ انني هنا استخدمت الـ Select Case لتحديد اسم الفورم المغلقة ثم إعتمادا عليها قمت بالتعامل مع القيمة المرجعة Value كما ينبغي.

من هنا يظهر ان التعامل مع الفورمات المنبثقة في برنامجنا سيكون سهلا جدا بإذن الله تعالى و ذلك ان العمل الاكبر من موافقة بين الفورمين ( الرئيسية و المنبثقة ) و إعدادت الظل و ما شابه يتم كله داخلياً في فئتنا البسيطة RgheedPopup.

و يبقى اخيراً التنوية الى انه يجب على الفرومات المنبثقة تحديد القيمة التي سيتم إرجاعها إلى الفروم الاصلية بمجرد إغلاقها و ذلك عن طريق RgheedPopup.Value ... فمثلا الفورم frmColors تقوم بجعل الـ RgheedPopup.Value تساوي اللون الذي نقر عليه المستخدم ... و بالتالي فإنه عند إغلاقها سيكون المتغير RgheedPopup.Value يحمل قيمة اللون الى الفورم الرئيسية في الحدث Closed، وكذلك الحال مع الفورم frmMenu و التي تجعل القيمة RgheedMenu تساوي العنصر الذي تم اختياره من القائمة.

اخيراُ فإن الفئة بسيطة جداً و اتمنى للجميع الإستفادة منها ...و إن وجدت وقتاً بإذن الله تعالى سأكتب فئة مكافئة لها لأحبائنا في قسم الـ Visual Basic 6.0.

مرفق مع العرض البسيط شفرة الفئة RgheedPopup للإستفادة.

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

RgheedPopupWindows.zip

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#2

السلام عليكم : أستاذنا رغيد الطيب جزاك الله كل خير على هذا الشرح الرائع

#3

و الله الواحد ما عارف ماذا يقول لك؟؟؟، لهذا السبب كان vb4arab مشهوراً جداً...لأحتوائه على أعضاء غاية في الاجتهاد مثلك..

جزاك الله ألف خير أخي رغيد و جعله الله في ميزان حسناتك...

رأس الحكمة الإيمان بالله

#4

بسم الله الرحمن الرحيم

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

و عليكم السلام و رحمة الله اخي العزيز ahmed_es99 و جزاك الله عني كل الخير بإذن سبحانه وتعالى.

عزيزي محمد البرنامج لا يعدو كونه تحسينا بسيطا لمظهر برامجنا ... و اما افتقادي للـ vb4arab لم يعوضه سوى وجدي بين اخوة مثلكم عزيزي.

و ليجزيك الله خيرا على رفعك لهمم إخوانك.

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

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#5

جزاك الله خير أخ رغيد و بمناسبة ذكر VB4Arab هل سيعود أم لا

تحياتي

اللهم اغفر لي و لوالدي و للمؤمنين يوم يقوم الحساب

لا إله إلا الله عدد ما كان و عدد ما يكون و عدد الحركات و السكون

#6

مشكور اخي رغيد على الدروس الجميله .... (h)

#7

ألف شكر لك اخي رغيد الطيب

جزاك الله عنا كل خير

تقبل فائق احترامي

#8

جزاك الله خيرا

رائع

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#9

حقيقى حاجة ممتازة جزاك الله الف خير أخى رغيد

الفريق المصري للبرمجة

تحليل وتصميم برامج قواعد بيانات لاتصال بينا masry4u@hotmail.com

#10

السلام عليكم

كيفك أستاذي رغيد ..الحقيقة الواحد يفرح لما يشوفلك درس ..و كل درس أروع من التاني ..شكرا لك.

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

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