إنشاء صناديق الحوار Design Dialog Boxes

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

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

برنامج استدعاء صندوق الحوار

إفتح ملف البرنامج vcex8من الفهرسchpt6وقم بتنفيذه ، أو تابع معنا مراحل تصميم البرنامج ثم نفذه ، وفى الحالتين تحصل على نتيجه التنفيذ الموجودة فى الشكل 6-1.

clip_image001

والشكل6-1عبارة عن شاشه رئيسيه من نوع صندوق حوار وعليها مجموعه من أزرار الأوامر ، زر اوامر عند الضغط عليه يعطى صندوق حوار لإستقبال بيانات كما فى الشكل6-2 ،

clip_image002

والشكل6-2 يحتوى على أداة كتابة أكتب بها اسمك ثم انقر على زر الاوامر Click تظهر رسالة ترحيب ،كما يوجدعلى الشاشه الرئيسيه زر أوامر مكتوب عليه Call Dialog1 عند الضغط عليه يظهر صندوق حوار آخر كما فى شكل 6-3

clip_image003

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

خطوات تصميم البرنامج

1. ابدأ تصميم برنامج جديد وذلك باختيار File من القائمه الرئيسيه ثمNew ثمworkspace Project نحصل على صندوق حوار لكتابة اسم التطبيق اكتب الاسمvcex8 ثم Create .

2. حدد نوع التطبيق من نوع Dialog Based ثم Next وهكذا باقى الخطوات حتى تصل إلى الشاشه النهائيه أواضغط Finsh فتحصل على تطبيق بالمواصفات التى تم تحديدها.

3.ابدأ فى تصميم شكل الشاشه الرئيسيه كما يلى :

- بإستخدام الفأرة إضغط على زر الموارد (من صندوق الملفات) ثم انقر مرتين vcex8 resources ثم انقر مرتين على Dialog ثم IDC-Dialog-vcex8 تحصل على الشكل المبدئى لصندوق الحوار إمسح الأدوات الموجودة عليه كما سبق.

- اسحب أداة زر الأوامر بإستعمال الفأرة من شريط الأدوات ووقعها على صندوق الحوار.

- انقر على زر الأوامر الجديد مرتين بالفأرة تحصل على صندوق الخصائص ، فى خاصية Caption اكتب Enter Data.

بالمثل اسحب الزر الباقىواكتب له خاصية Caption بحيث تحصل فى النهاية على الشكل المطلوب للشاشه الرئيسيه للبرنامج كما فى الشكل 6-1 ثم احفظ المتغيرات التى تمت فى البرنامج.

إنشاء صندوق حوار جديد

4. لإنشاء صندوق حوار جديد بحيث يستعمل داخل البرنامج إتبع ما يلى :

n من القائمه الرئيسيه إختار Insert ثم Resource يظهر صندوق حوار يحتوى على الأنواع التى يمكن إضافتها للبرنامج كما فى الشكل 6-4

clip_image004

n إختر Dialog ثم Ok تحصل على صندوق حوار جديد يحتوى على زرى أوامر هما Ok و Cancel اتركهما كما هما.

- اسحب أداه كتابة (Edit box) وضعها على صندوق الحوار وكذلك اسحب أداة عنوان و أيضا زر أمر ، وغير خاصية Caption له إلى Click لتحصل على الشكل 6-5.

clip_image005
الاعلان عن فصيلة صندوق حوار

6. بعد إضافة صندوق حوار للمشروع لابد من اعلان فصيله صندوق حوار لربط صندوق الحوار بالبرنامج وحتى نتمكن من التعامل مع صندوق الحوار ، ويتم ذلك كما يلى :

n اضغط على مفتاحى Ctrl+W للحصول على شاشه Class Wizard (وهى الشاشه المسئوله عن الاختيار New Class) تحصل على صندوق حوار إنشاء فصيله (Class) جديدة كما فى الشكل 6-6 اضغط Ok.

clip_image006

