• 0
omaravet

سمبيان helloworld gui

سؤال

السلام عليكم و رحمة الله و بركاته

اليوم سيكون شرح لكود برنامج helloworld basic و هو موجود مع الsdk داخل المجلد Series60Ex

كما أن الشرح موجود في ملف المساعدة الخاص بالsdk

و عند بناء البرنامج يكون بالشكل التالي

post-108008-1176849898_thumb.jpg

في البداية نلقي نظرة على ملفات المشروع

في مجلد group نجد الملفات اللازمة لبناء المشروع و هي bld.inf الذي يحدد ملفات البناء الخاصة بالمشروع و هي هنا helloworldbasic.mmp و داخل هذا الملف يتم تحديد الملفا و المكتبات اللازمة للبناء و اسم الملف النهائي الذي يتم بناؤه و نوعه

راجع الموضوع السابق

البرنامج الأول في السمبيان helloworld

الملف الثالث هو helloworldbasic.rss و هو يمثل ملف resource لأن استخدام الواجهة الرسومية قد يحتاج لتوصيف العناصر في ملف منفصل

مثلا عند عمل مشروع mfc و إضافة نافذة جدية و أضافة أزرار للنافذة هناك ملف خاص بالفيجوال ستوديو يحتوي على توصيف النافذة و مواضع العناصر المختلفة و هو ملف بامتدات rsc لكن في السمبيان نستخدم ملف بامتداد rss

و هنا نطالع بعضا من هذا الملف

RESOURCE EIK_APP_INFO
{
menubar = r_helloworldbasic_menubar;
cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
}

حيث يتم تحديد أزرار القائمة الرئيسية في البرنامج و هي هنا من نوع R_AVKON_SOFTKEYS_OPTIONS_EXIT أي أحد الأزار نوعه options يظهر قائمة و الثاني exit الكوماند الخاص به يدل على طلب الخروج من البرنامج

يجب ملاحظة أن الموضوع عنا مجمل أي الهدف هو التعرف على البرنامج بشكل عام

أما التفاصيل الدقيقة فستكون في المرات القديمة عند تناول القوائم و العناصر المختلفة

و في الكود التالي في ملف rss

RESOURCE MENU_PANE r_helloworldbasic_menu
{
items =
{
MENU_ITEM
{
command = EHelloWorldBasicCommand1;
txt = "Hello";
},
MENU_ITEM
{
command = EAknSoftkeyExit;
txt = "Exit";
}
};
}

يتم تحديد عناص القائمة و الكود المرتبط بالضغط على كل واحد منها

في النسخة المتقدمة من برنامج carbide و هي ليست مجانية يمكن عن طريق واجهة رسومية تحديد الخيارات المختلفة بطريقة سحب العناصر كما في الفيجوال ستوديو و يتم كتابة هذا الكود تلقائيا

المجلدان التالي هو مجلد inc و يحتوي على ملفات الهيدر و قد تم تحديد موضعها من خلال الملف mmp عن طريق سطر USERINCLUDE ..\inc

أي أن ملفات الهيدر موجودة خارج مجلد group مباشرة و داخل مجلد inc

و داخل مجدل inc نجد أيضا ملف بامتداد hrh و هو يحتوي على قيم الثوابت التي تستخدم في ملف rss كما في الكود التالي

enum THelloWorldBasicIds
{
EHelloWorldBasicCommand1 = 1 // start value must not be 0
};

حيث EHelloWorldBasicCommand1 يمثل قيمة الأمر الخاصة بالعنصر الأول في القائمة الذي سينتج عنه إظهار رسالة hello world

أما مجلد src فيحتوي على ملفات cpp الخاصة بالبرنامج

نلقي نظرة عامة على الكود نفسه

في ملف helloworldbasic.cpp

نجد نقطة البداية هي الدالة E32Dll و ليست e32main لأن تطبيقات الواجهة الرسومية عبارة عن ملف dll بامتداد app

هناك نقطة أخرى و هي الدالة CApaApplication* NewApplication() و هي تعيد مؤشر للكلاس الأساسي للتطبيق

و الكود كما يلي

// DLL entry point, return that everything is ok
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
{
return KErrNone;
}


// Create an application, and return a pointer to it
EXPORT_C CApaApplication* NewApplication()
{
return (static_cast<CApaApplication*>(new CHelloWorldBasicApplication));
}

يمكن الاطلاع على الكود في الsdk

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

5 إجابة على هذا السؤال .

  • 0

شكراً أخ omaravat والله يعطيك العافيه ،

