تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس العشرين - اضافة آلة حاسبة للبرنامج
#1
كاتب الموضوع : أحمد جمال

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

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

آلة حاسبة
.

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

ولمن لا يعرف خاصية Index فهي الخاصية التي تتيح تسمية أكثر من أداة بنفس الاسم مع تغيير قيمة هذه الخاصية فقط ، أو بمعنى آخر إنها تقوم بعمل مصفوفة Array من الأدوات .

وتتيح هذه الخاصية أيضاً وضع كود مشترك لجميع هذه الأدوات .

من أجل ذلك سنبدأ في تصميم فورم صغير ، ونضبط خاصية MDIChild بحيث تصبح True ، وذلك لمكن استخدام هذا الفورم أثناء عمل البرنامج .

يحتوي هذا الفورم على ما يلي :

Command1وبـ Index من 0 إلى 10 تحتوي في خاصية Caption على الأرقام بالترتيب من 0 وحتى 9 اضافة إلى الفاصلة .
Command2
ويحتوي في خاصية Caption على +/- وهي مختصة بتغيير الاشارة .

Command3
وبـ Index من 0 إلى 3 تحتوي على العمليات التالية : + ، - ، * ، / .

Command4
ويحتوي على = .

Command5
ويحتوي على Index من 0 وحتى 2 تحتوي على الرموز التالية CE لمسح العملية الحالية ، C لافراغ الخانات من جديد ، و Off لاغلاق الآلة .

Command6
ويحتوي على Index من 0 وحتى 2 ويحتوي على MS لتخزين رقم ، MR لاسترجاع التخزين ، MC لافراغ التخزين .

Text1
وهو خانة العمليات .

Text2
وهي الخانة التي توضح الاشارة الحالية ، حاول وضعه على المربع الأول بحيث يبدو أنه بداخله .

واضبط خاصيتي
Locked لهذين المربعين بحيث تصبح True لمنع التلاعب فيهما .

والآن أضف ثلاثة متغيرات ، متغير Memory من النوع double ليحل محل الذاكرة ، ومتغير First من نفس النوع والذي سيحتوي على الرقم الأول ، There وهو متغير من النوع Boolean وهو يبين لنا إذا ما كنا لتونا قد ضغطنا على أحد العمليات أو = بحيث تمسح الخانه مع أول ضغطة لرقم .


كود :
[align=right]Dim First As Double
Dim There As Boolean
Dim Memory As Double[/align]
الأمر الثاني هو التعامل مع الأرقام ، وكما ترى فكل ما نحتاج إليه في الأرقام والفاصلة هو أن نزيد مربع النص Text1 بمحتويات الزر المضغوط عليه .

إذن سنجل مربع النص = مربع النص اضافة إلى Caption للزر المضغوط عليه .

ولكن قبل ذلك نتأكد من أن There تحتوي على False ، وإلا فإننا نفرغ الخانة أولاً :


كود :
[align=right]If There = True Then
There = False
Text1.Text = ""
End If
Text1.Text = Text1.Text & Command1(Index).Caption[/align]
والآن إلى جزء العمليات الحسابية ، سنستدعي أولاً دالة نسميها Calc_Me ، ومن ثم نضبط There على True ، ونضع في First الرقم الحالية ، واضافة لذلك ، نضع العلامة الحالية في Text2 .


كود :
[align=right]Call Calc_Me
There = True
First = Val(Text1.Text)
Text2.Text = Command3(Index).Caption[/align]
ولنر كيف سيكون شكل الاجراء Calc_Me ، والذي سنختبر قيمة Text2 وعلى أساسها سوف نقوم بعمل العملية الحسابية بين First و Text1 ونضعها في Text1 :


كود :
[align=right]Select Case Text2.Text
Case "+"
Text1.Text = First + Val(Text1.Text)
Case "-"
Text1.Text = First - Val(Text1.Text)
Case "*"
Text1.Text = First * Val(Text1.Text)
Case "/"
Text1.Text = First / Val(Text1.Text)
End Select[/align]
لكن ولأنه قد تحدث أخطاء ناتجة عن قسمة على الصفر مثلاً ، أو OverFlow ، ولكي لا يتوقف البرنامج فإننا نضع العبارة التالية في بداية الاجراء :


كود :
[align=right]On Error Resume Next [/align]
وفي آخر الكود نضع ماذا يحدث لو تم اكتشاف خطأ ، حيث نظهر رسالة بهذا الخطأ ، وتخزن كل معلومات الخطأ في الكائن Err :


كود :
[align=right]If Err Then
MsgBox Err.Description, vbCritical, "[/align]

كود :
[align=right]خطأ[FONT=Times New Roman] " & Err
Err.Clear
End If[/FONT][/align]
[FONT=Times New Roman]
[/FONT]

لنعد مرة أخرى إلى أمر = ، ولو لاحظنا أننا سنستدعي الاجراء Calc_Me ، ومن ثم نفرغ خانة العملية Text2 ونضع There=True .


كود :
[align=right]Call Calc_Me
There = True
Text2.Text = ""[/align]
والآن أوامر Command5 والتي تحتوي على C و CE و Off .


كود :
[align=right]Select Case Index
Case 0
Text1.Text = ""
Text2.Text = ""
Case 1
Text1.Text = ""
Case 2
Unload Me
End Select[/align]
وأخيراً أوامر MS و MR و MC :