- تحصل على صندوق حوار يحدد مواصفات الفصيلة الجديدة كما فى الشكل 6-7 اكتب اسم للفصيلة الجديدة ، اكتب اسم md1وتأكد من أن نوع الفصيلة الام base class)) هى Cdialog ثم اضغط Creat.

clip_image007

شكل 6-7 صندوق مواصفات الفصيلة الجديدة

اعطاء متغير لأداه الكتابة

5.لابد من اعطاء متغير لأداه الكتابة الموجودة فى صندوق الحوار للتعامل معها وذلك كما يلى :

- اضغط على Ctr+W للحصول على صندوق حوار Class Wizard ثم Member Variables ثم IDC-Edit ثم Add Variable واكتب اسم للمتغير وليكن M1 من نوع string ثم Ok.

اعلان هدف للفصيلة md1

7. بعد إنشاء فصيلة لصندوق الحوار الجديد لابد من اعلان هدف (متغير) من هذه الفصيلة حيث يتم التعامل مع هذا الهدف (المتغير) عند الاستدعاء ويتم ذلك كما يلى :

- من القائمه الرئيسيه اختار File ثم Open ثم افتح الملف vcex8dlg.h

- اكتب فى أول الملف السطر التالى :

#include “md1.h”

هذا السطر يقوم بالاشتمال على الملف md1.h المعرف به فصيلة صندوق الحوار الجديد

اظهار (استدعاء) صندوق الحوار الجديد

9. حتى الآن تم إنشاء الشاشه الرئيسيه وإنشاء صندوق حوار وإنشاء فصيلة صندوق حوار ولكن لم يتم ريط صندوق الحوار بزر الأوامر ، فالمطلوب ربط زر الأوامر المسمى Enter Data بصندوق الحوار الجديد ويتم ذلك كما يلى :

- اضغط علىمفتاحى Ctrl+W للحصول على شاشه صندوق Class Wizard.

- من صندوق القائمه المكتوب فوق Class Name اختار الفصيلة DLg vcex8 وهى فصيلة صندوق الحوار الخاصه بالشاشه الرئيسيه التى يوجد عليها زر الأوامر Enter Dataثم اختار IDC- Button1

- من صندوق القائمه المكتوب فوقه Messages (صندوق الرسائل)اختار BN_CLICKED ثم Add Function ثم Ok ثم Edit Function لكتابة سطور الدالة .

- اكتب الأوامر التى تنفذ عند الضغط على زر الأوامر Enter Data وهى أوامر إستدعاء صندوق الحوار ، واكتب السطور التالية :

md1 d1;

d1. Do Modal ( ) ;

فى السطر الأول تم تعريف متغير d1 من نوع الفصيلة md1 حتى يشير الى صندوق الحوار الجديد

فى السطر الثانى تم استدعاء الداله DoModal ( ) لعرض صندوق الحوار المعرف بالمتغير m1.

- ترجم البرنامج ونفذه عند هذه المرحلة (ctrl+f5) وجرب استعماله بالنقر على زر الاوامر Enter Data تلاحظ ظهور صندوق الحوار جديد.

كتابة دالة زر الاوامر Click

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

-من شجرة ملفات الموارد اختار صندوق الحوار الجديد وهو IDD_DIALOG1

-اضغط المفتاحين Ctrl+w للحصول على شاشة classwizard

-انقر IDC_BUTTON1 ثم BN_CLICKED ثم add function ثم ok ليتم اضافة دالة لزر الاوامر

-انقر Edit Code لكتابة سطور الدالة واكتب السطور التالية:-

1:Cstring sa,sa2;

2:sa=“Welcome with you MR.”;

3:UpdateData(TRUE);

4:sa2=sa+m1;

5:MessageBox(sa2);

فى هذه السطور

فى السطر رقم 1 اعلان عن متغيرين sa,sa2 من نوع Cstring

فى السطر رقم 2 تخزين عبارة فى المتغير sa

فى السطر رقم 3 يتم استدعاء الدالة UpdateData() لنقل محتويات أداة الكتابة الى المتغير المصاحب لها وهو m1