انا بشتغل على السيمبيان منذ فتره مش بسيطه ولكن اشتغلت عملي لمده شهر فقط من 13-2-2007 - 13-3-2007 ومن ثم رجعت على النظري لاني الان بحضر لامتحان ال ASD .

فحاب أسالك :- هل انت حاصل على الشهادة او ماذا بتعرف عن الامتحان ،

انا حاب اضيف Tutorial بتشرح فيها عن السيمبيان وشهادتها . ولكن كنصيحه أخويه للاعضاء الي حاب يتعلم هذه اللغه لازم يكون عنده نفس طويل ، يعني انا بتوقع عايز 3 شهور بس عشان تفهم المبادى ومش فهم كامل كمان ،

ولكن بالنهاية اي واحد عنده معلومات عن الامتحان يفيدني و حالياً انا معنديش تعقيب على موضوعك لانه بصراحه موضوع حلو وقيم وكتابه الموضوع دقيقه ،

ان شاء الله بتستمر معنا وانا ان شاء الله عساعدك بس اول 20 يوم ابذل جهد لانه كما قلت سابقاً بحضر للأمتحان ز

ASDPresentation.pdf

ASD.doc

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم و رحمة الله و بركاته

قد بدأنا نتكلم عن برنامج helloworld basic و عرفنا أن التطبيقات ذات الواجهة الرسومية ليست إلا ملفات dll بامتداد app لذلك سيكون الكلام هذه المرة عن الdll في السمبيان بالتفصيل

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

مثلا من أشهر برامج السبمبيان العربية مثلا برنامج مواقيت الصلاة

فلو تخيلنا أن هناك مبرمج مسئول عن الواجهة الرسومية و الآخر مسئول عن حسابات مواقيت الصلاة

فلو كتبنا الحسابات في صورة كود ملف h و ملف cpp ستكون النتيجة لبناء البرنامج إعطاء هذه الملفات للمبرمج المسئول عن الواجهة ليضعها ضمن الكود الخاص بالبرنامج

أما لو وضع في صورة dll يمكن استخدامها فيما بعد و بناؤها بطريقة منفصلة و العمل على تطوير الجانب الرسومي و الجانب الحسابي بصور منفصلة ليصبح لدينا ملف app مسئول عن الواجهة و ملف dll به طريقة الحساب و للتطوير يتم التعديل في منهم بصورة منفصلة

ملفات ال dll في السمبيان نوعان الأول

static interface dll

هو يمثل معظم ملفات الdll الخاصة بالنظام و المحتوية على الapi الأساسية مثل euser و هو عبارة عن مجموعة دوال يمكن استخدامها من داخل الdll و يتم ربطها بالبرنامج بأسلوب مباشر أثناء البرمجة عن طريق ملفات ال h و lib الخاصة بال dll لذلك عند بدء البرنامج يتم تحميل هذه الملفات في الذاكرة و تكون جاهزة عند طلب أية دالة عند طلب أية دالة و يتم حذفها من الذاكرة في حالة عدم وجود تطبيق أو عملية تستخدمها لذلك هي مرتبطة بالتطبيق فعندما نقوم ببدأ ملف app يعتمد على dll لكنه غير موجود يفشل تنفيذ البرنامج و إن لم يستخدمها في البداية

و هناك مثال داخل ال sdk اسمه staticdll يحتوي على كود dll و كود لملف Exe يستخدمه و هو داخل مجلد Examples\basics\staticdll

و هذا كود ملف ال h

IMPORT_C static CMessenger* NewLC(CConsoleBase& aConsole, const TDesC& aString);
// Destructor - virtual and class not intended
// for derivation, so not exported
~CMessenger();
// general functions - exported
IMPORT_C void ShowMessage();

نلاحظ هنا الميكرو IMPORT_C و هو هنا يدل على أن كود هذه الدالة سيتم استدعاؤها من ملف خارجي و هو ملف ال dll

أما في كود ملف ال cpp

EXPORT_C CMessenger* CMessenger::NewLC(CConsoleBase& aConsole, const TDesC& aString)
{
CMessenger* self=new (ELeave) CMessenger(aConsole);
CleanupStack::PushL(self);
self->ConstructL(aString);
return self;
}

EXPORT_C void CMessenger::ShowMessage()
{
_LIT(KFormat1,"%S\n");
iConsole.Printf(KFormat1, iString); // notify completion
}
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
// DLL entry point
{
return(KErrNone);
}

نلاحظ الميكرو EXPORT_C الذي يسمح باستدعاء هذا الكلاس او هذه الدال من خارج الdll

نأتي للنوع الثاني من ملفات الdll

polymorphic dll

و هي ملفا dll لا يتم ربطها مباشرة بالتطبيقات إنما عند الحاجة إليها يتم استدعاء الأمر load الخاص بالكلاس Rlibrary حيث يتم تحديد اسم و مكان ملف ال dll و مسمى polymorphic يأتي من أن هذه الملفات تعتمد على تصدير interface أي كلاس خال يتم الوراثة منه فيما بعد لذلك نفس الإنترفيس يمكن أي يقوم بوظائف مختلفة بعكس static interface dll لا يسمح بوجود دالتين بنفس الاسم و التطبيقات الرسومية من هذا النوع

مثلا لدينا الدالة NewApplication تقوم بإعادة مؤشر لكلاس من نوع CApaApplication لكن في كل المرة تعيد مؤشر لكلاس يرث منه في برنامجنا مثلا CHelloWorldBasicApplication

و في أي برنامج آخر سيعيد الكلاس المسئول عن بدء البرنامج و يقوم بوظائف مختلفة لذلك فإن تنفيذ الملف من نوع app يتم عن طريق استدعاء الكرنل الخاص بالنظام كملف dll عن طريق الدالة Load في الكلاس Rlibrary كما في الكود التالي

RLibrary library;
library.Load(appname);

هناك نقطة أخيرة و هي

أن بعض ملفات ال dll موجودة على شريحة ال rom الخاصة بالجهاز و هي ملفات النظام الأساسية التي تأتي مع الجهاز عند خروجه من المصنع عند استدعاء دوال من هذه الملفات لا يتم تحميلها في ذاكرة الرام إنما يتم قراءتها من مكانها على الروم و كأنه ذاكرة مؤقتة لتوفير المساحة على الذاكرة و يكون لدى كل تطبيق من التطبيقات المستخدمة لهذه المكتبة مؤشر لمكانها على الروم لذلك يتم تنفيذ الدوال في موضعها على الشريحة

يمكن مراجعة الروابط التالية

http://developer.uiq.com/devlib/uiq_31/SDK...Code.guide.html

http://newlc.com/Writing-a-DLL.html

http://www.symbian.com/developer/techlib/v...ries/index.html

تم تعديل بواسطه omaravet
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الله يعطيك العافية : -

والله ما قصرت يا أخ عمر الله يوفقك وربنا ما يحرمنا من دروسك

وان شاء الله كل يوم بنشوف 100 درس -waf

بس يا ريت لو تكرمت يا اخ عمر انك تفصل بالتفصيل الكامل للموضوع لانه انت بتعرف انه انا بحضر للأمتحان

والسلام عليكم ورحمة الله وبركاته

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

عرفنا أن البرامج ذات الواجهة الرسومية عبارة عن ملف dll من نوع polymorphic يحتوي على entry point و هي E32DLL و يصدر دالة NewApplication التي تعيد الكلاس الخاص بالبرنامج الذي سيبدأ العمل و يتم استدعاء كلا الدالتين من خلال الكرنل

سنبدأ من كلاس CHelloWorldBasicApplication و هو يرث من كلاس CAknApplication الذي يرث من كلاس CApaApplication الذي يحتوي على داليتين أساسيتين الأولى هي AppDllUid و هي تعيد قيمة تمثل رقم متفرد لكل تطبيق ليتم تميزه عند تحميله في الذاكرة و هو معرف في ملف الهيدر كما يلي

const TUid KUidHelloWorldBasicApp = {0x10005B91};

أما الدالة فمعرفة ما يلي

TUid CHelloWorldBasicApplication::AppDllUid() const
{
return KUidHelloWorldBasicApp;
}

أما الثانية فهي CreateDocumentL حيث تعيد مؤشر لكلاس من نوع CAknDocument و هو ثاني كلاس يقابلنا في البرنامج و سيأتي شرحه

و الدالة معرفة كما يلي

CApaDocument* CHelloWorldBasicApplication::CreateDocumentL()
{
return (static_cast<CApaDocument*>(CHelloWorldBasicDocument::NewL(*this)));
}

هذا كل ما نحتاجه من كلاس CApaApplication و للمزيد

http://www.symbian.com/developer/techlib/v...ationClass.html

