المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس الثالث لفيجوال سي ++



PaPEr Cut
21-07-2002, 01:54 PM
نعود الآن لنكمل درسنا السابق ونبدأ البرمجة الفعلية في Visual C++ وسنبدأ في إلحاق المتغيرات إلى التحكمات

إذا كنت قد قمت ببرمجة VISUAL BASIC من قبل ستكتشف أنك قادر على القيام ببعض البرمجة ولكن في V.C++ الأمر مختلف قبل إدخال شفرة البرمجة عليك أولا تعيين متغيرات لكل أدوات التحكم التي تريد العمل بها أو معالجتها والآن لنبدأ :

1. أطلب معالج الفئة كما فعلت ي الدرس الأول ثم Member Variable ثم انتق أحد التحكمات التي تريد إلحاق متغير به وليكن IDC_MSG.

2. في تخاطب إضافة عضو Add Variable أدخل المعطيات كالتالي:

النوع اسم المتغير الفئة تحكم

Cstring m_strMessage قيمة IDC_MSG

Cstring m_strProgToRun قيمة IDC_PROGTORUN

BOOL m_bEnableMsg قيمة IDC_CKENBLMSG

BOOL m_bEnablePgm قيمة IDC_CKENABLPGM

BOOL m_bShowMsg قيمة IDC_CKSHWMSG

BOOL m_bShowPgm قيمة IDC_CKSHWPGM

3. أنقر OK لإغلاق معالج الفئة

ملاحظة : كل هذه المتغيرات تسبق بm_ وذلك لأنها متغير عضو وهذا مصطلح MFC يأتي بعده نوع من التدوين المختصر حيث يدل على نوع المتغير وهذه طريقة يمكن إتباعها أو أي طريقة أخرى لتسمية المتغيرات لتصبح البرمجة أسهل.

يرجى قراءة الدروس المتعلقة بC++ في هذا الموقع وخاصة دروس المتغيرات لأنها تعتبر مقدمة جيدة للدخول في برمجة V.C++.

إلحاق وظائفية بالتحكم

قبل البدء بكتابة الكودالشفرة لكل تحكمات تطبيق النوافذ يجب كتابة القليل من الكود لتهيئة المتغيرات وإعداد القيم لمعظمها:

1.باستخدام معالج الفئة على جدول مخطط الرسائل Message Maps إنتق Cday2Dlg من قائمة ID ثم اختيار WM_INITDIALOG في لائحة الرسائل ثم اختر OnInitDialog من قائمة Member Functions ثم اضغط على تحرير الكود ثم ابحث عن TODO:…. وابدأ بكتابة السطور التالية أسفله:



1.m_strMessage="Place a message here";

2.m_bShowMsg=TRUE;

3.m_bShowPgm= TRUE;

4.m_bEnableMsg= TRUE;

5.m_bEnablePgm= TRUE;

6.UpdateData (FALSE);




طبعا هناك الكثير من الكود لكنني لم أقم بكتابته حتى أحافظ على حجم الدرس ولكن من أراد التعلم أكثر عن كود V.C++ و MFC يمكنه استعراض الكود على الحاسب والآن لشرح الكود:

كود التمهيد سهل جدا فأنت تعد رسالة مسبقة تكتب في علبة التحرير في السطر الأول ثم تجعل علب التثبيت كلها مختارة بجعلها TRUE في الأسطر من 2 -5.

أما في السطر السادس فأنت تريد تمرير الوظيفة من الكود إلى الأدوات وذلك بذلك باستخدام الوظيفة UpdatData وجعلها FALSE وإذا أردت العكس أي تريد معالجة البيانات المدخلة من المستخدم أي من التطبيق إلى المعالجة فأنت تجعل قيمة الوظيفة UpdateData = TRUE قبل لبدأ بمعالجة البيانات وستتعود هذا الأمر بعد كتابة المزيد من الشفرة .

إغلاق التطبيق

لإغلاق التطبيق أكتب الأمر التالي بعد إضافة وظيفة للزر exit أي العنصر IDC_EXIT وتحرير كودها OnOK();

الوظيفة OnOK(); و OnCanclel مبنية في فئة Cdialog والني ورثتها Cday2Dlg في فئة Cdialog يحتوي مخطط الرسائل على تعريفي العنصرين OK و Cancle مسبقا ويتم استدعاء هاتين الوظيفتين آليا من قبل أي زرين لهما هذان التعريفان.

إظهار رسالة المستعمل

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



MessageBox (m_strMessage);




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



UpdateData(TRUE);




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

مسح رسالة المستخدم :

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



m_strMessage=" ";

UpdateData (FALSE);




لاحظ أننا استخدمنا قيمة FALSE في الوظيفة UpdateData لأننا نريد تحميل المتغير من الكود إلى البرنامج وليس العكس.

وبنفس الطريقة تستطيع جعل الزر المسؤول عن رسالة موجودة مسبقا يعرض رسالة معينة تستطيع أنت اختيارها.

توقيف وإخفاء تحكمات الرسالة

الأمر الأخير الذي تود فعله هو تثبيت علبتي الرسالة وعرض الرسالة ولفعل ذلك اكتب الكود التالي :



1. void CDay2Dlg::OnChenblmsg()

2. {

3. // TODO: Add your control notification handler code here

4. UpdateData(TRUE);

5. if (m_bEnableMsg == TRUE)

6. {

7. GetDlgItem(IDC_MSG) ->EnableWindow(TRUE);

8. GetDlgItem(IDC_SHWMSG)->EnableWindow(TRUE);

9. GetDlgItem(IDC_DFLTMSG)->EnableWindow(TRUE);

10. GetDlgItem(IDC_CLRMSG)->EnableWindow(TRUE);

11. GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);

12. }

13. else

14. {

15. GetDlgItem(IDC_MSG) ->EnableWindow(FALSE);

16. GetDlgItem(IDC_SHWMSG)->EnableWindow(FALSE);

17. GetDlgItem(IDC_DFLTMSG)->EnableWindow(FALSE);

18. GetDlgItem(IDC_CLRMSG)->EnableWindow(FALSE);

19. GetDlgItem(IDC_STATICMSG)->EnableWindow(FALSE);

20. }

21. }

22. void CDay2Dlg::OnChshwmsg()

23. {

24. // TODO: Add your control notification handler code here

25. UpdateData(TRUE);

26. if (m_bShowMsg==TRUE)

27. {

28. GetDlgItem(IDC_MSG)->ShowWindow(TRUE);

29. GetDlgItem(IDC_SHWMSG)->ShowWindow(TRUE);

30. GetDlgItem(IDC_DFLTMSG)->ShowWindow(TRUE);

31. GetDlgItem(IDC_CLRMSG)->ShowWindow(TRUE);

32. GetDlgItem(IDC_STATICMSG)->ShowWindow(TRUE);

33. }

34. else

35. {

36. GetDlgItem(IDC_MSG)->ShowWindow(FALSE);

37. GetDlgItem(IDC_SHWMSG)->ShowWindow(FALSE);

38. GetDlgItem(IDC_DFLTMSG)->ShowWindow(FALSE);

39. GetDlgItem(IDC_CLRMSG)->ShowWindow(FALSE);

40. GetDlgItem(IDC_STATICMSG)->ShowWindow(FALSE);

41. }

42. }




أعتقد أنك قد فهمت القسم الأول من الكود . أولا عدلت قيمة المتغيرات بالقيمة الحالية للنافذة . بعدها ثبت قيمة المتغيرات المنطقية الملحقة بكل علبة تثبيت إذا كان المتغير TRUE ينفذ العمل ويظهر أو يجعل الأدوات الملحقة قابلة للإستعمل ولو كان النتغير FALSE فيخفي أو يجعل الأدوات الملحقة غير قابلة للإستعمال .

بعدها تصبح البرمجة صعبة قليلا . الوظيفة GetIlgItem يمرر إليه ID الأداة المطلوب تغييرها والقسم الثاني من كل أمر برمجة يستدعي وظيفة لاسترجاع عضو وظيفة الأداة المذكورة ويجعل قيمتها TRUE أو FALSE.

الوظيفة الثانية في هذه الاستدعاءات EnableWindow و ShowWindow تبدو وكأنها تستخدم للنوافذ لا للتحكمات(الأدوات) وهذا صحيح فهي تستعمل للنوافذ فهي عضو في فئة CWnd وهي سلف فئة Cdialog والتي ورثتها الفئة Cday2Dgl مما يظهر طبيعتها كنوافذ ، أي أن كل تحكم يستخدم كأنه نافذة مستقلة.

ملاحظة : يمكن كتابة كود علبتا التثبيت الأخريان بنفس الطريقة ولكن مع تغيير التعريفات والمتغيرات.

تنفيذ تطبيق آخر:

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



1. UpdateData(TRUE);

2. CString strPgmName;

3. strPgmName = m_strProgToRun;

4. strPgmName.MakeUpper();

5. if (strPgmName=="PAINT")

6. WinExec("pbrush.exe",SW_SHOW);

7. if (strPgmName=="NOTEPAD")

8. WinExec("notepad.exe",SW_SHOW);

9. if (strPgmName=="SOLITAIRE")

10. WinExec("sol.exe",SW_SHOW);




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

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

والآن أرجو أن أكون قد وفقت في الشرح و درسنا التالي سيكون سيكون بعنوان السماح بالتفاعل مع المستخدم

Power1
22-07-2002, 01:39 AM
dear brother,

I'm folowing your nice lessons, and I'm waiting more from you, I'm waiting for the fourth lesson in C/C++, and plz can you also give
us lessons in Java2.

Where can I find the C/C++ compiler(how many compilers are there?) for example I use Jcreater for Java2

can you plz give us more lessons in C/C++ because I'm a beginner.

sorry i don't own arabic windows to write in arabic, plz answer me in arabic

:0) :0) :0) :0) :0) :0) :0) :0) :0) :0)

amin86
30-07-2002, 10:37 AM
مشكور جدا :D