فى السطر رقم 4 يتم جمع محتويات المتغير sa الى محتويات المتغير m1 وهو ما تم كتابته فى أداة الكتابة ووضع النتيجة فى المتغير sa2ويمكن استخدام الدلة ( ) Strcat

فى السطر رقم 5 تقوم الدالة MessageBox بعرض محتويات المتغير sa2 وهى رساسة الترحيب بالاضافة لما تم كتابته فى أداة الكتابة والناتج فى الشكل 1 .

أوامر الزر CallDialog1

يوجد على الشاشة الرئيسية للبرنامج زر الاوامر CallDialog1 الذى يعطى صندوق حوار جديد يحتوى على زر أوامر CallDialog2 عند النقر عليه يعطى صندوق حوار أخر ويتم تحقيق ذلك بعدة خطوات هى

- إنشاء صندوق حوار جديد (الذى يحتوى على زر الاوامر CallDiaolg2)

- إنشاء فصيلة من نوع Dialog لصندوق الحوار الجديد

- تعريف هدف من الفصيلة الجديدة

- كتابة داله زر الأوامر Call Dialog1

- تكرار نفس الخطوات مع زر الاوامر CallDialog2

1. إنشاء صندوق حوار جديد

- من القائمة الرئيسيه إختار Insert ثم Resource ثم Dialog تحصل على صندوق حوار جديد وعليه زرى أوامر مكتوب عليها Ok ، Cancel.

- اسحب أداه زر أوامر من صندوق الأدوات ووقعها على صندوق الحوار وغير عنوان زر الأوامر إلى Call Dialog2

2. إنشاء فصيلة من نوع Dialog لصندوق الحوار الجديد

- بعد إضافة صندوق حوار جديد للمشروع لابد من إنشاء فصيلة صندوق حوار له حتى يتم التعامل مع صندوق الحوار من خلال هذه الفصيله (هدف الفصيله) ويتم ذلك كما يلى :

- اضغط مفتاحى Ctrl+W للحصول على شاشه Class Wizard.

- اختار Create a new Calss ثم Ok بمعنى تخليق فصيله جديدة.

- اكتب اسم الفصيلة ND1 وتأكد من أن Base Class هو CDialog ثم انقر بالفأرة على زر الأوامر Creat ثم Ok وبهذا تم انشاء فصيلة بالاسم ND1 لصندوق الحوار الجديد.

3. تعريف هدف من الفصيلة ND1

للتعامل مع هذه الفصيلة لابد من الاعلان عن هدف من نوع الفصيلة ، ويتم ذلك فى ملف الفصيلة التى يتم الاستدعاء منها ، وفى هذه الحاله يتم الاستدعاء من صندوق الحوار الرئيسى للبرنامج وبالتالى يتم تعريف هدف من هذه الفصيلة كما يلى :

- افتح الملف vcex8dlg.h وفى أول الملف اكتب السطر التالى :

#include “ND1.h”

وهذا السطر معناه اشتمل على الملف ND1.h وذلك لآن به تعريف الفصيلة ND1 التى تستعملها فى استدعاء صندوق الحوار الجديد فإذا لم نكتب هذا السطر فلن يتعرف مترجم اللغه على الفصيلة وبالتالى لن يتم تعريف هدف من هذه الفصيلة ويعطى المترجم رساله خطأ.

4. كتابة داله زر الأوامر Call Dialog1

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

- اضغط على مفتاحى Ctrl+W للحصول على شاشه Class Wizard.

- من صندوق القائمه المكتوب فوقه Class Name اختار اسم الفصيلة التى بها زر الأوامر وهى vcex8dlg، ومن صندوق القائمة المكتوب فوقه Object IDs اختر IDC-Button3 وهو زر الأوامر المطلوب

- من صندوق القائمه المكتوب فوقه Messages اختار BN-Cliked ثم انقر زر الأوامر Add Function ثم Ok لاضافة دالة بالاسم المقترح .

- اختر زر الأمر Edit Code لكتابة سطور الداله واكتب السطور التالية :

1:ND1 db1;

2:db1.DoModel ( );كما فى الشكل 2

فى السطر رقم 1 يتم تعريف متغير (هدف)db1 من نوع الفصيلة ND1 المصاحبة لصندوق الحوار الجديد.

فى السطر رقم 2 يتم إستدعاء الداله DoModal ( ) التى تظهر صندوق حوار مع نسبه هذه الداله للمتغير db1 وهو هدف يشير إلى صندوق الحوار المطلوب استدعائه.

- احفظ التغييرات وجرب ترجمة وتنفيذ البرنامج حتى هذه المرحلة تلاحظ أنه عند الضغط على زر الازامر Call Dialog1 يظهر صندوق الحوار الجديد

5. استدعاء صندوق حوار من صندوق حوار

فى الفقرة السابقه تم استدعاء صندوق حوار عند النقر بالفأرة على زر أوامر فى الشاشه الرئيسيه (Call Dialog1) وصندوق الحوار الجديد يحتوى على زر أوامر مكتوب عليه Call Dialog2 والمطلوب تصميم صندوق حوار يتم استدعائه عند النقر على زر الأوامر Call Dialog2 وذلك لتوضيح كيفية استدعاء صندوق حوار من صندوق حوار ويتم ذلك كما يلى :

- قم بإضافة صندوق حوار للبرنامج وذلك باختيار Insert من القائمة الرئيسيه ثم Resource ثم Dialog.

- اسحب أداه عنوان ووقعها على صندوق الحوار الجديد وغير عنوانها إلى Call From Dialog ثم احفظ هذه المتغيرات.

- قم بإنشاء فصيلة (Class) جديدة لصندوق الحوار وذلك بالضغط على مفتاحى Ctrl+W للحصول على شاشه Class Wizard ، ثم Creat New Class ثم Ok.

- اكتب اسم الفصيلة وليكن ND2 ثم Create ثم Ok.

- قم بالاعلان عن هدف من الفصيلة ND2 فى الملف الذى يتم استدعاء صندوق الحوار منه وذلك بفتح الملف ND1.h ولاعلان عن هدف من الفصيلة كما يلى :

- من File اختار Open ثم اختار الملف ND1.h.

- اكتب السطر التالى فى أول الملف.

#include “ND2.h”

وبهذا السطر تم اشتمال الملف nd1.h على الملف ND2,h المعرف به فصيلة صندوق الحوار الجديد.

- اكتب أمر استدعاء صندوق الحوار فى زر الأوامر المسمى Call Dialog2 وذلك بالضغط على مفتاحى Ctrl+W للحصول على شاشه Class Wizard ثم حدد الفصيلة التى بها زر الأوامر المسمى Call Dialog2 وذلك من صندوق القائمه Class Name ثم اختار زر الأوامر من صندوق الاختيارات المسمى Object IDs وهو IDC-Button1 ثم انقر بالفأرة على BN-Clicked.

- انقر بالفأرة فوق زر الأوامر Add Function ثم Ok.

- انقر بالفأرة فوق زر الأوامر Edit Code ثم اكتب السطور التالية:

1:ND2 db2;

2:db2 . DoModel ( );

فى السطر رقم 1 تم تعريف متغير db2 من النوع ND2 أى تعريف هدف من الفصيلة ND2

فى السطر رقم 2 تم استدعاء الداله DoModel ( ) التى تستدعى صندوق الحوار المعرف بالمتغير db2 وهو هدف من الفصيلة ND2 المعرفه لصندوق الحوار المطلوب استدعائه.

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

استعمال الداله MessageBox ( )

تستعمل الداله MessageBox ( ) لعرض رسائل للمستخدم مختلفه مع إمكانيه تغيير الرساله وعنوان صندوق الرساله ومواصفات صندوق الرساله ، فيمكن عرض صندوق رساله به زر أوامر واحد مكتوب عليه كلمه Ok كما هو معتاد ، ويمكن عرض صندوق رساله به زرى أوامر أحدهما مكتوب عليه Ok والآخر مكتوب عليه Cancel بل يمكن إظهار صندوق الرسالة بجميع الأشكال المختلفه التى تراها مع برنامج النوافذ ونوضح ذلك فيما يلى :

