بسم الله الرحمن الرحيم ..
السلام عليكم ورحمة الله و بركاته ...
في موضوعنا الثاني من هذه السلسة السريعة و ددت إلقاء نظرة مقربة أكثر على الـ True و الـ False !
فقد استغرب بعض الاخوة عبارات وسطور برمجية معينة وجدوها في بعض برامجي تتعلق بإستخدامي للمتغيرات من النوع Boolean مما لفت انتباهي الى البعض يجهل حقيقة القيم False & True ... وهذا ما حدا بي الى جعل موضوعنا هذا في هذه السلسة لتوضيح هذا المفهوم البسيط بإذن الله تعالى ..
و الموضوع بالدرجة الاولى يهم المبتدئين فإذا سألت احدنا ما معنى ان يكون المتغير من النوع Boolean :
Dim A As Boolean
فسوف تكون الاجابة الطبيعية هي ان المتغير A إما ان يحتوي على القيمة True او القيمة False ..... و اذا استدركت قائلاً و ما معنى False & True ؟
ربما سيكون الأمر مربكاً للكثيرين ! ... و الحقيقة أن الامر لايدعو للإرتباك ابداً فهاتان القيمتان تمثلان قيم عددية صحيحة .. حيث أن :
كل قيمة عدا الصفر تعني True و اما الصفر فمعناه False !
و لانه ينبغي للـ True أن يمثل قيمة محددة فقد ثم اختيار القيمة سالب واحد ( -1 ) لتمثله ....
ملاحظة :
وددت ان اللفت انتباهاك عزيزي الى ان معظم لغات البرمجة الاخرى إن لم تكن جميعها تعتمد القيمة 1 لتمثل الـ True وتعتمد القيمة 0 لتمثيل الـ False .. بينما يمثل الـ True بالفجيوال بيسك بالرقم سالب واحد اما الـ False فبالصفر يمثل .
مجرد اثبات :
سيحتاج البعض الى أن اثبت ذلك عملياً حيث انك اذا كتبت :
MsgBox True
فإن الذي سيظهر في مربع الحوار هو True دون ادنى شك ... فما الذي يثبت انه يمثل في الاصل القيمة سالب واحد ..
و لكي نثبت هذه الحقيقة يمكننا الاستعانة بالرياضيات البسيطة فليس فينا من لا يعلم ان ضرب اي عدد كان بالواحد ينتج عنه نفس الرقم المضروب بالواحد ... خذ هذه الامثلة :
120 * 1 = 120 23 * 1 = 23 -50 * 1 = -50
والتي يتضح منها جلياً انه مهما كان الرقم سالباً ام موجبا فهو نفسه الذي ينتج بمرجد ضربه في العدد واحد ... وهو بالضبط ما سنستخدمه كفكرة بسيطة للإثبات بإذن الله تعالى .. فاليك هذه السطور :
True * 1 = -1 False * 1 = 0
ومنها يظهر ان الـ True يمثل سالب و احد كما ان الـ False يساوي صفر ... وذلك كالتالي :
-1 * 1 = -1 0 * 1 = 0
و لكي ترى ذلك رأي العيان استخدم التالي:
MsgBox True * 1 او استخدم MsgBox False * 1
و يمكنك ببساطة ان تتصفح الكود التالي وستنتج الذي سيظهر لك في مربع الحوار الناتج :
Dim N As Integer N = True MsgBox N
لا اظنك ابداً ستجد صعوبة بإذن الله تعالى في استنتاج الناتج في مربع الحوار الناتج .
وكذلك الحال اذا جربت المثال التالي :
Dim B As Boolean Dim I As Integer B = 123 I = B MsgBox B MsgBox I
في الشفرة السابقة يسهل استنتاج قيمة مربع الحوار الاول والتي ستكون بإذن الله تعالى True ( وذلك لانه وكما اسلفنا ان اي قيمة سوى الصفر تمثل الـ True ) غير انه قد يظن البعض ان الناتج في مربع الحوار الثاني سيكون قيمة المتغير I و التي ينبغي ان تكون 123 ... غير ان الناتج مخالف لذلك فعلى الرغم من ان قيمة المتغير B هي 123 و لكنها مباشرة ستعود الى قيمة الـ True الاساسية ( سالب واحد ) بمجرد مساوتها بالمتغير B الذي هو من النوع Boolean و بالتالي فأن القيمة التي ستخزن في المتغير I هي القيمة سالب واحد و ليس كما قد يظن البعض 123 ...
مثال آخير :
اذا طلبت ان نصمم برنامج بسيط فيه مربع نص TextBox اسمه مثلاً txt و زر امر Command1 و نريد ان نجعل الضغط على الزر يقوم بإخفاء مربع النص ثم اذا نقرنا على الزر مرة اخرى يعود مربع النص للظهور و اذا ضغطنا الزر اخرى اختفى مربع النص مرة اخرى وهكذا دواليك .... اي ان الضغط المستمر على الزر يقوم باخفاء و اظهار مربع النص بالترتيب ؟!
لتنفيذ البرنامج السابق سيكتب كلاً منا شفرته الخاصة مثل :
Private Sub Command1_Click() If txt.Visible = True Then txt.Visible = False Else txt.Visible = True End If End Sub
او ربما يكتب :
Private Sub Command1_Click() If txt.Visible = True Then txt.Visible = False Else txt.Visible = True End Sub
و لعلك تستخدم IIF كالتالي :
Private Sub Command1_Click() txt.Visible = True = IIf(txt.Visible = True, False, True) End Sub
واذا خطرت ببالك الدالة Switch فلست ابداً مخطئاً :
Private Sub Command1_Click() txt.Visible = Switch(txt.Visible = True, False, txt.Visible = False, True) End Sub
و ان فكرت في Choose فهي فكرة جميلة ولا ريب :
Private Sub Command1_Click() txt.Visible = Choose(Abs(txt.Visible) + 1, True, False) End Sub
او ربما تكون اكثر منطقية فتقول :
Private Sub Command1_Click() txt.Visible = Not txt.Visible End Sub
و الطرق التي قد ننتهجها لن يكون لها نهاية و لا تقتصر على ما سبق و لا على ماهو آت ... و لكني و بعد هذه المناقشة البسيطة اطمع في ان لا تستغرب ابداً اذا وجدت اكواد مثل :
Private Sub Command1_Click() txt.Visible = 1 + txt.Visible End Sub
او كالتالي :
Private Sub Command1_Click() txt.Visible = 2 + txt.Visible * 2 End Sub
ولعلك تستخدم :
Private Sub Command1_Click() txt.Visible = txt.Visible - True End Sub
او تكتب :
Private Sub Command1_Click() txt.Visible = True * txt.Visible - 1 End Sub
بل يمكنك ببساطة اعادة صياغة السطر السابق كالتالي :
Private Sub Command1_Click() txt.Visible = True * txt.Visible + True End Sub
و يمكنك بالتأكيد :
Private Sub Command1_Click() txt.Visible = Abs(txt.Visible) - 1 End Sub
وليس غريب ان تكتب :
Private Sub Command1_Click() txt.Visible = -txt.Visible - 1 End Sub
او هكذا :
Private Sub Command1_Click() txt.Visible = Abs(txt.Visible) + True End Sub
خاتمة :
من هذه المناقشة اتمنى ان تصل الجميع حقيقة القيمتين التي طالما استخدمناهما طويلاً في برامجنا ... و لعل الله ان ينفعنا بما علمنا انه هو السميع العليم !
السلام عليكم ورحمة الله و بركاته ...
