Tammam Koujan

Welcome to my world

Archive for the ‘الأجهزة الكفية Pocket PC’ Category

Su Doku هيا بنا نبرمج لعبة

Posted by tammamkoujan on July 26, 2007

Su Doku هيا بنا نبرمج لعبة

بسم الله الرحمن الرحيم
Su Doku
ماذا ستتعلم من هذا الدرس :

اولا ستحصل على لعبة Su Doku مجانية ( و هو الاهم في رأيي )
كما انك ستتعلم كيفية انشاء اداتك اخاصة و برمجة خصائصها و احداثها و التعامل معها و التعامل مع الجموعات Collections إضافة إلى تعلمك كيفية انشاء الرسوم على النموذج كل هذا يتم من خلال تطبيق للـ Pocket Pc رغم انني راعيت ان يعمل التطبيق على Pc و Pocket Pc فلا داعي للقلق اذا لم يكن لديك Pocket Pc أو كانت هناك مشكلة مع المحاكي المتاح مع اللغة

هذا الدرس مطبق على :
- Microsoft Visual Studio .NET 2005
- Windows XP Professional SP2
مقدمة :

انا من الذين يؤمنون انه لتتعلم أي شيء يجب ان تستمتع فيما تتعلمه و في البرمجة بالذات المتعة في العمل هي الحافز للمتابعة و النشاط ( هذا ليس رأيك أنت ! حسنا انا اعبر عن رأيي الخاص و على فكرة من الذي اخذ رأيك )
لذا عندما قررت ان ابدا مع برمجة الكائنات في اطار عمل .NET Framework قررت ان ابرمج لعبة صغيرة حسنا فكرت ما هي اللعبة ؟ لا يوجد اية فكرة … اه فكر مرة ثانية ! لا يوجد
عندها ضربت رأسي بالحائط فسقط فكرة صغيرة اه انها لعبة Su Doku
ما هي لعبة Su Doku هي لعبة يابانية يمكن ان نشبهها بالكلمات المتقاطعة لكن لا يوجد احرف و انما ارقام
كيف تلعب : عليك أن تضع في كل حقل فارغ أحد الأرقام من 1 إلى 9 بحيث لا تستخدم الرقم نفسه أكثر من مرة واحدة في كل
خلية مؤلفة من 3*3 مربعات و ألا تستخدم الرقم نفسه أكثر من مرة واحدة في نفس الصف العمودي أو الأفقي الممتد من طرف الشبكة
إلى طرفها المقابل .

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

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

هذا يكفي كبداية و من ثم سنتوسع في تفاصيل الكائن

الان شغل Visual Studio .NET و اذهب إلى القائمة File و انقر New تظهر نافذة كما في الصورة ادناه

قم باختيار مشاريع Visual Basic .NET و انتق من Smart Device ان تنشأ Device Application

سم المشروع Su-Duko و انقر موافق .

من النافذة Solution Eplorer انقر باليمين على المشروع و اختر ADD و من ثم انقر على User Control سم الكائن MyPanel و من ثم انقر موافق
سيضاف كائن إلى المشروع , بعد اضافة الكائن انتقل إلى محرر الشيفرة الخاص بالكائن

انسخ الشيفرة التالية و ضعها عوضا عن الشيفرة الموجودة في المحرر

Public Class MyPanel

Private m_X As Integer
Public Property X() As Integer
Get
Return m_X
End Get
Set(ByVal value As Integer)
m_X = value
End Set
End Property
Private m_Y As Integer
Public Property Y() As Integer
Get
Return m_Y
End Get
Set(ByVal value As Integer)
m_Y = value
End Set
End Property

Private m_IsSelected As Boolean = False
Public Property IsSelected() As Boolean
Get
Return m_IsSelected
End Get
Set(ByVal value As Boolean)
m_IsSelected = value
End Set
End Property

Private m_Hold As Boolean = False
Public Property Hold() As Boolean
Get
Return m_Hold
End Get
Set(ByVal value As Boolean)
m_Hold = value

End Set
End Property
Public m_BackColor As Color

‘ Public Overrides Property BackColor() As Color
‘ Get
‘ Return m_BackColor
‘ End Get
‘ Set(ByVal value As Color)
‘ m_BackColor = value
‘ End Set
‘End Property

Enum MyPanelValue
Null = 0
One = 1
Two = 2
Three = 3
Four = 4
Five = 5
Sex = 6
Seven = 7
Eight = 8
Nine = 9
End Enum

Private m_Value As MyPanelValue = MyPanelValue.Null
Public Property Value() As MyPanelValue
Get
Return m_Value
End Get
Set(ByVal value As MyPanelValue)
m_Value = value
End Set
End Property
Enum Group
Null = 0
One = 1
Two = 2
Three = 3
Four = 4
Five = 5
Sex = 6
Seven = 7
Eight = 8
Nine = 9
End Enum
Private m_MyGroup As Group
Public Property MyGroup() As Group
Get
Return m_MyGroup
End Get
Set(ByVal value As Group)
m_MyGroup = value
End Set
End Property

Public Sub New()

‘ This call is required by the Windows Form Designer.

InitializeComponent()

‘ Add any initialization after the InitializeComponent() call.

m_X = -1
m_Y = -1
m_MyGroup = Group.Null
End Sub
Public Sub New(ByVal ValueX As Integer, ByVal ValueY As Integer)

‘ This call is required by the Windows Form Designer.

InitializeComponent()

‘ Add any initialization after the InitializeComponent() call.

m_X = ValueX
m_Y = ValueY
m_MyGroup = Group.Null
End Sub

Private Sub IncreaseValue()
If m_IsSelected = True And (Hold = False) Then
If m_Value < 9 Then
m_Value += 1
Else
m_Value = 0
End If
Else
m_IsSelected = True
End If

Me.Refresh()
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

‘ Dim FontFamily As New FontFamily(“Tahoma”)

Dim myFont As New Font(“Tahoma”, Me.Width / 3, FontStyle.Bold)
Dim myPoint As New Point(5, 70)
Dim solidBrush As New SolidBrush(Color.FromArgb(0, 0, 255))
Dim fs As SizeF = e.Graphics.MeasureString(m_Value, myFont)
If m_Value = MyPanelValue.Null Then
e.Graphics.DrawString(“”, myFont, solidBrush, 4, 4)
Else

‘ e.Graphics.DrawString(m_Value, myFont, solidBrush, 4, 4)

e.Graphics.DrawString(m_Value, myFont, solidBrush, _
((Me.Width – fs.ToSize().Width) / 2), _
((Me.Height – fs.ToSize().Height) / 2) _
)

End If

End Sub

Private Shadows Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
Me.Focus()
IncreaseValue()
Dim RowPanel As New MyPanels
Dim ColPanel As New MyPanels
Dim GroupPanel As New MyPanels
Dim h As MyPanel
Try

For Each h In Me.Parent.Controls
If Me.X = h.X Then
RowPanel.Add(h)
End If
If Me.Y = h.Y Then
ColPanel.Add(h)
End If
If (Me.MyGroup = h.MyGroup) Then
GroupPanel.Add(h)
End If
Next

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
RowPanel.Check(Me)
ColPanel.Check(Me)
GroupPanel.Check(Me)
End Sub
Private Shadows Sub GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.GotFocus
m_BackColor = Me.BackColor
If m_Hold = False Then
Me.BackColor = Color.Fuchsia
End If

End Sub
Private Shadows Sub LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.LostFocus
m_IsSelected = False

‘ Me.BackColor = Color.Coral

If m_Hold = False Then
Me.BackColor = m_BackColor ‘Color.Coral
Else
Me.BackColor = Color.LightGray
End If
End Sub

End Class
Public Class MyPanels
Inherits CollectionBase

Public Sub Add(ByVal PanelToAdd As MyPanel)
List.Add(PanelToAdd)
End Sub

Public Sub Remove(ByVal PanelToRemove As MyPanel)
List.Remove(PanelToRemove)
End Sub

‘ Indexer for MyPanels

Public Property MyPanel(ByVal Index As Byte) As MyPanel
Get
Return Me.List(Index)

End Get
Set(ByVal value As MyPanel)
Me.List(Index) = value
End Set
End Property

Public Sub Check(ByRef CheckPanel As MyPanel)

For i As Integer = 0 To Me.Count – 1
If (CheckPanel.Value Su_Doku.MyPanel.MyPanelValue.Null) And (Me.MyPanel(i).Value = CheckPanel.Value) Then
Me.MyPanel(i).BackColor = Color.Red
CheckPanel.BackColor = Color.Red
Else
Me.MyPanel(i).BackColor = Color.Coral
End If
Next

End Sub
End Class