كود :
[align=right]Select Case Index
Case 0
Memory = Val(Text1.Text)
Case 1
Text1.Text = Memory
There = False
Case 2
Memory = 0
End Select[/align]
ويمكنك جلياً أن تلاحظ كم من الأكواد وفرت علينا بفضل الله خاصية Index واستدعاء الاجراء Calc_Me بدلاً من كتابته مع كل حدث .

والآن ، نرى كود اظهار هذا الفورم ، وسنظهره في الطرف الأعلى والأيسر للفورم .


كود :
[align=right]Case 7
Frm_Calc.Width = 3105
Frm_Calc.Height = 2640
Frm_Calc.Top = 0 ' MDIForm1.Height - Frm_Calc.Height
Frm_Calc.Left = 0
Frm_Calc.Show[/align]


يتبع
...

}}}
تم الشكر بواسطة:
#2
استقبال أرقام من لوحة المفاتيح .

سنضبط أولاً خاصية KeyPreview للفورم بحيث تصبح True وبهذا أي ضغطة على الكيبورد في هذا الفورم يحس بها حدث Key_Press لهذا الفورم .

والآن نعرف أن حدث Key_Press يستقبل متغيراً هو كود آسكي Ascii للزر المضغوط ، ومن خلال ذلك نستطيع أن نضغط على الزر المقابل لها .
فمثلاً الرقم 48 يعني الصفر ، من أجل ذك سنضغط على Command1(0) بالشكل التالي :


كود :
[align=right]Command1(0).Value = True[/align]
وكذلك مع باقي الأرقام والتي تأخذ أرقاماً من 48 وحتى 57 ، أي الرقم + 48 .
ومن العلاقة السابقة نستطيع أن نكتب الكود التالي في حدث Key_Press :


كود :
[align=right]If KeyAscii < 58 And KeyAscii >= 48 Then
Command1(KeyAscii - 48).Value = True[/align]
والآن نكمل بمزيد من التخصيص ، فـ 46 تعني الفاصلة ، 42و43و45و47 العمليات الأربع ، 27 زر Esc والذي سنجعله يرمز لـ C في الآلة ، أيضاً 13 يرمز لـ Enter والذي سيكون = .
من أجل ذلك نكتب الكود التالي :


كود :
[align=right]ElseIf KeyAscii = 46 Then
Command1(10).Value = True
ElseIf KeyAscii = 13 Then
Command4.Value = True
ElseIf KeyAscii = 42 Then
Command3(2).Value = True
ElseIf KeyAscii = 43 Then
Command3(0).Value = True
ElseIf KeyAscii = 45 Then
Command3(1).Value = True
ElseIf KeyAscii = 47 Then
Command3(3).Value = True
ElseIf KeyAscii = 27 Then
Command5(1).Value = True[/align]

وأخيراً 8 ترمز لـ BackSpace . وسنستخدم لذلك دالة Left والتي ستقتص نصاً من اليسار بطول النص - 1 ، وذلك بالشكل التالي :


كود :
[align=right]ElseIf KeyAscii = 8 Then
If Len(Text1.Text) <> 0 Then Text1.Text = Left(Text1.Text, Len(Text1.Text) - 1)[/align]
بهذا تكون آلتنا جاهزة لاستقبال الأرقام من لوحة المفاتيح .



والملف مرفق الآن بعد التعديلات الأخيرة ...


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



الملفات المرفقة
.zip   prog16.zip (الحجم : 187.52 ك ب / التحميلات : 153)
}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  الدرس الرابع والثلاثون والأخير - نبذة عن العملية العكسية + تجهيز البرنامج على Cd RaggiTech 0 11,111 15-10-12, 09:10 AM
آخر رد: RaggiTech
  الدرس الثالث والثلاثون - كيفية عمل اعداد Setup للبرنامج RaggiTech 0 3,979 15-10-12, 09:08 AM
آخر رد: RaggiTech
  الدرس الثاني والثلاثون - التحويل إلى exe RaggiTech 0 4,065 15-10-12, 09:07 AM
آخر رد: RaggiTech
  الدرس الحادي والثلاثون - تعددية المستخدمين - البحث وطباعة الفواتير - التعليمات ... RaggiTech 2 4,951 15-10-12, 09:05 AM
آخر رد: RaggiTech
  الدرس الثلاثون - التعامل مع شريط الأدوات ToolBar RaggiTech 0 3,822 15-10-12, 08:59 AM
آخر رد: RaggiTech
  الدرس التاسع والعشرون - التعامل مع أشرطة الحالة Statues Bar RaggiTech 0 3,602 15-10-12, 08:57 AM
آخر رد: RaggiTech
  الدرس الثامن والعشرون -الطباعة في البرنامج . RaggiTech 4 5,293 15-10-12, 08:56 AM
آخر رد: RaggiTech
  الدرس السابع والعشرون - مقدمة إلى التعامل مع التقارير من خلال DataReport RaggiTech 2 6,107 15-10-12, 08:45 AM
آخر رد: RaggiTech
  الدرس السادس والعشرون - التقارير اليومية ، والتقارير بين تاريخين RaggiTech 1 4,347 15-10-12, 08:39 AM
آخر رد: RaggiTech
  الدرس الخامس والعشرون - الإحصائيات والرسوم البيانية RaggiTech 0 3,766 15-10-12, 08:37 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم