المساعدة - البحث - قائمة الأعضاء - التقويم
نسخة كاملة: ما المقصود بالماكرو ؟
برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة > منتديات لغات البرمجة العام > منتدى مبرمجي C و ++C و C++.NET > أرشيف منتدى قسم السي ++
آل عيد
بسم الله لرحمن الرحيم

السلام عليكم

الأخوة الأعزاء ما المقصود بالماكرو ؟
محمد بدوي
الماكرو ياصديقي هو

مجموعه من الاوامر الجاهزة تنفذ بصورة متتابعه وتكون عادة في برامج اوفيس مثلا لو قمت بعمل ماكروا في اكسس كالتالي

افتح النافذة A
كبر النافذة A
اعمل فلترة على قاعدة البيانات B
اخرج النتائج في تقرير C
اطبع التقرير G

يعني قمنا بتخزين اكثر من عملية ليقوم بها هذا الماكرو داخل اجراء واحد ليقوم بعملها جميعا متتابعه

طبعا من الممكن عملا لكثير وانا لست اعرف الكثير بها ولكن هذا توضيح بها
Adel Khayata
السلام عليكم.
تعقيباً على كلام الأخ محمد بدوي فكما قال أنها مجموعة من الأوامر الجاهزة تنفذ بصورة متتابعة و يمكن أن تكون هذه الأوامر أوامر للتعامل مع بيئة البرنامج مثل مثال الأخ محمد و يمكن أن تكون عبارة عن شيفرة ففي Visual C يوجد مثلا الماكرو ON_COMMAND( id, memberFxn ) و الذي مهمته تحويل (الرسائل التي تصل إلى id ) الى التابع memberFxn .
مع التحيات.
آل عيد
الأخوة الأعزاء

كنت أقصد ما الفرق بين الإجراءات العادية والماكرو ، مثلا لجعل النافذة تستقبل أحد الأحداث نستخدم ماكرو Message_Map حيث يضاف إلى إعلانات الفئة هكذا :
[code2]
class test : CFrameWnd
{
........
public:
........
........
DECLARE_MESSAGE_MAP()
}
[/code2]
ونعرفه هكذا :
[code2]
BEGIN_MESSAGE_MAP(test, CFrameWnd)
ON_WM_SIZE()
END_MESSAGE_MAP()
[/code2]

الآن قام الماكرو بتعريف الحدث OnSize ولكن السؤال هل تتم ترجمة الماكرو من الكومبايلر أم البريبرسسير وأين يكون موجود ومالفرق بين إجراء عادي وماكرو ؟
ولو أمكن كتابة ماكرو للتوضيح .

وشكرا لكم ، أخوكم .
هاني الأتاسي
أخي،

الماكرو في ال ++C هو عبارة عن تصريح DEFINE وقد يكون له بارامترات أو لا يكون . وكما تعلم فإنك إذا عرقت define في برنامجك لتصريح ما مثل :
[code2]
#define MY_VAL 10
[/code2]
فإن المترجم أثناء عملية الترجمة يقوم باستبدال أي كلمة يجدها MY_VAL بالقيمة 10

الماكرو نفس الموضوع . مثلا أنت تريد أن تكتب ماكرو يطبع الكلمة Test على الشاشة فيكون كالتالي :
[code2]
#define PRINT() printf(“Test”)
[/code2]
وبالتالي عندما تكتب بعد ذلك في البرنامج العبارة
PRINT(); فإن المترجم يحل محلها العبارة :
[code2]
Printf(“Test”);
[/code2]

أما الماكروات ذات البارامترات فهي الأكثر انتشارا .. وهي مقيدة جدا .. مثلا تريد كتابة ماكرة من أجل ارجاع القيمة الأصغر بين قيمتين فيكون :
[code2]
#define MIN(a, cool.gif (a < b ? a : cool.gif
[/code2]
الآن كلما يجد المترجم العبارة MIX( 1, 2) مهما تكن البارامترات فإنه يستبدلها ب :
(1 < 2 ? 1 : 2) ..

بالنسبة لل MFC فيجود العديد من الماكروات التي تسهل من البرمجة ومنها كما ذكرت BEGIN_MESSAGE_MAP وغيرها وهذه الماكروات ليست بسيطة أي قد تجدها تمتد إلى عدة أسطر وممكن أن تبحث عنها في شيقرة ال MFC المفتوحة وتقرئها .. أكثر هذه الماكروات موجودة في الملف afxwin.h . وعلى سبيل المثال ترى أن DECLARE_MESSAGE_MAP معرفة على الصورة :
[code2]
#define DECLARE_MESSAGE_MAP()
private:
static const AFX_MSGMAP_ENTRY _messageEntries[];
protected:
static AFX_DATA const AFX_MSGMAP messageMap;
virtual const AFX_MSGMAP* GetMessageMap() const;
[/code2]

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

بالنسبة لشرح ماكروات الرسائل في ال MFC فسوف أفصل في ذلك في الدرس بعد القادم في سلسلة تعليم الفيجوال سي ...

طبعا فائدة الماكرو هي :
  • الاختصار في وقت كتابة الأكواد الي تستعملها باستمرار وبكثرة
  • تخفيف تعقيد بعض العبارات
  • طبعا بعض الأحيان يمكن كتابة روتين يؤدي الغرض ولكن الماكرو أسرع لأنه لا يحتاج إلى مناداة التابع . وهي تشبه ال inline في عملها


ولكن استخدام الماكروات الكبيرة بكثرة قد تؤدي إلى زيادة حجم الكود ..

regular_smile.gif
آل عيد

. Thank you Astath Hani

(sorry this computer dosen't supprt arabic)

هذه "نسخة - خفيفة" من محتويات الرئيسية للإستعراض الكامل مع المزيد من الصور والخيارات الرجاء إضغط هنا.
Invision Power Board © 2001-2009 Invision Power Services, Inc.