تطبيق بسيط للويندوز موبايل 6 (سي إي) باستخدام لازروس
Submitted by Issam Ali on Sun, 12/09/2012 - 19:44المشكلة:
أحتاج إلى تطبيق يقوم بتذكيري بموعد يتكرر كل أربعة أيام مرة، التطبيق ليس بحاجة أن يعمل بشكل ساعة منبه وإنما فقط أن يقوم بإظهار إن كان هناك موعد لهذا اليوم أم لا. ولأن ذاكرتي في مثل هذه المواضيع لا يمكن الاعتماد عليها فقد كنت اعتمد على صديق يذكرني بالموعد أو اتصل به أحياناً لأسأل إن كان هناك موعد اليوم أم لا وفي كثير من الأحيان لم يكن هذا الأمر ناجحاً. لذلك قررت أن لا اعتمد على صديقي بموضوع التذكير مجدداً و قررت أن أخصص بعض الوقت لكتابة بريمج يقوم بمهمة التذكير و يجنبني ما أتعرض له من مشاكل و إحراج. البريمج كتبته بواسطة لازروس وأنا أرغب بمشاركة هذا التجربة معكم علّها تفيد على بساطتها من يرغب ببناء تطبيقات الويندوز سي إي بواسطة اللازروس.
الحل:
المشكلة بسيطة وبالطبع هناك أكثر من خيار لكتابة الحل البرمجي، ظروف المشكلة تتطلب أن يكون الحل (محمولاً) بمعنى أن يكون البريمج متوفراً بين يدي في أي مكان إذاً فليكن تطبيق موبايل. الهاتف المحمول الذي استخدمه مازال (موضة قديمة) يعمل على نظام الويندوز موبايل 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 للويندوز سي إي قد يشوه تصميم النموذج على جهاز الموبايل.
التطبيق الذي نحن بصدده هو تطبيق بسيط النموذج الرئيسي فيه سيكون على الشكل التالي:
هذا ما يلزمنا لعرض تاريخ اليوم و فيما إذا كان اليوم فيه موعد أم لا كما نعرض ليوم الغد إذا كان فيه موعد أم لا وهذا فقط ما أحتاجه وليس أكثر. لكن ومن باب الرفاهية سنضيف نموذج آخر وأضع فيه رزنامة لمعرفة وضع يوم محدد.
عملية الاحتساب هي عملية بسيطة: بما أن الموعد يتكرر كل أربعة أيام نحتاج فقط إلى تاريخ مفتاحي (تاريخ كان به موعد) ومن ثم نحتسب فرق الايام بين تاريخ معين و هذا التاريخ المفتاحي ثم نقسم فرق الأيام هذا على أربعة و حسب باقي القسمة نعرف النتيجة وفي مايلي نص وحدة الاحتساب مع ملاحظة أن استخدام الثوابت الانكليزية و التصميم leftToRight كان لغايات (تحريرية) بحتة ليس إلا، بينما نسخة التطبيق التي تعمل على جهازي الآن هي نسخة عربية وتعمل بشكل ممتاز.
{$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 ونغيير إعدادته كما في الصورة:
طبعاً قبل هذه الخطوة يجب أن تكون قد قمت بتثبيت إضافة lazarus-1.0.4-fpc-2.6.0-cross-arm-wince-w للتمكن من ترجمة التطبيق لمنصة wince . بعد إضافة نظام البناء الجديد ستلاحظ اختصاراً جديداً لزر البناء في شريط أدوات لازروس يتيح لك الأختيار بين نظامي البناء.
لم ننته بعد! الآن و ضمن نظام البناء WinCE ومن خيارات المشروع ضمن صفحة Code Generation عدل الخيارات كما في الصورة:
الآن أصبح كل شيء جاهز و يمكن بناء التطبيق و النسخة التنفيذية ستعمل على جهاز الموبايل في حال تمت الترجمة والبناء بدون أخطاء.
الاختبار:
من الأفضل دائماً تجربة التطبيق على منصة افتراضية قبل نقله إلى منصة حقيقية، والإمكانية متوفرة مع لازروس. حيث يمكننا بعد تثبيت 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 وننتظر لحين تشغيل المنصة.
بعدها ولربط المنصة الافتراضية مع الحاسب نختار من القائمة Action أمر Cradle يفترض عندها و في حال تثبيت ActiveSync بشكل صحيح أن يعمل على وصل المنصة مع ويندوز تماماً كما يحدث عند وصلنا لموبايل حقيقي مع الحاسب.
بعد الاتصال مع المنصة الافتراضية يمكننا التفاعل معها عن طريق مستعرض الويندوز Explorer و يمكننا في هذه المرحلة أن ننقل التطبيق السابق إلى المنصة و نجربه، لكن لكي نربط لازروس مع المنصة بشكل آلي (عن طريق ActiveSync) كما قلنا هناك بعض الاعدادات نعرض لها هنا.
في البداية يجب إنشاء مجلد باسم gdb في الدليل الجذر للمنصة و هو المجلد الذي سيتم نسخ التطبيق إليه.
بعد ذلك نقوم بفك ضغط منقح الـ WinCE وهو gdb-6.4-win32-arm-wince الذي قمنا بتزيله مسبقاً إلى مجلد معين على القرص الصلب للحاسب ومن ثم في لازروس ومن قائمة Tools نختار Options ثم من خيارات Debugger نغيير مسار المنقح إلى مسار منقح ال WinCE كما في الصورة
لا تنسى إعادة الإعدادات الأصلية للمنقح بعد الانتهاء من هذا المشروع أو حتى عندما تريد إعادة بناء أو تجربة نفس هذا المشروع على منصة ويندوز لأن أعدادات المنقح هي أعدادات عامة وليست خاصة بهذا المشروع فقط.
الآن عند إعطاء أمر تشغيل التطبيق في لازروس Run سيقوم لازروس بنسخ التطبيق إلى مجلد gdb على المنصة الافتراضية بالأضافة إلى ملف wince-stub.exe
ومن ثم تشغيل التطبيق على المنصة.
العملية قد تستغرق بعض الوقت لنسخ التطبيق ومن ثم تشغيله لذلك وجب التنبيه.
نشر التطبيق:
نظراً لمحدودية الموارد في أجهزة الموبايل سواء من حيث سعة التخزين أو الذاكرة يجب أن نقوم بعد الانتهاء من تنقيح التطبيق بعملية build أخيرة مع مراعاة إزالة كل ما يتعلق بالتنقيح من الملف التنفيذي النهائي للتقليل من حجم التطبيق سواء حجم التخزين أو حجمه في الذاكرة وذلك من خلال صفحة linking في خصائص المشروع نقوم بتغيير الخصائص كما في الصورة التالية:
وستلاحظ انخفاض كبير في حجم الملف الناتج، ولتوفير الوقت و جعل كل من عملية الـ build وعملية تغيير الإعدادات أكثر سهولة ربما من الافضل أن نقوم بتخزين أنظمة البناءmodes build ومن ثم التنقل بينها حسب النسخة التي نريد بنائها و وهو الأمر المتعارف عليه في الide العصرية مثل دلفي و فيجوال ستوديو فهناء نظام build للتنقيح و نظام build للإصدار( release/debug) مع إعدادات جاهزة مسبقاً للـ compiler لكن يمكن الوصول إلى هذا أيضاً مع لازروس عن طريق إضافة نظام جديد و نسميه release إلى Build Modes وفيه نزيل مايتعلق بتنقيح البرنامج لتخفيف الحجم فيما نحافظ على نفس هذه الاعدادات في نظام Debug .
وعندها يصبح بإمكاننا تغيير شكل بناء الملف التنفيذي بسهولة كما في الصورة.
ملاحظات و انطباعات:
طبعاً البريمج بسيط و هو غير كاف من حيث المنطق للحكم على صلابة أداة التطوير لازروس أو مقارنتها بأداة أخرى لكن بلا شك إن إمكانيات التخصيص الهائلة وإمكانيات التوسع و التمدد عن طريق الاضافات addons في لازروس توحي لك بالثقة، ولكن من جهة أخرى فإن عملية ربط هذه الاضافات (وتعشيقها) بلازروس قد تكون مربكة بعض الشيء بالمقارنة مع (تعشيق) أداوات التطوير الملحقة في فيجوال ستوديو مثلاً ومن ضمنها أداة التطوير لويندوز سي إي فهناك الأمر سلس وضمن حزمة واحدة تقوم بتثبيتها، ولكن السبب واضح هنا على ما أعتقد وهو أن شركة مثل مايكروسوفت لديها جيش من المبرمجين بإمكانها تخصيص مجموعة منهم للقيام بعملية تحزيم سلسة لأدواتها بينما فريق لازروس ليس لديهم هذه الرفاهية فلديهم أعمال أخرى أكثر أهمية وهم يقومون بها بشكل جيد على ما يبدو.
هذا ما يمكنني كتابته الآن عن هذه التجربة البسيطة راجياً أن يكون فيها شيء من الفائدة وأنا متأكد أنها لن تكون تجربيتي الأخيرة مع لازروس فمازال هنالك الكثير لاستكشافه.
تحميل:
مراجع:
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