المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : آلة حاسبة بسيطة بالدلفي


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