السلام عليكم ورحمة الله وبركاته
الاخ مسلم... حفظه الله تعالى..
قرأت ردك وها أنذا أجيب..
أدوات Xcode تأتي كاملة مع النظام .. حتى البرنامج Xcode نفسه، لكنها الإصدار 1.1 وفيه مشلكة بالنسبة للغة العربية.. وهناك النسخة المحسنة 1.5 أفضل بكثير. وتعمل مع اللغة العربية بكفاءة
ولأن الماكنتوش كنظام تشغيل مختلف عن الويندوز فكان من الطبيعي ان تختص برمجته بأشياء مختلفة عن الويندوز
لغة C في الماكنتوش والويندوز (كقواعد لغوية) نفس الشيء.. لكن في الماكنتوش تختلف في بعض الجوانب..
ففي الماكنتوش توجد C مع Xcode على النحو التالي:
لغة C ... تشبه التي في الويندوز
لغة C++ تشبه التي في الويندوز
لغة Objective C خاصة بالماكنتوش
لغة Objective C++ خاصة بالماكنتوش
لغة C Shell Script على حد علمي أنها خاصة بالماكنتوش
وهناك لغة شهيرة وتستخدم منذ أكثر من 15 عاما في نظام الماكنتوش ولا زالت إلى اليوم تسمى:
Rez أو Rez Input Format وهي لغة شبيهة بـ C وتستخدم في إنشاء الموارد ...
وأيضا في Xcode تستخدم لغة C تقنيتين قويتين جدا في البرمجة
بإمكانك استخدام أحدهما لعمل أقوى البرامج كفوتوشوب وإكسل أو دمج التقنيتين معا وهما
Carbon و Cocoa
وتتجاوز أوامر كل واحدة منهما عشرات الألاف من الأوامر..
وفي كل الاحوال لغة السي كقوانين واحدة، لكن في الماكنتوش لها بعض الخصائص، حتى تطابق نظام التشغيل الخاص به.. وفي الويندوز أيضا نفس الشيء حتى تطابقه أيضا..
والاختلاف يكون في الأوامر والخصائص..
وبالنسبة لشرح البرنامجين السابقين (مرحبا بك أيها العالم): (برمجة الماكنتوش)
اولا برنامج باسكال:
هذا نص البرنامج -- الأسطر مرقمة فقط للشرح ولا ينبغي كتابة الأرقام عند إنشاء البرنامج:
1 program Hello;
2 {Insert your declartions here}
3 var
4 myWindow:WindowPtr;
5 myString:Str255;
6 myRect:Rect;
7 begin
8 { Insert your program code here }
9 InitGraf(@thePort);
10 InitFonts;
11 InitWindows;
12 InitMenus;
13 TEInit;
14 InitDialogs(nil);
15 SetRect(myRect,150,150,600,400);
16 myWindow := NewWindow(nil, myRect,'My Window', True,dBoxProc,WindowPtr(-1), True, 0);
17 myString:= 'Hello World';
18 ShowWindow(myWindow);
19 SetPort(myWindow);
20 TextFont(SystemFont);
21 MoveTo(160,75)
22 DrawString(myString);
23 repeat
24 until Button
25 end.
شرح البرنامج:
السطر رقم 1: من قوانين باسكال أن يبدأ البرنامج التطبيقي بالأمر Program ثم يتبعه اسم ما..
في هذا المثال اسم البرنامج Hello ثم في نهاية السطر يجب وضع الفاصلة المنقوطة .. أيضا من قواعد باسكال في نهاية كل سطر ما عدا أسطر if
السطر رقم 2:
النص مكتوب ضمن حاصرتين.. وأي نص يكتب ضمن الحاصرتين في باسكال يعني أن على المترجم Compiler أن يتجاهله، وهذا النص نمسيه بالتعليقات وهي مفيدة.. (بالبيسك والكيو بيسك التعليقات يسبقها إما ' وإما الأمر REM
السطر 3: الأمر var وهو اختصار الكلمة variable ويعني أن ما سيتبعه هو إعلان عن المتغيرات. ينبغي إعلان متغير واحد على الأقل...
السطر 4: يتم الإعلان عن متغير اسمه myWindow وانتمائه إلى بنية المعلومات WindowPtr وهي عباة عن الإشارة إلى النافذة.. (وذلك لاسخدامه في إنشاء النافذة)
السطر 5: يتم الإعلان عن متغير اسمه myString وهو ينتمي إلى بنية المعلومات Str255 وهي مصفوفة تتكون من 256 بايت .. البايت الأول هو رقم يدل على عدد الأحرف فعليا المكونة للجملة.. ثم يليه البايت الثاني وهو عبارة عن الحرف الأول في الجملة وهكذا.. إذ أنه يصل عدد الأحرف في الجملة 255 حرف والبايت الأول يبقى ليدل على طول الجملة.. هذا في قانون باسكال.. (أقصد جمل الباسكال هكذا شكلها .. تبدأ من البايت الثاني في المصفوفة ، والبايت الأول هو عدد الأحرف .. بخلاف لغة السي كليا.
السطر 6: يتم الإعلان عن المتغير myRect وهو ينتمي إلى بنية المعلومات Rect، والتي تدل على مساحة معينة على الشاشة .. شكل رباعي بالتحديد..
السطر 7: الأمر begin ويعني إبدأ .. يجب أن يوجد هذا الأمر في البرنامج على الأقل مرة واحدة إذ به يتحدد بداية البرنامج، وهذا أيضا من قواعد باسكال..
السطر 8: ملاحظات وتعليقات سبق شرحه
السطر 9: هنا تكمن الفروقات بين الماكنتوش والويندوز، هذا الأمر يطلب من إدارة الرسم، تجهيز نفسها وأن تقوم بالتحليل.. ويجب استدعاؤه قبل أي أمر، وخصوصا أوامر الرسم، والأسطر التي تليه هي تجهيز وتحليل أهم الإدارات.. الأمر هو أمر نظامي، يخص إدارة الرسم وهو على النحو التالي:
InitGraf (globalPtr: Ptr);
والمتغير الذي يقع بين الأقواس هو مؤشر يشير إلى ميناء الرسم العام، وهو ميناء إدارة النوافذ.. سيتم شرح ميناء الرسم وما المقصود منه لاحقا.. نسمي المتغيرات التي تقع بين الأقواس وتكون تابعة لأمر مثل هذه تماما نسمينها بعناصر الامر : Arguments
تلاحظ أنني كتبت : @thePort، وهذه الإشارة @ بلغة باسكال تعني إجبار المتغير ليخرج بصور مؤشر Ptr، والكلمة thePort هي متغير من نوع GrafPtr (إشارة إلى سجل ميناء رسم) وهي تشير إلى ميناء الرسم الحالي العام، وهذا المتغير لم أعلن عنه كبقية المتغيرات لأنه معرف ذاتيا في كل لغات البرمجة، لانه من متغيرات النظام العامة.
السطر 10: تحليل وتجهيز إدارة الخطوط..
السطر 11: تحليل وتجهيز إدارة النوافذ،
السطر 12: تحليل وتجهيز إدارة القوائم،
السطر 13: تحليل وتجهيز إدارة تحرير النصوص،
السطر 14: تحليل وتجهيز إدارت مربعات صناديق الحوار،،( التي تحتوي على أزار موافق، إلغاء الامر،،....)
تلاحظ أنني أتبعت الكلمة nil للامر بين الأقواس ، لان هذ الأمر هو على الصورة:
PROCEDURE InitDialogs (resumeProc: ResumeProcPtr);
والعنصر resumeProc هو إشارة إلى أمر روتيني يستخدم من قبل معالج أخطاء النظام، في حالة حدوث خطأ مفاجئ أو قاتل وذلك في الأنظمة التي سبقت الباحث المتعدد، كالنظام ذي الإصدار 6 وما قبله..
في النظام 7 وما بعده يجب جعل هذه المعلومة (resumeProc) لا شيء.. أي أنه لا يشير إلى شيء هذا المتغير.. بوضع الأمر nil
السطر 15 يستخدم الأمر SetRect وهو من إدراة الرسم، لتحديد المستطيل myRect، بتحديد إحادثياته على الشاشة تبعا لميناء الرسم الحالي، وذلك وهو على النحو التالي:
SetRect( var r: Rect; left, top, right, bottom: Integer);
الامر يتطلب 5 عناصر، الاول هو المستطيل المراد تحديد إحداثياته، والأربعة البقية هي عباة عن التقاء حدوده معا.
السطر 16 يستخدم الأمر NewWindow، من إدراة النوافذ، وذلك لإنشاء نافذة،
تلاحظ أن هذا الأمر استخدمناه بعد إشارة يساوي، إذنه أنه أمر عملية وليس إجرائي مثل SetRect
وأي أمر عملية تستطيع استخدامه كمعادلة.
وهو على النحو التالي:
FUNCTION NewWindow (wStorage: Ptr; boundsRect: Rect;
title: Str255; visible: Boolean;
theProc: Integer; behind: WindowPtr;
goAwayFlag: Boolean;
refCon: LongInt): WindowPtr;
تجد أن هذا الأمر يتطلب 8 عتاصر ، (ملاحظة يطلق على عناصر الأمر : جسم الامر )
وهي :wStorage من نوع إشارة، وهو إشارة إلى سجل النافذة من نوع WindowRecord،
وإذا كتبت nil، فإن إدارة النوافذ ستنشئ وتمركز في الذاكرة كتلة لسجل النافذة غير قابلة لإعادة التمركز في كومة الذاكرة. باستطاعتك تقليل فرص تجزيء أكوام الذاكرة عن طريق تخصيص كتلة (كمخزون) من الذاكرة تحجز لسجل النافذة، وتقوم بالإشارة إليه عن طريق هذا العنصر.
boundsRect: وهو المستطيل ذي الإحداثيات العامة، الذي يصف حجم النافذة، وموقعها.
هذا المستطيل سيكون هو مستطيل ميناء الرسم الخاص بهذه النافذة، وهو يصف إقليم محتويات النافذة.
title: هو الجملة التي تصف عنوان النافذة.. الجملة هن جملة باسكال (تتبع جمل باسكال التي سبق ذكرها قبل قليل)
إذا كانت الجملة طويلة ولا يتسع لها شريط العنوان، تقوم إدارة النوافذ باقتطاع أجزاء منها حسب الحاجة سواء من كلا الطرفين، أم من الطرف الاخير.
visible: قيمة منطقية نعم أو لا، صح أو خطأ، والمقصود أن هذه النافذة هل ستكون مرئية مباشرة بعد إنشائها.. أم ستسخدم الأمر الخاص بإظهار النوافذ..
بإمكانك استخدامTRUE أو FALSE
TRUE تعني أظهر النافذة، و FALSE لا تظهر النافذة.
theProc: تعريف هوية النافذة، هناك أشكال مختلفة من النوافذ، مثلا نافذة بشريط عنوان وأخرى بلا شريط عنوان، نافذة مع مربع إقفال ومربع تكبير، ونافذة بلا، نافذة قابلة للتحريك، وأخرى لا ..
وتم تعريف كل هذه النوافذ ضمن نظام التشغيل داخل إدارة النوافذ..
في مثالنا هذا قمت باستخدام هوية النافذة: مربع تنبيه أو مربع الحوار العادي.
behind: وهي إشارة إلى النافذة التي ستكون نافذتنا خلفها مباشرة.، وفي حال أردت أن تكون نافذتك فوق كل النوافذ، اكتب هذه الكلمة: WindowPtr(-1) عندها سيقوم الأمر NewWindow بعمل ما يلزم من تفعيل نافذتك، وإزالة التفعيل من النافذة السابقة...
goAwayFlag: قيمة منطقية، والمقصود هل تريد أن تحتوي النافذة على مربع إقفال. القيمة TRUE تعني أن النافذة تحوي مربع إقفال.. والقيمة FALSE لا.
refCon: وهو مرجع النافذة الثابت : Reference Constant، وهو قيمة تحددها أنت وبرنامجك فقط.. وتستخدمها حسب الحاجة.. في مثالنا صفر..
هذا العنصر يجعل البرنامج قوي جدا ( خصوصا عند استخدام طريقة النمط القسري)
بعد أن يقوم NewWindow بإنشاء النافذة يقوم بإرجاع إشارة إليها، windowPtr ولأنك قلت : myWindow:=NewWindow... (nil)
والطرف اليمين يساوي إشارة إلى نافذتك الجديدة.. فإنك عندما ساويت الطرف اليسار (متغيرك)بالطرف اليمين أصبح يشير إلى نفس النافذة الجديدة التي تم إنشاؤها..
السطر 17:
تم تعيين الجملة Hello World للمتغير myStr، لاحظ أن الجملة في باسكال يجب أن تحاط من الطرفين ب - ' ' - في خلاف بعض اللغات الأخرى التي تستخدم قوسي التنصيص ""...
المتغير myStr من نوع Str255، أي لا يجب أن يزيد طول الجملة هنا عن 255 بايت (حرف)
السطر 18: قام بإظهار النافذة وهو على الصورة :ShowWindow(window:WindoPtr)
حيث العنصر window يعني إشارة إلى النافذة المطلوب إظهارها...
السطر 19: يقوم بتعيين ميناء الرسم الحالي، وهو في هذه الحالة نافذتنا الجديدة، وإدراة الرسم ترسم فقط على ميناء الرسم الحالي.. لذلك قمنا بتعيين نافذتنا.
وهو على النحو التالي: SetPort (port:GrafPtr); حيث port تشير إلى ميناء رسم..
والنافذة حقيقية في الواقع في نظام الماكنتوش هي منياء رسم ...
وهكذا تم تعريفها برمجيا:
WindowPtr = GrafPtr;
السطر 20:
استخدمنا الأمر TextFont وهو على الصورة:
TextFont (font:Integer);
والعنصر font هو عدد صحيح يرمز لرقم خط معين,, واستخدمنا نحن هنا أمر العملية: SystemFont والذي يعود بقيمة عدد صحيح هو قيمة رقم خط النظام الاصلي، والذي يمرر بعد ذلك للعنصر font، والذي يقوم بعد ذلك به الأمر TextFont بتجهيز هذ الخط وجعله خط ميناء الرسم الحالي..
السطر 21: يقوم بتحريك قلم إدارة الرسم إلى إحداثيات النقطة المعطاة له عن طريق عنصرينه، في ميناء الرسم الحالي :
وهو على الصورة: MoveTo (h, v: Integer);
و h تعني الإحداثي الأفقي، v تعني الإحداثي العمودي.
السطر 22 : يرسم الجملة المعطاة له في العنصر، في الموقع الحالي لقلم إدارة الرسم، باستخدام الخط الحالي وحجمه وشكله...
وهو على الصورة: DrawString(s : Str255);
والسطرين 23 و24 يطلبان من النظام الاستمرار في حلقة repeat (تكرار) حتى يتم ضغط الماوس
والأمر Button هو عملية تعود بقيمة منطقية تدل على حالة الماوس:و هو على الصورة:
Button: Boolean;
فإذا كانت القيمة المعادة هي TRUE ، فهذا يعني ان زر الماوس تم ضغطه..
وإلا فإن القيمة المعادة هي FALSE ..
والسطر 25 هو نهاية البرنامج..
كل أمر begin يحتاج أمر end ، وفي حال لم تكن end هي نهاية البرنامج ... أي يوجد end أخرى تليها، فتتبع end الأولى فاصلة منقوطة، وهكذا .. حتى تكون end الأخيرة.. تتبعها نقطة للدلالة على نهاية البرنامج.. وهذا من قواعد باسكال...
نرجو تحول النص البرمجي ليكون اتجاهه من اليسار لليمين حتى تظهر الأقواس بشكل صحيح...
هذا والحمد لله وحده ..
وصلى الله وسلم على نبينا محمد وعلى آله وصحبه وسلم أجمعين..
وسنتناول برنامج مرحبا بك أيها العالم (في نظام Xcode ) لاحقا ان شاء الله..
والسلام عليكم ورحمة الله وبركاته.
بالمناسبة أخي مسلم، ذكرت أنك كنت تعمل على لغة كيوبيسك ؟ هل تعرف هذه البرامج؟:
Gorilla.bas و Money.Bas و Nibbles.Bas و REMLINES.Bas ...
وأيضا البرامج : TORUS.BAS و SORTDEMO.BAS؟ وهذه أتت مع QB وهي النسخة المطورة من QBASIC .. التي جاءت كاملة . فيها أدوات تحويل برنامج كيوبيسك إلى EXE ؟
لقد ذكرتني بالبيسك وأيامها...
__________________
أبو بكر
|