تطبيق بسيط للويندوز موبايل 6 (سي إي) باستخدام لازروس

المشكلة:

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

الحل:

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

إعداد بيئة العمل:

يلزمنا لبناء تطبيق ويندوز سي إي بالإضافة إلى نسخة لازروس إضافة خاصة لمعالجات ال arm وهي  lazarus-1.0.4-fpc-2.6.0-cross-arm-wince-w ويمكن تحميل الاثنين من هذا الرابط:
http://sourceforge.net/projects/lazarus/files/Lazarus%20Windows%2032%20bits/Lazarus%201.0.4/
لتجريب أو لتنقيح التطبيق على الحاسب نحتاج إلى محاكي أجهزة موبايل الويندوز بأحد إصدارته وأن قد اخترت Standalone Device Emulator 1.0 with Windows Mobile OS Images ويمكن تحميله من هذا الرابط:
http://www.microsoft.com/en-us/download/details.aspx?id=20259
أيضاً يلزمنا لعملية ربط أوتوماتيكي للمحاكي مع بيئة لازروس أداة ActiveSync ويمكن تحميلها من هنا:
http://www.microsoft.com/en-us/download/details.aspx?id=15
مع الانتباه إلى أن هذه الاداة تعمل على أنظمة XP sp2 وما قبل
من أجل تنقيح التطبيق بشكل مباشر على المحاكي نحتاج إلى منقح خاص بمعالجات arm وهو gdb-6.4-win32-arm-wince ويمكن تحميله من هنا
ftp://ftp.freepascal.org/pub/fpc/contrib/cross/gdb-6.4-win32-arm-wince.zip

بناء التطبيق:

بعد تثبيت الأدوات السابقة ما عدا إضافة المنقح التي لا تحتاج لتثبيت بل تحتاج فقط  إلى ربط مع لازروس. يمكن البدأ بكتابة التطبيق مع الإشارة إلى وجود ثغرة معروفة في وحدة winsock.pp مما ستدعي تصحيحها في حال كانت مستخدمة ضمن التطبيق للمزيد حول الموضوع يمكن مراجعة الرابط http://bugs.freepascal.org/view.php?id=13614
الاستراتجية التي اتبعتها في بناء التطبيق (وهي بديهية على ما أعتقد) كانت أن أصمم التطبيق و أتأكد من عمله بشكل جيد في بيئة ويندوز win32  قبل إعادة بناء التطبيق واختباره على منصة WinCE وكانت سلاسة العمل وفق هذه الاستراتجية و سهولة الانتقال بين منصة ومنصة أخرى مثير للإعجاب و نقطة تسجل لصالح لازروس.
لا يختلف انشاء تطبيق WinCE عن أي تطبيق آخر وبالنسبة لتصميم النماذج (الواجهات) أيضاً الأمر لا يختلف كثيراً فقط يجب الأخذ بعين الاعتبار أبعاد شاشة الموبايل و اختلاف رسم المكونات نتيجة اختلاف الـ api للويندوز  سي إي. أما في حال استخدام اللغة العربية و الواجهة العربية (من اليمين لليسار) فيتطلب الأمر مزيد من الانتباه لأبعاد المكونات و طريقة تموضعها على النموذج لأن اختلاف api للويندوز سي إي قد يشوه تصميم النموذج على جهاز الموبايل.
التطبيق الذي نحن بصدده هو تطبيق بسيط النموذج الرئيسي فيه سيكون على الشكل التالي:
main_form_design

هذا ما يلزمنا لعرض تاريخ اليوم و فيما إذا كان اليوم فيه موعد أم لا كما نعرض ليوم الغد إذا كان فيه موعد أم لا وهذا فقط ما أحتاجه وليس أكثر. لكن ومن باب الرفاهية سنضيف نموذج آخر وأضع فيه رزنامة لمعرفة وضع يوم محدد.
calenderForm_design

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

unit uCalc;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, dateutils;
  procedure CheckDate(aDate: TDateTime; out alarm: Boolean; out daysDelta: Integer);

const

  //الموعد يتكرر كل 4 أيام
  //هذا يوم مفتاحي يتم القياس عليه
  //باعتبار أنه كان يوم موعد
  STR_KEY_DATE = '4/12/2012';

  //ثوابت الرسائل
  STR_OK = 'Ok';
  STR_ALARM = 'Alarm';
  STR_TODAY = 'Today: ';
  STR_TOMOROW = 'Tomorow: ';

implementation


procedure CheckDate(aDate: TDateTime; out alarm: Boolean; out daysDelta: Integer);
var
   dtKey: TDateTime;
   days: Integer;
Begin
  dtKey:= StrToDate(PChar(STR_KEY_DATE), Length(STR_KEY_DATE), 'd/mm/yyyy', '/');
  days := DaysBetween(dtKey, aDate);
  daysDelta := days mod 4;
  alarm := daysDelta = 0;
end;

end.

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

الترجمة إلى WinCE :

لكي نحافظ على إمكانية إعادة بناء نفس المشروع على Win32 مجدداً سنقوم بإنشاء نظام ترجمة جديد Build Mode خاص ب WinCE و نحافظ على النظام القديم (الحالي) Default و هو الخاص ب Win32 ، ولعمل هذا الأمر :
من خصائص المشروع نختار صفحة build modes ونضيف نظام جديد نسميه WinCE ونغيير إعدادته كما في الصورة:
new_mode_wince

طبعاً قبل هذه الخطوة يجب أن تكون قد قمت بتثبيت إضافة lazarus-1.0.4-fpc-2.6.0-cross-arm-wince-w للتمكن من ترجمة التطبيق لمنصة wince . بعد إضافة نظام البناء الجديد ستلاحظ اختصاراً جديداً لزر البناء في شريط أدوات لازروس يتيح لك الأختيار بين نظامي البناء.
build_toolbar_button

لم ننته بعد! الآن و ضمن نظام البناء WinCE ومن خيارات المشروع ضمن صفحة Code Generation عدل الخيارات كما في الصورة:
code_generation_options

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

الاختبار:


من الأفضل دائماً تجربة التطبيق على منصة افتراضية قبل نقله إلى منصة حقيقية، والإمكانية متوفرة مع لازروس. حيث يمكننا بعد تثبيت  Standalone Device Emulator 1.0  ببساطة تشغيل أحد المنصات الافتراضية لـ WinCE (يفضل أن تكون بذاكرة 128 ميغا بايت) ومن ثم نقل التطبيق إليها بواسطة ActiveSync كما نقوم بذلك مع أي موبايل ومن ثم نقوم بتجريب التطبيق على هذه المنصة (الجهاز) الافتراضية. لكن أيضاً لازروس (و أسوةً ببقية أدوات التطوير المتحضرة) يقدم لنا خيار لإمكانية أتمتة عملية النقل و التشغيل إلى وعلى المنصة الافتراضية مع إمكانية التنقيح أيضاً و لكن الأمر بحاجة إلى بعض الاعدادات وفيما يلي عرضها.
بعد أن نكون ثبتنا  Standalone Device Emulator 1.0 و ActiveSync بننجاح نشغل برنامج Device Emulator Manager ومن ضمن قائمة المنصات الافتراضية نختار واحدة من المنصات مثلاً  USA Windows Mobile 5.0 Pocket PC R2 Emulator (منصة بذاكرة 128 ميغا)  ثم من قائمة Action نختار Connect وننتظر لحين تشغيل المنصة.
device_emulator1
بعدها ولربط المنصة الافتراضية مع الحاسب نختار من القائمة Action أمر   Cradle  يفترض عندها و في حال تثبيت ActiveSync بشكل صحيح أن يعمل على وصل المنصة مع ويندوز تماماً كما يحدث عند وصلنا لموبايل حقيقي مع الحاسب.
activeSync1
بعد الاتصال مع المنصة الافتراضية يمكننا التفاعل معها عن طريق مستعرض الويندوز Explorer و يمكننا في هذه المرحلة أن ننقل التطبيق السابق إلى المنصة و نجربه، لكن لكي نربط لازروس مع المنصة بشكل آلي (عن طريق ActiveSync) كما قلنا هناك بعض الاعدادات نعرض لها هنا.
في البداية يجب إنشاء مجلد باسم gdb في الدليل الجذر للمنصة و هو المجلد الذي سيتم نسخ التطبيق إليه.
gdb_dir
بعد ذلك نقوم بفك ضغط منقح الـ WinCE وهو  gdb-6.4-win32-arm-wince الذي قمنا بتزيله مسبقاً إلى مجلد معين على القرص الصلب للحاسب ومن ثم في لازروس ومن قائمة Tools نختار Options ثم من خيارات  Debugger نغيير مسار المنقح إلى مسار منقح ال WinCE كما في الصورة
arm_debugger
لا تنسى إعادة الإعدادات الأصلية للمنقح بعد الانتهاء من هذا المشروع أو حتى عندما تريد إعادة بناء أو تجربة نفس هذا المشروع على منصة ويندوز لأن أعدادات المنقح هي أعدادات عامة وليست خاصة بهذا المشروع فقط.
الآن عند إعطاء أمر تشغيل التطبيق في لازروس Run  سيقوم لازروس بنسخ التطبيق إلى مجلد gdb على المنصة الافتراضية بالأضافة إلى ملف wince-stub.exe
gdb_dir2
ومن ثم تشغيل التطبيق على المنصة.
app1  app2
العملية قد تستغرق بعض الوقت لنسخ التطبيق ومن ثم تشغيله لذلك وجب التنبيه.