كلاس CHelloWorldBasicDocument الذي يرث من كلاس CAknDocument و هو يرث من CApaDocument و هذا الكلاس يمثل التعامل مع الداتا الأساسية للبرنامج لذلك نحتاجه عند الرغبة في تتخزين الحالة التي كان عليها البرنامج في آخر مرة و استرجاعها عند التشغيل في المرة التالية و لمن اعتاد على البرمجة باستخدام MFC و أنشأ مشروع من نوع multidocument سيعرف أن كل view في المشروع يقابله كلاس من نوع document للاحتفاظ بالبيانات عن طريق الدوال serialize و deserialize و في حالتنا هنا الدوال ٍStorel و Restorel و هي غير موجودة في البرنامج الحالي لأننا لن نحتاج لتخزين البيانات و لكن الدالة الأساسية و هي CreateAppUiL التي تعيد مؤشر للكلاس التالي و هو من نوع CEikAppUi و باقي الدوال تستخدم لبدأ الكلاس و هي newl newlc constructl

و الدالة تعرف كالتالي

CEikAppUi* CHelloWorldBasicDocument::CreateAppUiL()
{
return (static_cast <CEikAppUi*> (new (ELeave) CHelloWorldBasicAppUi));
}

للمزيد

http://www.symbian.com/developer/techlib/v...umentClass.htmlكلاس CHelloWorldBasicAppUi الذي يرث من CEikAppUi قد يعتقد من اسم ui أن يحتوي على الواجهة الرسومية لكن لا يحتوي على عناصر رسومية لكنه هو المسئول عن التفاعل مع المستخدم من ناحية التعامل مع لوحة المفاتيح و الاستجابة للأوامر التي يقوم باختيارها المستخدم من القائمة الخاصة بالبرنامج و هذا يتمثل في الدالة التالية HandleCommandL حيث تأخذ متغير يمثل قيمة عنصر القائمة الذي تم اختياره المحدد سابقا في ملف rss و الدالة كالتالي

 void CHelloWorldBasicAppUi::HandleCommandL(TInt aCommand)
{
switch(aCommand)
{
case EEikCmdExit:
case EAknSoftkeyExit:
Exit();
break; case EHelloWorldBasicCommand1:<BR> {
_LIT(message,"Hello World Basic");
CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;
informationNote->ExecuteLD(message);
}
break;
default:
Panic(EHelloWorldBasicUi);
break;
}
}

نلاحظ في حالة EEikCmdExit أو EAknSoftkeyExit و هي قيم عنصر القائمة اليمين أو عنصر القائمة الذي يحتوي على خيار exit يتم الخروج من البرنامج أم في حالة القيمةEHelloWorldBasicCommand1 الخاصة بعنصر القائمةhello يتم إظهار الرسالة التي تحتوي على hello world عن طريق الكلاس المسمى CAknInformationNote الذي يشابه messagebox في الmfc

كما في بداية إنشاء الكلاس في الدالة ConstructL نلاحظ إنشاء الشاشة الرئيسية للبرنامج عن طريق الكود التالي

 void CHelloWorldBasicAppUi::ConstructL()
{
BaseConstructL(EAknEnableSkin);
iAppView = CHelloWorldBasicAppView::NewL(ClientRect());
AddToStackL(iAppView);
}

للمزيد

http://www.symbian.com/developer/techlib/v..._CEikAppUi.html

الكلاس CHelloWorldBasicAppView الذي يرث من CCoeControl و هو يمثل الشاشة الفعلية للبرنامج حيث يمكن وضع العناصر الرسومية المختلفة بل الرسم على الشاشة مباشرة عن طريق الدالة Draw و هي كالتالي

void CHelloWorldBasicAppView::Draw(const TRect& /*aRect*/) const
{
// Get the standard graphics context
CWindowGc& gc = SystemGc();
// Gets the control's extent
TRect rect = Rect();
// Clears the screen
gc.Clear(rect);
}

حيث الكود gc.Clear(rect); يقوم بملء الشاشة باللون الافتراضي و هو الرمادي

للمزيد

http://www.symbian.com/developer/techlib/v...ntrolClass.html

في المرات القادمة سيتم توضيح كيفية وضع العناصر الرسومية المختلفة

أما الحلقة الأخيرة في شرح البرنامج فهي كيفية بناء البرنامج و استخدام carbide في بنائه و عمل ملف sis لتنصيبه على الجهاز

و الملف التالي عبارة عن مجموعة شرائح توضح بنية البرنامج في السمبيان

Symbian_7_1_.ppt

تم تعديل بواسطه omaravet
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الله يعطيك العافية يا أخ عمر

بس هل في امكانيه موضوع ال Platform Security لانه بصراحه بديت اقرا فيه وحسيت انه موضوع غامض جداً (شبتر 15 ) بالكتاب

وجزاك الله كل خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .