مشاهدة النسخة كاملة : آلة حاسبة بسيطة بالدلفي
merouane
21-02-2008, 11:28 PM
السلام عليكم
هذا مثال لبرنامج آلة حاسبة مبرمجة بلغة الدلفي
لقد حاولت جاهدا أن أبسط الشرح، و عذرا إذا كان التعبير قاصرا فلست متعودا على مثل هذه المقالات
هدفي إثراء المنتدى للفائدة العامة أولا ، ثم تبسيط استعمال الدلفي للمبتدئين.
نبدأ بسم الله
سوف نستعمل دلفي 2006
1- مبادئ الحساب:
- عملية الإدخال ستكون متسلسلة أي رقم يليه رقم أو عملية.
- الأرقام من نوع العدد الصحيح.
- حيز الكتابة (ظهور الأرقام) لا يقبل سوى الأرقام الطبيعية (0..9) ، الفاصلة و مؤشر العدد السالب
- العمليات هي الجمع، الطرح، الضرب، القسمة و النتيجة
2- الخوارزمية:
- تهيئة (initialisation) الأرقام تكون العدد 0 (صفر)
- إدخال الرقم عبارة عن الحرف السابق متبوع بالحرف الجديد.
- العمليات عبارة عن متغير حيث (القسمة: 1، الضرب: 2، الطرح: 3، الجمع: 4)
3- تصميم الشكل الخارجي:
- إقلاع الدلفي 2006
- إنشاء برنامج جديد (win32)
http://up103.arabsh.com/files/b2vffuhcexlp562q4z6v.gif
- ثم بعد ظهور form نعدل على قياساتها كالأتي:
Height: 225
Width: 260
Caption: (حسب اللغة المرادة) مثلا Calculatrice
http://up103.arabsh.com/files/zs5es7ehpe8xumscrde3.gif
- نذهب إلى لوحة الأدوات (Tool Palette) و نختار Standard -> TEdit
نعدل على قياساتها كالأتي:
Left : 10
Top : 10
Width : 230
BiDiMode : bdRightToLeft
Text : نمحي الكتابة الموجودة
http://up103.arabsh.com/files/wupt1d0wlmx5dxirx4s2.gif
- الآن نقوم بإضافة الأزرار
هناك خدعة () في الدلفي بحيث تكفي نقرة واحدة بالفأرة لإضافة مكوِّن بعدد ما نريد. وهي الضغط على Shift و النقر على المكون في الوقت نفسه.
أو – بكل بساطة - ننقر على المكون TButton ثم نذهب إلى الواجهة form وننقر بالفأرة مرة واحدة بحيث نحصل عل الأتي:
http://up103.arabsh.com/files/qqealkmdezxbml7x0slx.gif
الآن نعدل على قياسات الزر:
Left : 10
Top : 35
Width : 32
Height: 32
Caption : نمحي الكتابة الموجودة
ثم نقوم بنسخ الزر (ctrl+c) أو النقر بالزر الأيمن ثم Edit ثم copy
بعدها ننسخ (17 مرة)
يتبع ..
B.M.AbdelAziZ
21-02-2008, 11:58 PM
بسم الله الرحمن الرحيم
بارك الله فيك اخي مروان
تصدق كنت اكتب درس مشابه لكن باختلافات صغيرة
استحدمت دلفي7 بدلا من 2006
استعملت TLabel بدلا من TEdit
ولم استخدم الخاصية Tag ولم اغير اسماء الازرار
اختلاف تام في الزر +/- وزر القاصلة وطريقة الحساب...
وتفاصيا اخرى صغيرة
...
لكن نفس الفكرة في استخدام Sender واجرائية واحدة لكل ازرار الارقام
بانتظار درس مقبل
والسلام عليكم ورحمة الله
merouane
22-02-2008, 12:12 AM
http://up102.arabsh.com/my/9d62eab.png
في الأخير نحصل على ما يلي:
http://up102.arabsh.com/my/34cb54b.gif
لاحظ أننا قد غيرنا في قياسات زرين هما C و =
C: Width: 70 =: Height: 70
الآن انتهينا من الواجهة و سننتقل إلى البرمجة.
ننقر على Code في الأسفل أو بكل بساطة F12
نعود قليلا إلى الواجهة F12
ننقر مرتين على 0 (B0) فنحصل على
http://up103.arabsh.com/files/hx0cltdw259slza9prfe.jpg
سأتوقف قليلا للشرح بسيط في البرمجة غرضية التوجه
في البرمجة العادية للتطبيق المثال الآلة الحاسبة سوف نقوم بكتابة شفرة لكل زر ذات رقم
أي للزر 0 سنكتب
procedure TForm1.B0Click(Sender: TObject) ;
begin
Edit1.Text := Edit1.Text + ‘0’ ;
end;
لكن في البرمجة غرضية التوجه سوف نقوم بكتابة إجراء (procedure) واحد بحيث يقوم بعمل 10 أزرار باستغلال (Sender : TObject) الظاهر في الإجراء حيث خانة الكتابة Edit1 سوف تجمع الكتابة السابقة لها و تعبير الزر (caption) أي
Edit1.Text := Edit1.Text + (Sender as TButton).Caption
وهذا السطر سيكون في الإجراء السابق ويعبر عن كل الأزرار حين النقر عليها، أي
B1 : OnClick : B0Click
B2 : OnClick : B0Click
B3 : OnClick : B0Click
…
B8 : OnClick : B0Click
B9 : OnClick : B0Click
و سنحصل على:
http://up103.arabsh.com/files/d3dh6k6nbpyuqpoq0d9h.jpg
ثم نذهب بالنسبة لكل زر من 1 حتى 9 إلى Event ونختار من قائمة الخاصة بـ OnClick الإجراء B0Click
http://up103.arabsh.com/files/oympimuxxq712r9tr5wz.jpg
الآن تذهب إلى الزر c ، ننقر عليه مرتين ونكتب الكود التالي:
Edit1.Text := '0'
بالنسبة لزر المؤشر SIGNAL ننقر مرتين عليه ثم نكتب الكود :
Edit1.Text := FloatToStr(- StrToFloat(Edit1.Text))
FloatToStr: تحول العدد الصحيح Float إلى متغير كتابي String
StrToFloat: تحول متغير كتابي String إلى العدد الصحيح Float
ننتقل الآن إلى العمليات
نصعد في الكود حتى نجد
var
Form1: TForm1;
نضيف المتغير Operation وإذا أردنا أن نحدد عملية الجمع كعملية أساسية عندما لا يحدد المستعمل ماذا يريد يصبح لدينا
var
Form1: TForm1;
Operation : Integer = 4 ;
الآن ننقر مرتين على الزر / أو BDiv و نكتب الكود :
إذا كان Edit1.Text غير فارغ إذاً n1 تأخذ قيمة Edit1.Text على شكل عدد صحيح
Operation تأخذ قيمة Tag الخاص بزر العملية المختارة
Edit1 تصبح فارغة
If Edit1.Text <>'' Then n1 := StrToFloat(Edit1.Text) ;
Operation := (Sender as TButton).Tag ;
Edit1.Clear ;
ثم بالنسبة لأزرار *، -، + نذهب إلى Event ونختار من قائمة الخاصة بـ OnClick الإجراء BivClick
أما الزر الفاصلة ننقر مرتين على BVer ثم نضع الكود:
Edit1.Text := Edit1.Text + DecimalSeparator;
حتى الآن لقد قمنا بالعمل البسيط، ولكي نواصل لا بد من إنشاء متغيرين صحيحين n1 و n2
بعد Var
var
Form1: TForm1;
Operation : Integer = 4 ;
N1 : Real = 0 ;
N2 : Real = 0 ;
نلاحظ "=0" وهي توجه المصنف compiler أنه عند إنشاء المتغيرين أعطهم العدد 0، وبهذا سيكون لدينا n1=0 و n2=0 في البداية
الآن النتيجة:
الإجراء كما يلي:
إذا كانت قيمة edit1.Text فارغة إذاَ Edit1.Text تأخذ القيمة '0'
N2 تأخذ قيمة Edit1.Text على شكل عدد صحيح
حالة Operation من
1: إذا كانت قيمة n1 و n2 تساويان الصفر إذاَ
أظهر نافذة خطأ تحتوي على الرسالة 'نتيجة العملية غير محددة'
خروج من الإجراء
وإلا إذا كانت قيمة n2 تساوي الصفر إذاَ
أظهر نافذة خطأ تحتوي على الرسالة ' القسمة على الصفر مستحيلة '
خروج من الإجراء
وإلا النتيجة = n1 /n2
2: النتيجة = n1 ×n2
3: النتيجة = n1 -n2
4: النتيجة = n1 +n2
نهاية الحالة
Edit1.Text تأخذ قيمة النتيجة على شكل كتابة
procedure TForm1.BEgalClick(Sender: TObject);
begin
if Edit1.Text = '' Then Edit1.Text := '0';
n2 := StrToFloat(Edit1.Text);
Case Operation of
1 : begin
if (n1 = 0) and (n2 = 0) then begin
messagedlg('نتيجة العملية غير محددة',mtError,[mbOk],-1);
exit
end
else
if n2 = 0 then begin
messagedlg('القسمة على الصفر مستحيلة',mtError,[mbOk],-1);
exit
end
else Resultat := n1/n2;
end;
2 : Resultat := n1*n2;
3 : Resultat := n1-n2;
4 : Resultat := n1+n2;
end;
Edit1.Text := FloatToStr(Resultat);
end;
الآن البرمجة عندما يدخل المستعمل الأرقام عبر لوحة المفاتيح:
للتحكم في إدخال لوحة المفاتيح هناك إجراء يساعدنا للمزيد أنظر
http://www.delphi4arab.com/forum/showthread.php?t=5
ننقر على Form1 مرة واحدة ثم نذهب إلى Event و بالتحديد OnKeyPress ثم ننقر مرتين على الخانة المواجهة
نكتب الكود التالي:
if key in ['+','-','*','/'] then
begin
if key = '+' then BOper(BAdd)
else if key = '-' then BOper(BDiff)
else if key = '*' then BOper(BMult)
else if key = '/' then BOper(BQuot);
Key := #0;
exit;
end;
if Key in ['=', #13] then
begin
BEgaleClick(BEgale);
Key := #0;
exit;
end;
if key in ['.',','] then
begin
key := DecimalSeparator;
end;
if not (Key in [#8, '0'..'9', DecimalSeparator]) then Key := #0;
في الأخير ننقر مرة واحدة على الواجهة Form ثم نتوجه إلى Properties عند BorderIcons نعطي لـ biMaxisimize القيمة False
ملاحظة: البرنامج غير كامل على القراء بعد التطبيق إكتشاف الأخطاء سواء من الناحية البرمجية أو من ناحية عمله في نظام التشغيل
وأرحب بكل التعليقات
****ا أن يكون الدرس خفيفا ومفيدا لكل مستجد في الدلفي
تحياتي
merouane
22-02-2008, 12:31 AM
السلام عليكم
تصحيحا للأخطاء
سهوا
ثم بالنسبة لأزرار *، -، + نذهب إلى Event ونختار من قائمة الخاصة بـ OnClick الإجراء BivClick
ثم بالنسبة لأزرار *، -، + نذهب إلى Event ونختار من قائمة الخاصة بـ OnClick الإجراء BDivClick
هنا كنت برمجت بإنشاء إجراء BOper
لكن للتسهيل حافظت على BDivClick
if key in ['+','-','*','/'] then
begin
if key = '+' then BOper(BAdd)
else if key = '-' then BOper(BDiff)
else if key = '*' then BOper(BMult)
else if key = '/' then BOper(BQuot);
Key := #0;
exit;
end;
if Key in ['=', #13] then
begin
BEgaleClick(BEgale);
Key := #0;
exit;
end;
if key in ['.',','] then
begin
key := DecimalSeparator;
end;
if not (Key in [#8, '0'..'9', DecimalSeparator]) then Key := #0;
التصحيح
if key in ['+','-','*','/'] then
begin
if key = '+' then BDivClick(BAdd)
else if key = '-' then BDivClick(BDiff)
else if key = '*' then BDivClick(BMult)
else if key = '/' then BDivClick(BDiv);
Key := #0;
exit;
end;
if Key in ['=', #13] then
begin
BEgaleClick(BEgale);
Key := #0;
exit;
end;
if key in ['.',','] then
begin
key := DecimalSeparator;
end;
if not (Key in [#8, '0'..'9', DecimalSeparator]) then Key := #0;
فعذرا
:)
merouane
22-02-2008, 12:56 AM
تصدق كنت اكتب درس مشابه لكن باختلافات صغيرة
وفيك بركة أخي DeltaAziz
أود أن تضع درسك لأنك والظاهر أكثر تجربة مني في مجال الشروحات
وأيضا لكي نتعلم منك ومن خبرتك
تقبل تحياتي :)
delphi555
23-02-2008, 06:30 PM
السلام عليكم
بارك الله فيكم اخواني
merouane
23-02-2008, 09:36 PM
السلام عليكم
بارك الله فيكم اخواني
وعليكم السلام
و فيك بركة أخي
:)
Free_M
06-12-2008, 02:29 PM
الف شكر اخ مروان على الشرح الاكثر من رائع
اتضحت لي الكثير من الامور بعد درسك والحمد لله
كنت قد برمجة الة حاسبة لكن اغلب اكوادها كان بالباسكال :rolleyes:
شكرا شكرا مرة اخرى
سفيان أبو أنس
19-03-2010, 03:49 AM
شكرا على الدرس الرائع
فقط عندي ملاحظة
الآلة الحاسبة تجمع بين عددين فقط
وهذه المشكلة حصلت معي
لو وضعنا مثلا 3+3+3
ستعطيك النتيجة 6
لأنها مبرمجة لحساب n1 و n2 فقط
يا ريت لو تطور الآلة الحاسبة أكثر
جزاكم الله خيرا
B.M.AbdelAziZ
19-03-2010, 11:54 AM
لو وضعنا مثلا 3+3+3
ستعطيك النتيجة 6
يا ريت لو تطور الآلة الحاسبة أكثر
السلام عليكم ورحمة الله
هذا درس للانطلاق وليس برنامج كامل
على المتلقي التفكير بنفسه بالتكملة
ان واجهتك مشكلة يمكنك طرح سؤال بقسم الاسئلة
kachwahed
20-03-2010, 11:13 AM
الأخ nabilsoft مرحبا بك في المنتدى
هنا تجد آلة حاسبة تكاد تكون (تقريبا) مكتملة:
http://www.delphi4arab.com/forum/showpost.php?p=3572&postcount=13
vBulletin® , Copyright ©2008-2012