نشر التطبيق:

نظراً لمحدودية الموارد في أجهزة الموبايل سواء من حيث سعة التخزين أو الذاكرة يجب أن نقوم بعد الانتهاء من تنقيح التطبيق بعملية build أخيرة مع مراعاة إزالة كل ما يتعلق بالتنقيح من الملف التنفيذي النهائي للتقليل من حجم التطبيق سواء حجم التخزين أو حجمه في الذاكرة وذلك من خلال صفحة linking في خصائص المشروع نقوم بتغيير الخصائص كما في الصورة التالية:
linking_options

وستلاحظ انخفاض كبير في حجم الملف الناتج، ولتوفير الوقت و جعل كل من عملية الـ build وعملية تغيير الإعدادات أكثر سهولة ربما من الافضل أن نقوم بتخزين أنظمة البناءmodes  build ومن ثم التنقل بينها حسب النسخة التي نريد بنائها و وهو الأمر المتعارف عليه في الide   العصرية مثل دلفي و فيجوال ستوديو فهناء نظام build للتنقيح و نظام build للإصدار( release/debug) مع إعدادات جاهزة مسبقاً للـ compiler لكن يمكن الوصول إلى هذا أيضاً مع لازروس عن طريق إضافة نظام جديد و نسميه release إلى Build Modes  وفيه نزيل مايتعلق بتنقيح البرنامج لتخفيف الحجم فيما نحافظ على نفس هذه الاعدادات في نظام Debug .


release_mode

وعندها يصبح بإمكاننا تغيير شكل بناء الملف التنفيذي بسهولة كما في الصورة.


choose_build_mode

ملاحظات و انطباعات:

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

تحميل:

النص المصدري

المقال بصيغة pdf

مراجع:

http://en.wikipedia.org/wiki/Windows_CE
http://www.elevatesoft.com/articles?action=view&category=edb&article=elevatedb_and_lazarus_windows_ce_mobile_build_notes
http://wiki.freepascal.org/Windows_CE_Interface

التعليقات

ممتاز مبرمج عربي جديد على اللازاروس :D أعتقد انك تعبت في البداية حتى استطعت ان تجعله يعمل على WinCE لكنها تجربة جملية تستحق. في المستقبل أظن أننا نستطيع أن نجعله يعمل في نظام اندرويد أيضا.

نعم كان هناك شيء من الصعوبة في فهم (عقلية) اللازروس خصوصاً كوني مبرمج دلفي (عتيق). من الواضح أن اللازروس بيئة تطوير توحي بالثقة للوافدين الجدد وأنا منهم. لكني لا أستطيع القول أنني مبرمج لازروس بعد.
تجربة الاندرويد ربما تكون موضوع مقال جديد عندما أحدث جهازي :D

إضافة تعليق جديد