تأخذ الداله MessageBox ( ) الصورة العامة التالية :

No = Message Box (HWND hwnd,LPCTSTR Lp Text

LPCTSTR Lp caption,Uint Type);

حيث :

المتغير hwnd : يشير إلى النافذه التى تريد إظهار صندوق الرساله معها فإذا لم يكتب هذا المتغير يظهر صندوق الرساله فى النافذه الحاليه.

المتغير Lp Text : الرساله المطلوب إظهارها للمستخدم ويمكن كتابتها كما هى بين علامتى تنصيص أو وضع الرساله فى متغير من نوع String ثم كتابة اسم المتغير.

المتغير Lp Cation : هو عنوان صندوق الرساله ويمكن أن يكون نص أو متغير.

المتغير Type : رقم يحدد مواصفات صندوق الرساله.

وهذا المتغير يمكن أن يكون رقم أو متغير يحدد شكل صندوق الرساله ، والجدول التالى يعرض الرموز والارقام المختلفة وأمام كل متغير(رقم) المعنى المقابل لهذا المتغير (نوع صندوق الرسالة ).

الرمز المستخدم

الرقم المقابل

المعـــنى

MB-Ok

0

اظهار زر أمر Ok فقط فى صندوق الرسالة.

MB_OKCANCEL

1

اظهار زر أمر OkوCANCEL

MB_ABORTRETRYIGNORE

2

عرض أزرار ABORT,RETRY,IGNORE

MB_YESNOCANCEL

3

عرض أزرار YES ,NO,CANCEL

MB_YESNO

4

عرض أزرار YES ,NO, فى الصندوق

MB_RETRYCANCEL

5

عرض أزرار RETRY,CANCEL

MB_ICONSTOP

16

عرض الرمز STOP

MB_ICONQUESTION

32

عرض رمز علامة الاستفهام ؟

MB_ICONINFORMATION

48

عرض رمز علامة التعجب ‍‍‍!

جدول بارقام ورموز صندوق الرسالة

المتغير No : يحتوى هذا المتغير على رقم صحيح يعبر هذا الرقم عن اختيار المستخدم من صندوق الرسالة هل المستخدم اختار Ok أم Cancel والجدول التالى يوضح الرموز التى يأخذها هذا المتغير (وهذه الرموز معرفة بأرقام فيمكن لك استعمال الرمز أو الرقم المقابل له) ومعنى كل رمز.

الرمز المستخدم

الرقم المقابل

المعــنى

IDOK

1

المستخدم اختار Ok.

IDCANCEL

2

المستخدم اختار CANCEL.

IDABORT

3

المستخدم اختار ABORT.

IDRETRY

4

المستخدم اختار RETRY.

IDIGNORE

5

المستخدم اختار IGNOR.

IDTES

6

المستخدم اختار YES.

IDNO

7

المستخدم اختار NO.

جدول بأرقام اختيارات المستخدم

برنامج صناديق الرسائل

فى هذا المثال نصمم برنامج بسيط الفكرة ولكنه يوضح لنا الأشكال المختلفه لصندوق الرساله ، يقوم البرنامج بإستقبال الرقم المميز لصندوق الرساله (Type) فى إداه نص (Edit) من المستخدم فإذا ضغط المستخدم على زر الأوامر Click يظهر صندوق رسالة بالنوع المقابل للرقم الذى كتبه المستخدم فإذا ضغط المستخدم على أحد أزرار صندوق الرساله يخرج صندوق رساله آخر برقم هذا الرقم يعبر عن الزر الذىاختاره المستخدم ويظهر ذلك فى الشكل 6-.8

clip_image008

- ويمكن لك ان تفتح ملف البرنامج VCEX9 من الفهرس CHP9 أو تتابع معنا مراحل تصميم البرنامج وهى كما يلى :

خطوات تصميم الرنامج

1. ابدأ ملف برنامج جديد وذلك بإختيار File ثم New ثم Project.

2. اكتب اسم للبرنامج وليكن VCEX9 ثم Ok.

3. اختار نوع البرنامج Dialog based ثم Next.

استمر فى النقر على Next بالمواصفات المعروضه للبرنامج حتى تصل إلى الخطوة الاخيرة وانقر Finsh.

4. قم بتعديل صندوق الحوار الرئيسى ليوافق شكل البرنامج وذلك بالنقر على زر موارد البرنامج ثم VCEX9 RESOURCES ثم Dialog ثم IDD - VCEX9 - Dialog.

- اسحب أداه نص وأداه عنوان وزر أوامر من صندوق الأدوات ووقعها على صندوق الحوار وغير عناوين الأوامر وأداة العنوان لتحصل على شكل 6-9.

clip_image009

5. قم بإعطاء متغير لأداة النص (Edit1) وذلك كما يلى :

- اضغط على مفتاح Ctrl على لوحه المفاتيح وفى نفس الوقت انقر بالفأرة مرتين على أداة النص تحصل على صندوق حوار تسجيل متغير ، اكتب اسم المتغير m واجعل نوعه (Type) من نوع int ثم انقر على Ok.

6. اكتب سطور داله زر الأوامر Click وذلك كما يلى :

- اضغط مفتاحى Ctr+W للحصول على شاشه Class Wizard.

- تأكد من اسم الفصيلة (Class Name) vcex9dlg.

- من قائمة العناصر (Object IDS) اختار IDC-Button1 ثم اختار BN-Clicked من صندوق الرسائل (Messages).

- انقر زر Add Function ثم انقر على Ok للموافقه على اسم الداله.

- انقر زر Edit Code لكتابة سطور الداله واكتب السطور التالية :

1: # include <Stdlib.h>

2: int n;

3: Char buffer [20];

4: UpdateData (TRUE);

5: n = Message Box (“this no give this Box “,”Dialog Box with Message -” ,m);

6: itoa (n, buffer , 10);

7: Message Box (buffer);

شرح سطور الداله

فى السطر رقم 1 الامر include يشتمل على الملف Stdlib.h حيث به تعريف الداله Itoa () المستعملة خلال هذه السطور.

فى السطر رقم 4 استدعاء الداله UpdateData ( ) بالمعامل TRUE وذلك لنقل الرقم الذى يكتبه المستخدم فى أداه النص إلى المتغير المعرف لأداه النص (m).

فىالسطر رقم 5 يتم باستدعاء الداله MessageBox ( ) بالمعاملات المحدده وهى الرساله التى تظهر فى سطر صندوق الرساله (MS4) ، وعنوان صندوق الرساله (Title) ونوع صندوق الرساله وهو الرقم المخزن بالمتغير m والذى ادخله المستخدم ، وبالتالى كلما ادخل المستخدم رقم مختلف تقوم الداله بعرض صندوق الرسالة المقابل لهذا الرقم ، المتغير n يحتفظ بالرقم المقابل للزر الذى اختاره المستخدم من صندوق الرساله.

فى السطر رقم 6 يتم استدعاء الداله Itoa لتحويل الرقم الموجود فى المتغير n إلى صورة عبارة حرفيه وتخزينها فى المتغير buffer حنى يتم عرضه بالدالة Message Box() .

فىالسطر رقم 7 يتم إستدعاء الداله Message Box ( ) لعرض الرسالة المخزنه فى المتغير buffer والذى يحتوى على الرقم الذى اختاره المستخدم.

- قم بترجمة وتنفيذ البرنامج وجرب كتابة أرقام مختلفه كل مرة فى أداة النص ثم انقر على زر الأوامر Click وشاهد النتيجه تلاحظ ظهور صندوق رسالة مختلف مع كل رقم .

تعليقات

المشاركات الشائعة من هذه المدونة

المؤثرات الحسابية في C++

الرسم Graphics

دوال النمط الرسومي في ++C