الان إلى شرح الشيفرة السابقة
• المتحول m_X يخزن هذا المتحول قيمة تمثل السطر الذي يتواجد فيه الكائن
• الخاصية X يتم من خلالها اسناد و استرجاع قيمة المتحول m_X
نلاحظ ان المتحول من نوع Private لإننا لا نريد للمستخدم الوصول إليه إلا من خلال الخاصية و التي من نوع Public مما يتيح لنا القيام بعمليات معينة عند قراءة او كتابة قيمة في المتحول من خلال خاصيته عند الحاجة
• المتحول m_Y يخزن هذا المتحول قيمة تمثل العمود الذي يتواجد فيه الكائن
• الخاصية Y يتم من خلالها اسناد و استرجاع قيمة المتحول Y_m
• المتحول m_IsSelected متحول بولياني يحدد فيما اذا كان الكائن محددا او لا
لن أشرح الخاصيات لانها كما ذكرت فقط لاسناد القيم او الحصول عليها من المتحولات
• المتحول m_Hold متحول بولياني يحدد فيما اذا كانت قيمة الكائن مثبتة ام لا ( أي ان قيمة الكائن مجمدة لا يمكن تغييرها عندما يكون المتحول True يستفاد من ذلك من اجل تبيت قيم عند بدء اللعبة مما يحدد درجة صعوبتها
• البنية MyPanelValue التي تحوي القيم اتي يجب ان يأخذها الكائن فقط
• المتحول m_Value الذي يخزن قيمة الكائن و يأخذ قيمه من البنية السابقة
• البنية Group التي تحوي المجموعة التي ينتمي إليها الكائن في Su Doku هناك تسع مجموعات اما المجموعة العاشرة Null فهي قيمة تمهيدية تعطى للكائن عند انشاءه
• المتحول M_MyGroup الذي يخزن المجموعة التي ينتمي إليها الكائن و يأخذ قيمه من البنية السابقة
• الباني New يستخدم الباني لإنشاء الكائن مع تمهيده بالقيم المناسبة حيث يأخذ افتراضيا قيمة -1 للسطر و -1 للعمود أي انه لا ينتمي لأية سطر أو عمود كما يتم تمهيد المجموعة عند القيمة Null أي انه لا ينتمي لأي مجموعة
• الباني المحمل بشكل زائد New() يتم من خلال هذا الباني انشاء كائن يتم تمهيد سطره و عموده من خلال القيم الممررة له .
• الاجرائية IncreaseValue تقوم هذه الدالة بتغيير قيمة الكائن عند النقر عليه .
• الاجرائية OnPaint التي تقوم برسم الكائن نلاحظ ان الكلمة Overrides تجعل هذه الدالة تهيمن على الحدث OnPaint الخاص بالكائن كما ان عملية الرسم تجعل النص الذي يعرض قيمة الكائن يرسم في وسط الكائن و بحجم يتناسب مع تغير حجم الكائن .

قبل المتابعة في شرح بقية الأجرائيات دعونا ننتقل إلى الصنف MyPanels الذي تم التصريح عنه في القسم الاخير من الشيفرة
نلاحظ العبارة Inherits CollectionBase التي تشير إلى وراثة هذه الفئة للفئة CollectionBase
تستخدم الفئة MyPanels كمخزن لعناصر MyPanel حيث يتم تجميع العناصر ضمن كائن من هذه الفئة

تحتوي الفئة MyPanels على الطرائق التالية :
• الإجرائية Add : تقوم هذه الإجرائية بإضافة الوسيط المرر لها إلى الكائن الذي يستدعيها
• الإجرائية Remove : تقوم بحذف الوسيط المرر لها من العناصر المخزنة في الكائن الذي يستدعيها اذا كان موجودا
• الخاصية MyPanel : تعود هذه الخاصية بالعنصر المخزن بالكائن و الذي يوافق فهرسه القيمة المررة , كما انها تسند قيمة عنصر للعنصر الذي فهرسه يوافق القيمة المكررة
• الجرائية Check تقوم هذه الإجرائية بتفحص فيما اذا كان العنصر المرر لها موجودا ضمن العناصر المخزنة ضمن الكائن . تعتبر هذه الجرائية من أهم الإجرائيات فمن خلالها نتفحص تكرار الرقم ضمن مجموعته و ضمن سطره و ضمن عموده .

الان لنتابع شرح بقية طرائق الكائن MyPanel
* الإجرائية MouseDown : للتعامل مع حدث الضغط بالفأرة نلاحظ انه للربط مع هذا الحدث هناك امران الاول ان يكون للدالة نفس عدد الوسائط التي تملكها الإجرائية MousDown التقليدية إضافة إلى إضافة العبارة Handles MyBase.MouseDown إلى نهاية السطر الذي صرحت فيه الإجرائية .
نلاحظ أن مهمة هذه الدالة هي : عند الضغط على الكائن قم بتحديده و من ثم قم بزيادة قيمته ثم يتم تعريف ثلاث متحولات من نوع MyPanels الأول يستخدم لتجميع العناصر الموجودة في نفس سطر الكائن
الثاني يستخدم لتجميع العناصر الموجودة في نفس عمود الكائن أما الثالث فيستخدم لتجميع العناصر التي تنتمي لنفس المجموعة , بعد أن نقوم بملئ المتحولات السابقة بالعناصر المناسبة من خلال حلقة
نستدعي إجرائية Check لكل منها

و هكذا أكون قد شرحت الأجزاء المهمة من الفئة MyPanel و الفئة MyPanels

ننتقل الأن إلى النموذج الرئيسي للمشروع اسم هذا النموذج هو MainForm لا تسأل لماذا فهي عادة عندي , فلنذهب الان إلى الإجرائية DrawCells تقوم هذه الإجرائية برسم العناصر على النموذج مع تمهيد مجموعة كل عنصر و سطره و عموده .
تستدعى الإجرائية السابقة في الباني New الخاص بالنموذج
الان بقي لدينا الحدث Paint للنموذج يتم من خلال هذا الحدث رسم الخطوط التي تؤلف لوحة الـ Su Doku

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

قد اشرح كيف نقوم بتطوير اللعبة في دروس قادمة لكن حاول ان تجرب هذا أفضل بالنسبة لك .

ملاحظة : لقد كتبت هذا الدرس لكي يستفيد منه كل الناس لكن سيكون جميلا لو تذكر اسمي عند تطويرك اللعبة اعتمادا على درسي

للمزيد من الدروس يمكنك زيارة مدونتي الإلكترونية http://www.enashir.com/blogs/TammamKoujan
أو يمكنك زيارة مندى المبرمجين العرب حيث اشارك في منتديات البرمجة هناك http://www.arabteam2000.com
اذا كنت ترغب بمراسلتي Tammam84@Yahoo.com
ملاحظاتك و استفساراتك مرحب بها على الدوام .

الشيفرة :

لتحميل شيفرة البرنامج :
SuDoku.zip
للتحميل هذه المقالة بصيغة ملفات word :
Su_Doku.doc

كلمة أخيرة :

اتمنى ان تكون قد استفدت من الدرس , اذا كان عندك اية ملاحظات او اكتشفت اي خطأ أو كنت تملك معلومات اضافية قد تساعدني
اتمنى ان تراسلني و تخبرني بما عندك .

للمزيد من الدروس يمكنك زيارة مدونتي الإلكترونية http://tammamkoujan.wordpress.com/

اذا كنت ترغب بمراسلتي tmmamkoujan@gmail.com
ملاحظاتك و استفساراتك مرحب بها على الدوام .
تمام كوجان
‏الثلاثاء‏، 24‏ كانون الثاني‏، 2006

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

ملاحظة : كتب هذا الموضوع بالاصل بتاريخ 28‏ كانون الثاني‏، 2006 كما ذكر في نص المقالة
و قد نشر في منتديات الفريق العربي للبرمجة على الرابط:
Su Doku هيا بنا نبرمج لعبة
تمام كوجان في 26/07/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC | 3 Comments »

إلتقط الصور باستخدام الجهاز الكفي من خلال برنامجك

Posted by tammamkoujan on March 14, 2007

إلتقط الصور باستخدام الجهاز الكفي من خلال برنامجك

ألم تفكر يوما بأن تستعيض ببرنامج الكاميرا ببرنامج اخر من كتابتك يتضمن بعض الأمور التي لا يوفرها البرنامج الأصلي او كنت كمبرمج تكتب برنامجا يتطلب تشغيل الكاميرا و التقاط الصور لهدف معين
سنتحدث في هذه المقالة عن تشغيل الكاميرا و التقاط الصور على أجهزة البوكت بي سي Pocket PC و الهواتف الذكية Smart Phones

أولا انشأ مشروع جهاز ذكي جديد في Visual Studio 2005 في هذه المقالة سننشأ مشروع Windows Mobile 5.0 Pocket PC

بعد إنشاء المشروع قم بإضافة مرجع لفضاء الاسماء Microsoft.WindowsMobile.Forms في المشروع و ذلك من خلال القائمة Project ثم النقر على Add Reference

ثم استخدام الفضاء كالتالي :

using Microsoft.WindowsMobile.Forms;

اضف إلى النموذج أداة صورة Picture و أداة زر Button
نضع في الزر الشيفرة التالية:

CameraCaptureDialog myCapture = new CameraCaptureDialog();
myCapture.Mode = CameraCaptureMode.Still;
myCapture.Resolution = new Size(160, 160);
myCapture.StillQuality = CameraCaptureStillQuality.High;
myCapture.ShowDialog();
string strFileName = “”;
strFileName = myCapture.FileName;
pictureBox1.Image = new Bitmap(strFileName);

للتحكم بالكاميرا يتم باستدعاء CameraCaptureDialog الخاص بنظام التشغيل
في الشيفرة السابقة نعتمد على CameraCaptureDialog لكنه لا يتيح لنا الحصول على الصورة مباشرة
عندما نشغل CameraCaptureDialog من خلال برنامجنا و نلتقط الصورة كما قلت لن نحصل
على الصورة الملتقطة مباشرة لكننا سنحصل على مسارها الذي حفظت فيه
ثم نحملها إلى برنامجنا

انتبه لأمر مهم توابع الكاميرا غير موجودة في Pocket PC 2003
لكنها موجودة في Windows Mobile 5.0 كما انها موجودة في Smart Phone 2003 فما بعد

لتحميل الشيفرة :CameraTest.zip

تمام كوجان في 15/03/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC | 1 Comment »

مشروع التحكم بسيارة لاسلكياً من خلال الجهاز الكفي 2

Posted by tammamkoujan on February 19, 2007

مشروع التحكم بسيارة لاسلكياً من خلال الجهاز الكفي 2
Pocket PC Controlled – Wireless Car 2

ذكرت في الموضوع السابق مشروع التحكم بسيارة لاسلكياً من خلال الجهاز الكفي اننا سنستخدم منفذ USB الموجود
على الجهاز الكفي Pocket PC للقيام بعملية التحكم
لذا يجب ان ندرس منفذ USB و نتعرف عليه

ما هو الـ USB؟

كلمة USB تشير إلى العبارة Universal Serial Bus و هو معيار اتصال عالي السرعة يوفر واجهة (interface) توصيل ركب و شغل (Plug And Play) بسيطة إلى الأجهزة كأجهزة المودم و الكاميرات الرقمية و كاميرات الفيديو و لوحات المفاتيح و الفأرة .

أشكال وصلة USB :

تظهر الصورة التالية الاشكال المتاحة لوصلات USB .

USB ConnectorsType
بنية كبل الـ USB :

توضح الصورة التالية بنية كبل الـUSB .

USB-Cable

يرمز للـ USB بأيقونة على شكل رمح ثلاثي كما في الصورة ادناه

USB-Symbol
معلومات تقنية : محدوديات USB :

يوضح الجدول التالي امكانيات و محدوديات USB

USB-Properties

يقصد من Tiers Bus انه يمكننا توصيل أجهزة USB حتى خمسة مستويات (تخيل الأمر ببنية شجرية)
اما Device Bus فيعني انه يمكن توصيل حتى 127 جهاز معا من خلال USB

اذا احببت ان تتعرف USB بشكل اوسع يمكنك زيارة المواقع التالية :
Universal Serial Bus
Universal Serial Bus – wikipedia
Universal Serial Bus – Intel

نكمل في الحلقة القادمة حيث ستظهر أول المشاكل و أخطرها

تمام كوجان في 19/01/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC, برمجة | 3 Comments »

Welcome Windows Mobile 6

Posted by tammamkoujan on February 14, 2007

أهلا ويندوز موبايل 6

Welcome Windows Mobile 6

اعلنت شركة ميكروسوفت عن طرح نظامها الجديد للهواتف الذكية Windows Mobile 6
هذا الاصدار يتضمن الكثير من التحديثات فمن اخر اصدارات البرامج بميزات جديدة إلى أدوات الرسائل اضافة إلى أمان اكثر و انتاجية أعلى ,
و سيبدأ طرح هذا النظام على الأجهزة في الربع الثاني من عام 2007

WM6

من الميزات المهمة في هذه النسخة اضافة ميزات اضافية إلى طقم ميكروسوفت اوفيس لم تكن موجودة إلا على نسخ الحواسب الشخصية
كما و يوفر Windows mobile 6 امكانية استعراض الرسائل الالكترونية بتسيقها الاصلي بامكانيات HTML الغنية مع وجود روابط فعالة إلى مواقع الويب و مواقع SharePoint مما يعني ان الصور و النصوص ستعرض كما لو انها على حاسب شخصي و ستكون متاحة
من مخدم بريد شركة مثل Exchange Server 2007 او من حسابات بريد على الويب و هذا يتضمن Windows Live™ Hotmail

3GM

Windows Mobile 6 يتضمن ايضا Windows Live for Windows Mobile و الذي يوفر للمستخدمين مجموعة واسعة من خدمات Windows Live على سبيل المثال الان و من خلال Windows Live Messenger, فإن المستخدم يستطيع الدردشة مع اكثر من شخص في وقت واحد اضافة إلى الاشكال المتحركة و الارسال السريع للملفات و الصور او تخزين و ارسال الملاحظات الصوتية

توفر هذه الاصدارة نسخة رائعة من طقم ميكروسوفت اوفيس يتضمن Office Outlook®, Office Word, Office Excel® and Office PowerPoint
مع ما توفره هذه التطبيقات من امكانيات كانت متاحة فقط على الحواسب الشخصية إلى الشاشة الصغيرة

هناك الكثير من المميزات في هذه الإصدارة يمكنكم القراءة عنها في قسم windows mobile في موقع ميكروسوفت
بعض الصور لنظام التشغيل

Desktop
Contact

Start

بعض مقاطع الفيديو

تمام كوجان في 14/02/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC, برمجة | Leave a Comment »

مشروع التحكم بسيارة لاسلكياً من خلال الجهاز الكفي

Posted by tammamkoujan on February 13, 2007

مشروع التحكم بسيارة لاسلكياً من خلال الجهاز الكفي
Pocket PC Controlled – Wireless Car

بسم الله الرحمن الرحيم

قررت البارحة أن أبدأ بواحدة من أخطر خططي البرمجية
الفكرة كالتالي :
بناء برنامج للتحكم بسيارة لاسلكيا من خلال البوكت Pocket PC حيث يتم توصيل الدارة اللاسلكية للسيارة بمنفذ USB لجهاز البوكت بي سي Pocket PC و اقوم بكتابة برنامج يمكنني من استخدام شاشة اللمس الخاصة بالجهاز الكفي Pocket PC لقيادة السيارة طبعا هذه هي المرحلة الأولى المرحلة الثانية ستم تزويد السيارة بكاميرا لاسلكية و تطوير البرنامج الموجود على الجهاز الكفي بحيث يتم عرض ما تصوره الكاميرا على الجهاز الكفي Pocket PC , المراحل المتقدمة للمشروع لا داعي لذكرها الآن
انا شاهدت من قبل برامج للتحكم بالسيارات اللاسلكية من خلال الحاسب الشخصي لكن التحدي هنا هو استخدام الجهاز الكفي للقيام بذلك ومن خلال منفذ الـ USB
لذا ما ان انتهى العمل البارحة ذهبت مباشرة و اشتريت العدة اللازمة للبدء بالمشروع.
بدأت بتجربة مبدأية لاختبار الأدوات و شغلت دارة التحكم اللاسلكية من خلال منفذ الطابعة Parallel Port في حاسبي الشخصي و تمكنت من تشغيل السيارة مبدئيا طبعا هذا فقط كان من اجل التجربة بينما العمل الحقيقي على جهازي الكفي Pocket PC و هنا تنطوي المخاطرة الحقيقة اذا يمكن ان اخسره او اعطبه من وراء هكذا تجارب
لكن كله فداءأً للعلم و التعلم.

sold
MultiMeter
kinzo
image_00237.jpg
Remote Control
Car

طبعا و لا ننسى جهازي الكفي العزيز

JasJar

تابعوا معي الحلقات القادمة من هذه المغامرة

Posted in الأجهزة الكفية Pocket PC, برمجة | 7 Comments »

مشروع قواعد بيانات من الالف إلى الياء 2

Posted by tammamkoujan on February 6, 2007

مشروع قواعد بيانات من الالف إلى الياء 2

بعد الدرس السابق مقدمة عن برمجة الأجهزة الكفية نتتقل الان إلى البدء بالمشروع :
للبدء بالمشروع لابد من تنصيب SQL SERVER CE على الجهاز المتنقل
يتم هذا بطريقتين :
الأولى : عندما تنشأ مشروعا يعتمد على قواعد البيانات في VS.NET فإنه وعند ترجمة التطبيق
و من ثم نشره من خلال مربع اختيار وجهة نشر التطبيق فإن VS.NET يقوم بتفحص الهدف الذي سينشر إليه التطبيق فإذا لم تكن قاعدة البيانات موجودة يتم تنصيبها طبعا يحث هذا فقط في المرة الأولى لنشر البرنامج

Run
Deploy

قلنا ان هذا يحدث عند انشاء مشروع يعتمد على قواعد البيانات
اذا كيف اجعل مشروعي يعتمد على قواعد البيانات ؟
يتم ذلك عن طريق استيراد فضاء الاسماء System.Data.SqlServerCe إلى المشروع
و يتم ذلك كما يلي اذهب إلى القائمة Project ثم انقر على Add Reference بعد ذلك
اختر System.Data.SqlServerCe

AddReference

الان افتح شيفرة برنامجك و و استورد فضاء الاسماء System.Data.SqlServerCe
في Visual Basic .NET

Imports System.Data.SqlServerCe

في C Sharp

Using System.Data.SqlServerCe;

تهانينا لقد أصبح برنامجك قادرا على التعامل مع قواعد البيانات
الان و بمجرد الضغط على زر تنفيذ البرنامج و نشره إلى الجهاز او المحاكي فإن Visual Studio .NET ستقوم بتنصيب نسخة
SQL SERVER CE 2 اذا تطور باستخدام Visual Studio 2003
أو SQL Server Mobile اذا كنت تطور باستخدام Visual Studio 2005

تمام كوجان في 06/02/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC, برمجة | 1 Comment »

نقل ملفات إلى محاكي Windows CE

Posted by tammamkoujan on February 4, 2007

نقل ملفات إلى محاكي Windows CE

لنفرض اننا نريد نقل الملفات إلى المحاكي ( ربما لأهداف برمجية كأن ننصب بعض الخطوط أو لأهداف اخرى كأن نجرب بعض البرامج قبل ان ننصبها على الجهاز الحقيقي (
الخطوة الأولى هي ضبط اعدادت برنامج Active Sync حتى نتمكن من التعامل مع المحاكي على انه جهاز بوكت بي سي Pocket PC حقيقي يمكن الوصل إلى ملفاته من خلال جهاز الكمبيوتر
نذهب إلى إعدادات الاتصال في Active Sync و نفعل الخيار : Allow Connections to one of the following
و من الصندوف المنسدل تحته نختار DMA كما في الصورة التالية :

ActiveSyncSetting

الان فلنقم بتشغيل المحاكي
شغل Visual Studio 2005
اذهب للقائمة Tools كما في الصورة التالية :

VS2005Menus

انتق : Device Emulator Manager
كما في الصورة :

VS2005ToolsMenu

ستفتح لك نافذة Device Emulator Manager كما في الصورة التالية :

DeviceEmulatorManager

انتق المحاكي الذي تريد تشغيله ثم انقر عليه بزر الفأرة اليمين
ستظهر لك قائمة انقر على Connect

Connect

الان سيعمل المحاكي
و سيظهر في Device Emulator Manager بجانب اسم المحاكي الذي اخترناه سهم اخضر يدل على ذلك
كما في الصورة :

Connected

هدفنا الان ان نصل إلى الملفات داخل المحاكي كأنه جهاز حقيقي
اذهب Device Emulator Manager من جديد و انقر باليمين على المحاكي الذي اخترته
انتق Cardle
سيتغير رمز السهم الاخضر كما في الصورة :

Cardle

هذا الرمز الجديد يدل ان المحاكي اصبح مربوطا بالجهاز كأنه جهاز حقيقي و يمكن الوصول إلى الملفات بداخله
مثل اي بوكت حقيقي

لتنصيب الخطوط (و بشكل عام للدخول إلى ملفات المحاكي)
اذهب إلى My Computer و انقر على ايقونة البوكت كما في الشكل

MyComputer

تهانينا لقد تمكنت من الدخول إلى ملفات البوكت يمكنك ان تنسخ و تلصق و تفعل ما تريده
لتنصيب ملفات الخط : بعد دخولك إلى البوكت من خلال My Computer أذهب
إلى المجلد Windows في البوكت هناك ستجد مجلدا اسمه Fonts و هو فارغ على الأغلب
انسخ ملفات الخط إليه و تمت المهمة

تمام كوجان في 04/02/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC | 2 Comments »

بناء مكون ساعة كلاسيكية

Posted by tammamkoujan on January 30, 2007

بناء مكون ساعة كلاسيكية في .NET Compact Framework

خلاصة الدرس :

ستتعلم من خلال هذا الدرس كيف تبني مكوناتك الخاصة لكي تستخدمها في برامجك المكتوبة من اجل .NET Compact Framework
كما ستتطلع على بعض طرق استخدام مكتبات الرسوميات GDI+ في .NET Compact Framework .

ملاحظة : هذه المقالة تعتبر ان المستخدم متآلف مع لغة البرمجة Visual C Sharp من ميكروسوفت .

المحتويات :
مقدمة
عرض المكون
البدء بالمشروع
مقدمة :

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

عرض المكون :

المكون الذي سنبنيه هو مكون ساعة تقليدية سنرسم دائرة السعة و نضع الارقام التي تشير إلى الوقت
و من ثم سنرسم العقارب الثلاثة مع تحديث حركتها لكل ثانية.

البدء بالمشروع :

شغل Visual Studio 2005 و قم بانشاء مشروع Windows Mobile 5.0 جديد , قم بتسمية المشروع PocketClockTest
كما في الصورة ادناه :

new project

سيتم إنشاء مشروع Pocket PC جديد , اذهب الان إلى Solution Explorer (اذا لم تجده اذهب إلى قائمة View ثم Solution Explorer )
ثم انقر على المشروع باليمين و اختر من القائمة التي ستظهر Add ثم User Control

add new control

قم بتسمية المكون بـ AnalogClock ثم انقر موافق
الان ستفتح صفحة التصميم الخاصة بالمكون اضف مكون Timer من صندوق الادوات الخاص بـ Visual Studio
قم بضبط الخاصية Interval للمؤقت Timer على القيمة 1000 و ذلك لأننا نريد تحديث واجهة الساعة و تحريك العقارب كل ثانية.
انقر على مكون الـ Timer و اكتب في الحدث Tick له ما يلي:
Invalidate();
ليصبح كالتالي :

private void timer1_Tick(object sender, EventArgs e)
{
Invalidate();
}

الهدف من التعليمة السابقة هو ارسال رسائل تشغل حدث رسم Paint للمكون و بالتالي فإن المكون سيتم تحديثه كل ثانية
الان ننتقل إلى مكوننا و نستعرض شيفرته
في الباني (Constractor) الخاص بالمكون نضع الشيفرة التالية :
timer1.Enabled = true;
و ذلك لتشغيل المؤقت مع انشاء المكون
فيصبح شكل الباني كالتالي :

public AnalogClock()
{
InitializeComponent();

//Enables the timer so the clock refreshes every second

timer1.Enabled = true;
}

الان قم بكتابة الشيفرة التالية في المكون :

protected override void OnPaint(PaintEventArgs e)
{

//Calls the base class’s OnPaint method

base.OnPaint(e);

//Smoothes out the appearance of the control
// e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
//The center of the control, which is used as center for the clock

PointF center = new PointF(this.Width / 2, this.Height / 2);

//The distance of the text from the center

float textRadius = (Math.Min(Width, Height)-5 ) / 2;

//The distance of the margin points from the center

float outerRadius = Math.Min(Width, Height) / 2 – 5 ;

//The length of the hour line

float hourRadius = outerRadius * 6 / 9;

//The length of the minute line

float minuteRadius = outerRadius * 7 / 9;

//The length of the second line

float secondRadius = outerRadius * 8 / 9;
for (int i = 1; i <= 60; i++)

//Gets the angle of the outer dot

float angle = GetAngle(i / 5f, 12);

//Gets the location of the outer dot

PointF dotPoint = GetPoint(center, outerRadius, angle);

//Indicates the size of the point

int pointSize = 2;

//Is true when a large dot needs to be rendered

if (i % 5 == 0)
{

//Sets the size of the point to make it bigger

pointSize = 4;

//The hour number

string text = (i / 5).ToString();
SizeF sz = e.Graphics.MeasureString(text, Font);

//The point where the text should be rendered

PointF textPoint =
GetPoint(center, textRadius, angle);

//Offsets the text location so it is centered in that point.

textPoint.X -= sz.Width / 2;
textPoint.Y -= sz.Height / 2;

//Draws the hour number

e.Graphics.DrawString(text, Font,
new SolidBrush(this.ForeColor), textPoint.X,textPoint.Y);
}
Pen pen = new Pen(this.ForeColor, 1);

//Draws the outer dot of the clock

e.Graphics.DrawEllipse(pen, Convert.ToInt32(dotPoint.X – pointSize / 2),
Convert.ToInt32(dotPoint.Y – pointSize / 2), pointSize, pointSize);
pen.Dispose();

//Gets the system time

DateTime dt = DateTime.Now;

//Calculates the hour offset from the large outer dot

float min = ((float)dt.Minute) / 60;

//Calculates the angle of the hour line

float hourAngle = GetAngle(dt.Hour + min, 12);

//Calculates the angle of the minute line

float minuteAngle = GetAngle(dt.Minute, 60);

//Calculates the angle of the second line

float secondAngle = GetAngle(dt.Second, 60);

//Draws the clock lines

DrawLine(e.Graphics, Color.Black, 1, center, secondRadius,
secondAngle);
DrawLine(e.Graphics, Color.Black, 2, center, minuteRadius,
minuteAngle);
DrawLine(e.Graphics, Color.Black, 3, center, hourRadius,
hourAngle);
}
}
private float GetAngle(float clockValue, float divisions)
{

//Calculates the angle

return 360 – (360 * (clockValue) / divisions) + 90;
}

private PointF GetPoint(PointF center, float radius, float angle)
{

//Calculates the X coordinate of the point

float x = (float)Math.Cos(2 * Math.PI * angle / 360) * radius +
center.X;

//Calculates the Y coordinate of the point

float y = -(float)Math.Sin(2 * Math.PI * angle / 360) * radius +
center.Y;
return new PointF(x, y);
}

private void DrawLine(Graphics g, Color color, int penWidth, PointF
center, float radius, float angle)
{

//Calculates the end point of the line

PointF endPoint = GetPoint(center, radius, angle);

//Creates the pen used to render the line

Pen pen = new Pen(color, penWidth);

//Renders the line

g.DrawLine(pen ,Convert.ToInt32(center.X),Convert.ToInt32(center.Y),Convert.ToInt32(endPoint.X), Convert.ToInt32(endPoint.Y));
pen.Dispose();
}

تجد فوق كل سطر مما سبق شرحا لوظيفة هذا السطر و لا داعي لإعادة الشرح لك
لكن الشيء الاساسي اننا قمنا بتحميل زائد للحدث OnPaint حتى نقوم بعمليات الرسم كما سأركز على نقطة مهمة واحدة نلاحظ انني استخدم PointF (و هي عبارة عن كائن نقطة يأخذ احداثيين من نوع Float) رغم انها غير مدعومة في .NET Compact Framework 2.0 لتجاوز عدم توافر الدعم لـ PointF في .NET Compact Framework 2.0 قمت بإنشاء بنية struct تحاكي عمل PointF في نسخة سطح المكتب كالتالي :

public struct PointF
{
public float X;
public float Y;
public PointF(float x, float y)
{
X = x;
Y = y;
}
}

الان دعونا نضيف خاصية للساعة , سترغب باضافة مظهر جمالي للساعة من خلال اضافة خلفية
ما للساعة لذا قم بما يلي قم باضافة الشيفرة التالية :

private Image _BackImage = null;
public Image BackImage
{
get
{
return _BackImage;
}
set
{
if (value != _BackImage)
{
_BackImage = value;
Invalidate();
}
}
}

من خلال هذه الشيفرة نحن نضيف خاصية اضافة الصورة للساعة في زمن التصميم

اذهب إلى الاجرائية OnPaint و اكتب في بدايتها ما يلي حتى ترسم الصورة على خلفية المكون :

if (_BackImage != null)
{
e.Graphics.DrawImage(_BackImage, 0,0);
}

الان اذهب إلى القائمة Build و قم باختيار Build Solution اذا تم ترجمة التطبيق بدون مشاكل اذهب إلى النموذج الرئيسي للمشروع ثم و من صندوق
الادوات Tool Box ستجد موكن الساعة الذي انشأناه قم بإضافته للمشروع كما في الشكل :

final

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

ملاحظة : هذا الدرس في الاساس يعتمد على مثال في احد الكتب لدي مع بعض التعديلات ليتوافق مع محدودية .NET Compact Framework و بعض الاضافات و بعض الامور تم حذفها كي لا يطول الموضوع

تمام كوجان في 30/01/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC, برمجة | Leave a Comment »

مقدمة عن برمجة الأجهزة الكفية

Posted by tammamkoujan on January 10, 2007

برمجة البوكت Pocket PC هي مجال جديد من البرمجة انتشر مع انتشار الاجهزة المتنقلة (Mobile Devices)
لكنها تختلف عن البرمجة العادية بعدة نواح من أهمها اعتبارات الاداء و استهلاك الذاكرة و الحجم المستغل لمساحة التخزين نظرا للإمكانيات المحدودة للأجهزة المتنقلة مقارنة بالحواسيب الشخصي
يضاف إلى ذلك صغر المساحة المتاحة للعرض على الشاشة مما يتطلب دقة في تصميم واجهات البرنامج حتى تستغل كل نقطة على النموذج بأفضل شكل ممكن .
لغات البرمجة :
بشكل عام و بسبب محدودية أنظمة التشغيل المتاحة على الاجهزة المتنقلة لا يمكن تشغيل البرامج التنفيذية التقليدية على الاجهزة المتنقلة لكن توجد عدة لغات برمجة خاصة بالأجهزة المتنقلة من اشهرها :

لغة

Embedded C++

و هي المقابل للغة

C++

و ما تزال مدعومة من Microsoft و تعتبر من أقوى اللغات في هذا المجال.

لغة Embedded Visual Basic و هي المقابل للغة البرمجة Visual Basic تعتبر من اللغات السهلة
و البسيطة لإنشاء تطبيقات الاجهزة الجوالة . لكن توقف دعم هذه اللغة من Microsoft أي انه لن تطرح
اية اصدارات أو تحديثات لها

و قد اتاحت Microsoft هاتين اللغتين بشكل مجاني منذ فترة قريبة .

تقنية .Net : بإصدار Microsoft لـ .NET Framework حدثت ثورة في مجال تطوير البرمجيات
و قد طالت هذه الثورة مجال تطوير برامج الأجهزة المتنقلة حيث اطلقت Microsoft بعد فترة من اصدارها إطار العمل الخاص بالحواسيب الشخصية , اطارا خاصا بالإجهزة المتنقلة يدعى .NET Compact Framework او اختصاراً .NET CF , اتاح هذا الاطار لمبرمجي Visual Studio .NET إمكانية تطوير تطبيقات للأجهزة المتنقلة , فقد اتاحت Microsoft على موقعها تحديثا يمكن مبرمجي VS.NET 2002 من تطوير هكذا برمجيات و من ثم جاء VS.NET 2003 متضمنا لإمكانية تطوير برمجيات الاجهزة المتنقلة
و الان يأتي VS.NET 2005 مرفقا بالاطار .NET Compact FrameWork في اصدارته الثانية
و التي تعد بكثير من المزايا.

قواعد البيانات المتاحة :
يمكن تخزين البيانات على الاجهزة المتنقلة بعدة صيغ ابسطها تخزين البيانات في ملفات نصية
كما يمكن استخدام ملفات XML و قد قدمت Microsoft مع اصدارة ُEmbedded Studio أي(EVB+EC)
نسخة خاصة من ADO تدعى ADOCE و هي نسخة سهلة الاستخدام تتيح الكثير من الامكانيات لكن الدعم الخاص بها قد توقف أيضا , بعد ADOCE جاء اطلاق Microsoft لـ SQL SERVER CE
و التي كما يتضح من اسمها نسخة خفيفة من SQL SERVER و بإمكانيات محدودة لكنها تمتلك من المزايا ما يكفي لتطوير تطبقات كبيرة نسبيا حيث ان حجمها قد يصل إلى 2 جيغا بايت , و يبدأ دعم SQL CE بدأاً من
الاصدارات Window Pocket 2000 و Windows CE 3 , و يرفق VS.NET 2003 بالاصدار
SQL SERVER CE 2 , و مع إصدار VS.NET 2005 صدرت النسخة الثالثة و التي أصبحت تدعى
SQL SERVER MOBILE .

ملاحظة : لم اتطرق إلى إلى برمجة أجهزة PALM حتى لا يطول الموضوع إضافة إلى ما تعانيه برمجة PALM من صعوبات فمثلا لا يجب أن يتجاوز حجم التطبيق 64 KB و بالتالي يجب تقسيم التطبيقات الكبيرة إلى أجزاء.

ملاحظة : تمت كتابة هذه المقالة بتاريخ 30/11/2005 و تم طرحها في منتديات الفريق العربي للبرمجة
ضمن الموضوع التالي: مشروع قواعد بيانات من الالف إلى الياء
كما و تم طرحها في مدونتي السابقة قبل ان يتوقف موقعها عن العمل

Posted in الأجهزة الكفية Pocket PC, برمجة | 6 Comments »