Professional Documents
Culture Documents
المتغيّرات
المتغيّرات :Variables
ألنك تستطيع تغيير متغي ٍ
راتّ ، وطبعا ُس ّميت ّ المتغيرات بتخزين ِ
القيم أثناء تنفيذ البرنامج.. أي لغة برمجة ،تقوم
ً ّ كما في ّ
ٍ
لحظة أثناء تنفيذ البرنامج. أي
قيمها في ّ
والمتغير7
ّ المتغير" 7اسم المستخدم" UserName 7يمكن أن تُوضع به القيمة "محمد"..
ّ اسم وقيمة ..فمثال:
وللمتغير ٌ
ّ
"الخصم" Discountيمكن أن تُوضع به القيمة .0.35
بين عالمتَ ْي تنصيص ،بينما
تم وضعها َ أن القيمتين "محمد" و 0.35مختلفتان ،فاألولى 7نص Stringلهذا ّ
تالحظ هنا ّ
ُ
رقمية .Numeric Valueالثانية قيمة ّ
أسماء أو مخازن للقيمّ ..إنها كذلك ِكيانات ّ
ذكيةٌ لتخزين ٍ مجرد
المتغيرات في VB.NETليست ّ ّ فإن
وكما ذكرنا سابقاّ ،
وإ جراء العمليات على القيم ..باختصارّ :إنها كائنات ،Objectsلها وسائلها 7وخصائصها الخاصة بها.
متغيرا (كائنا) من النوع "تاريخ" :Date
ف ّ تعر ُ
فمثال :هذه الجملة ّ
Dim Expiration As Date
ٍ
بجملة كالتالية: ويمكنك وضع تاريخ في هذا المتغير
Expiration = #1/1/2003#
المتغير مثل:
ّ بل ويمكنك 7إجراء بعض العمليات على هذا
)Expiration.AddYears(3
األول ..هذا التاريخ الجديد يمكن تخزينه ٍ
تاريخ جديد ،يزيد بثالث سنوات عن التاريخ ّ
ٌ العملية
ّ سيكون ناتج هذه
ُ حيث
متغير آخر كالتالي:
أي ّ في ّ
Dim NewExpiration As Date
)NewExpiration = Expiration.AddYears(3
تتغير قيمته ،بعد إجراء العملية التي تقع على يمينها..
أن المتغير الذي يقع على يسار عالمة "=" ،هو فقط الذي ّ
الحظ ّ
أي أن قيم المتغيرين ستكون كما بالجدول:
ٍ
جملة واحدة ..مثال: المتغير وتغيير 7قيمته في أن بإمكانك قراءة
ّ كما ّ
)Expiration = Expiration.AddYears(3
يخزن التاريخ الجديد
حيث يقرأ المترجم التاريخ الموجود في المتغير ،Expirationويضيف عليه ثالث سنوات ،ثم ّ
المتغير ..بعد تنفيذ هذه العملية ،ستصير 7قيمة المتغير Expirationهي.#1/1/2006# :
ّ في نفس
أن معظم الوظائف 7التي تحتاجها للتعامل مع التواريخ و األرقام والنصوص ،تمنحها لك اللغة
الجمي ُل في األمر ،هو ّ
جاهزةً ،لتريحك من عناء كتابتها من البداية.
نعرف المتغيّر:
لماذا ّ
بعض االختالفات عن VB6في التعامل مع المتغيرات:
الشروط الواجب توافرها عند تعريف المتغيرات:
نعرف المتغيّر؟:
لماذا ّ
ملحوظة:
زرا ،وانسخ الكود
أي كود موجود 7في أمثلة هذا الفصل ،فأنشئ 7تطبيقا جديدا ،وضع على النموذج ّ
لو أردت تجربة ّ
الزر.
إلى حدث ضغط هذا ّ
أيسر بالنسبة لمترجم 7الكود ّ ِ ِ
األمر َ
إن هذا يجعل َ المتغيرات أوال قب َل استخدامهاّ .. تعريف
ُ7 يجب
في معظم لغات البرمجةُ ،
ٍ
العتبارات في تنظيم الذاكرة، متغيرا ،عليه أن ُينشئه في الذاكرة ،ونتيجة
مرة يصادف المترجم ّ ،Compilerففي ك ّل ّ
مما ُيبطئ 7البرنامج ..ولكن لو كان المترجم 7يعرف كل متغيرات البرنامج فإن مثل هذه العملية تستهلك بعض الوقتّ ،
سيتحسن األداء ألقصى درجة.
ّ وأنواعها سلفا قبل أن يبدأ ترجمة البرنامج ،ففي هذه الحالة
لقد كانت من أشهر سمات ،VBعدم إرغامه للمبرمج على تعريف ك ّل المتغيرات ..لقد صارت هذه السمة منتقدةً اآلن
المتغير ُيم ّكن المترجم من
ّ بشد ٍة ،ليس فقط لألسباب المتعلّقة بسرعة الترجمة وكفاءة األداء ،ولكن أيضا ألن تعريف
ّ
اصطياد أخطاء كثير ٍة ،سواء في وقت التصميم Design Timeأو وقت الترجمة ،Compile Timeبدال من أن
ك في وقت التشغيل .Runtimeتُفاجئ َ
تعرف متغيرا من النوع "تاريخ" ،:Date</spanال يمكن أن يسمح لك المترجم بوضع عدد صحيح
فمثال :عندما ّ
Integerفيه ..أيضا لن يسمح لك المترجم باستخدام 7خاصية "شهر" Month 7الخاصة بالمتغيرات 7من النوع "تاريخ"
متغير من النوع "عدد صحيح" .Integer ،Dateمع ّ
المتغيرات يم ّكن المترجم 7من اصطياد 7مثل هذين النوعين من األخطاء ،أثناء كتابتك للكود ،فال تكاد تترك
ّ إن تعريف
متعرجا ،لو حلّقت فوقه بالفأرة ،فسيظهر لك تلميح على الشاشة يصف
طا ّ السطر الذي كتبتها به ،حتّى يضع تحته خ ً
الخطأ الذي ارتكبته.
التلقائي ،لن يسمح لك باستخدام المتغيرات بدون تعريف،
ّ فإن المترجم 7في VB.NETفي الوضع
لكل تلك األسبابّ ،
إال إذا طلبت أنت ذلك منه صراحةً ـ كما سنرى فيما بعد ـ وذلك على عكس الوضع الذي كان في .VB6
المتغير ..وللتسهيل ،يمكنك استخدام رموز األنواع التراثية في لغة البيزيك ،مثل $التي
ّ مطلوب منك أيضا ،تحديد نوع
ترمز للنصوص ..فمثال يمكنك كتابة:
Dim Note$
نص ّي ..ولو حلّقت بالفأرة فوق 7هذا السطر في بيئة التطوير ،لظهر لك تلميح على
كمتغير ّ
ّ المتغير Note
ّ لتعريف
الشاشة مكتوب فيه التالي:
Dim Note As String
تماما.
أن الجملتين متكافئتين ً
ّمما يعني ّ
حجمه بوحدات
األعداد التي يقبلها النوع
الذاكرة Bytes
من 0إلى .255 1 وحدة ذاكرة Byte
وحدة ذاكرة ذات
من 128-إلى .127 1
إشارة SByte
قصيرShort 7
من – 32768إلى 32767 2
Int16
صحيح Integer
من 2147483648-إلى 2147483647 4
Int32
طويل Long
جدا.
يقبل أرقاما كبيرة ّ 8
Int64
العادية ..وهو يمثّل
ّ لألعداد ذات الدقّة العشرية 4 مفرد Single
األعداد السالبة :من – 3.402823E38إلى –
، 1.401298E–45واألعداد الموجبة من
1.401298E–45إلى .3.402823E38
وفي 7هذا النوع ،ال يمكن تمثيل الصفر بدقّة ،فهو
جدا جدا ،ولكنها أبدا ليست
يمثّل دائما بقيمة صغيرة ّ
صفرا!
لألعداد ذات الدقّة العشرية الفائقة ،وهو يستخدم في
8 مزدوج Double
العلمية.
ّ الحسابات
والعشرية ،حيث يم ّكنك من
ّ لتمثيل األعداد الصحيحة
العشرية التي تريد التعامل معها ،من 0
ّ تحديد الدقّة 16 عشري Decimal
عشرية.
ّ إلى 28خانة
ملحوظة:
أن هذا الرقم يساوي7:
الرمز Eفي عدد مثل E –45 1.401298هو طريقة الكمبيوتر لتمثيل األس العشري ،أي ّ
.45 - 10 × 1.40129
العملية
ّ صحة إجراء
العمليات المتداخلة ،وذلك حتّى تضمن ّ
ّ أهمّية وضع األقواس في
ويجب أن ألفت انتباهك إلى ّ
الحسابية يسير تبعا للقواعد التالية:
ّ العمليات
ّ الطبيعي الذي يجرى به VB
ّ7 إن الترتيب
بالترتيب الذي تريدها بهّ ..
يتم تنفيذ ما بين األقواس أوال.
ّ -
يتم تنفيذ األسس أوال.
-إذا لم تكن هناك أقواس ّ
يتم تنفيذ الضرب والقسمة.
ثم ّّ -
يتم تنفيذ الجمع والطرح.
ثم بعد ذلك ّ
ّ -
فإن الصيغة:
لهذا ّ
)8^(1/3
التكعيبي للعدد ..8ولكن لو أزلت األقواس
ّ العملية هي الجذر
ّ ألن القوس ينفّذ أوال ،فتصبح
تعطي الناتج ،2وذلك ّ
كالتالي:
8^1/3
العملية كالتالي:
ّ ألن األس ينفّذ أوال ،فتصبح
فإن الناتج سيكون ،2.666666وذلك ّ ّ
8/3
جيدا.
فانتبه لهذا ّ
متغير بمقدار 1مثال؟
هام ..ماذا لو أردت أن نزيد قيمة ّ
شيء ّ
ٌ بقي
في هذه الحالة سنقوم 7بالتالي:
X=5
Y=X+1
المتغير X = Y ' 6
ّ صارت قيمة
المتغير
ّ ثم نقلنا قيمته إلى
األصلي مع الواحدّ ،
ّ المتغير
ّ متغير وسيط ،جعلنا قيمته هي ناتج جمع
حيث اعتمدنا على ّ
األصلي.
المتغيرات أو إنقاصها ،أو ضربها في
ّ تتكرر مرارا في البرمجة ،حيث تحتاج مرارا لزيادة قيم
العملية ّ
ّ ولكن مثل هذه
ّ
رقم ...إلخ.
مرة ،لصارت البرمجة جحيما ال ُيطاق! فلو كان على المبرمج أن يكتب هذه الخطوات في ك ّل ّ
العملية في سطر واحد مباشرةً كالتالي:
ّ ال تقلق ..يمكنك أداء هذه
X=X+1
ٍ
وهلة ستبدو 7لك الصيغة غريبة ،ولكن حاول أن تقرأها كالتالي :قيمة Xالجديدة تساوي قيمته القديمة .1 + ألول
ّ
العمليات أيضا مباحة:
ّ وال يشترط أن أجمع على المتغير الرقم 1 7فحسب ،فهذه
X = X + 13
X=X+X
Y=5
X=X+Y
الحسابية:
ّ العمليات
ّ يمتد إلى باقي
وال يقتصر األمر على الجمع فحسب ،بل ّ
المتغير بمقدار X = X – 4 '4
ّ إنقاص
المتغير في X = X * 2 ' 2
ّ ضرب
المتغير على X = X / 9 ' 9
ّ قسمة
المتغير لألس X = X ^ 3 ' 3
ّ رفع
تقدمه لك ،VB.Netعن طريق استخدام الرموز7
إضافيا ّ
ّ ولكن هناك تسهيال
ّ كان هذا هو ما اعتاده مبرمجو ..VB6
كيفية استخدامها:
=+و ..=^ ،=/ ،=* ، =-والجدول التالي يريك ّ
التقليدية
ّ الطريقة الطريقة المختصرة المكافئة
X=X+1 X+=1
X=X+Y X += Y
X=X–4 X -= 4
X=X*2 X *= 2
X=X/9 X /= 9
X=X^3 X ^= 3
ملحوظة:
العملية في الغالب تُعيد
ّ ألن هذه
أن الناتج سيكون ،Doubleوذلك ّ
عملية ،تعتبر اللغة ّ
أي ّ عند استخدام األس ^ في ّ
األدق أن تكتب الصيغ التي بها أسس كالتالي:
ّ فإن
أرقاما 7كبيرة ..لهذا ّ
Dim X As Integer = 3
)X = CInt (X^2
حيث استخدمنا دالة التحويل إلى عدد صحيح ،CIntوذلك حتّى ال يعترض VBإذا كان خيار التحويل الدقيق
للعملية في هذه الحالة!
ّ فعاال ..Option Strict Onولألسف ال توجد صيغة مختصرة
)Console.WriteLine(ShortInt.MinValue
)Console.WriteLine(ShortInt.MaxValue
)Console.WriteLine(Int.MinValue
)Console.WriteLine(Int.MaxValue
)Console.WriteLine(LongInt.MinValue
)Console.WriteLine(LongInt.MaxValue
ستتسبب في خطإ تجاوز أقصى قيمة للمتغير '
ّ الجملة التالية
ٍShortInt = ShortInt.MaxValue + 1
تسبب أي خطأ '
لكن الجملة التالية لن ّ
Int = ShortInt.MaxValue + 1
للمتغير '
ّ ستتسبب في خطإ تجاوز الحد األدنى
ّ الجملة التالية
Int = Int.MinValue – 1
اختبار األعداد العشريّة:
العشرية للعدد المفرد :Single
ّ استخدم هذا الكود الختبار 7الدقّة
Dim A As Single
A=1/3
)Console.WriteLine(A
ستجد أن نافذة المخرجات Output windowستعرض لك النتيجة التالية ،0.3333333 :حيث تالحظ وجود 7
عشرية.
ّ خانات
عدل الكود للتالي:
واآلن ّ
Dim A As Single
A = 100000/ 3
)Console.WriteLine(A
إن
مما ال يمنحك الدقّة التي تريدها ،بل ّ
عشريتين فحسبّ ،
ّ أن الناتج هو ،33333.34حيث يحتوي 7على خانتين
ستجد ّ
يؤدى إلى
مقربا حتّى بطريقة صحيحة ،فالمتوقّع 7أن يكون الناتج ..!! 33333.33مثل هذا الخطإ يمكن أن ّ
الرقم ليس ّ
يسمى بتراكم الخطإ ،Error Propagationحيث قد تنشأ أخطاء ملموسة عند إجراء مجموعة من العمليات
ما ّ
المتتابعة على األعداد المفردة.
واآلن دعنا نقوم بنفس العمليتين السابقتين ،ولكن مع استخدام المتغير المزدوج:Double 7
Dim B As Double
B=1/3
)Console.WriteLine(B
B = B * 100000
)Console.WriteLine(B
أن شاشة المخرجات ستعرض النتيجتين كما يلي:
ستجد ّ
0.333333333333333
33333.3333333333
أن النتيجتين أكثر دقّة.
واضح طبعا ّ
العشرية ،بين النوعين المفرد والمزدوج:
ّ وإ ليك مثال آخر ،لتوضيح الفرق في دقّة تمثيل األعداد
Dim A As Single, B As Double
A = 0.03007
B = 0.03007
)Console.WriteLine(A - B
ستفاجأ بأن الناتج لن يكون صفرا ،وبدال من ذلك ستعرض نافذة المخرجات الرقم:
6.03199004634014E-10
ولكنه
الذي يكافئ .. 0.000000000603199004634014واضح ّأنه رقم صغير جدا ،بما يكفي العتباره صفراّ ،
ليس صفرا!
مما يجعلهما غير متماثلين،
يتم بها تمثيل المفرد والمزدوج 7في الذاكرةّ ،
إن ذلك الخطأ يرجع الختالف الطريقة التي ّّ
حتّى ولو حمال نفس الرقم!
لهذا يجب أن تحتاط للتالي:
العشرية.
ّ متغيرين من نوعين مختلفين في الدقّةالحسابية على ّ
ّ -ال تُ ِ
جر عملياتك
العشرية بجملة كالتالية:
ّ -ال تحاول مقارنة عددين من نوعين مختلفين في الدقّة
If A = B Then
ألنك لن تضمن أداء البرنامج في هذه الحالة ..واألفضل أن تستخدم جملةً كالتالية:
ّ
If (A - B) < 0.000001 Then
معين ،يمكنك اختياره على حسب برنامجك ،ففي هذه الحالة يمكنحد ّ فلو كان الفارق بين العددين أصغر من ّ
اعتبار العددين متساويين.
اختبار وجود "ما ال نهاية" و" ليس رقما" :Testing For Infinity And NaN
و"إنها ما ال نهاية" ،IsInfinity
ّ "إنه ليس رقما" IsNaN
األمر بسيط :للتحقّق من هاتين القيمتين ،استخدم الدالتينّ :
اللتين تجدهما من أعضاء المتغيرات المفردة والمزدوجة.
ولمعرفة إشارة الما ال نهاية ،استخدم الدالتين" :إنها ما ال نهاية سالبة" IsNegativeInfinityو" إنها ما ال نهاية
موجبة" .IsPositiveInfinity
توضيحي:
ّ وإ ليك مثال
Dim Var1, Var2 As Double
Dim Result As Double
Var1 = 0
Var2 = 0
Result = Var1 / Var2
If Result.IsInfinity(Result) Then
If Result.IsPositiveInfinity(Result) Then
)"هذا رقم كبير جدا ..ال يمكن االستمرار"(MsgBox
ما ال نهاية سالبة ' Else
)"هذا رقم صغير جدا ..ال يمكن االستمرار"(MsgBox
End If
ElseIf Result.IsNaN(Result) Then
)"خطأ غير متوقع في الحسابات"(MsgBox
لم يحدث أي خطأ' Else
): " & Result.ToStringالنتيجة هي"(MsgBox
End If
مالحظة:
رغم أن الدوال IsInfinityو IsPositiveInfinityو IsNegativeInfinityو IsNaNهي من أعضاء
المتغير ،Resultإال ّإنها ال تنطبق عليه ،لهذا اضطررنا 7إلرسال المتغير Resultكمعامل لها ،ليتم إجراء الدالة
ّ
منطقية للتعامل مع هذه الدوا ّل:
ّ أن الصيغة التالية هي األكثر
عليه ..هذا األمر يقتضي ّ
)System.Double.IsInfinity (Result
للمتغير.
ّ األساسية Base Class
ّ الخلية
أي من هذه الدوال من خالل ّ وذلك بالتعامل مع ّ
مطمئن ،كالتالي:
ّ ولكن الصيغة السابقة قد تبدو طويلة ..ال تقلق ..يمكنك أن تكتبها مختصرة وأنت
)Double.IsInfinity (Result
تعريف:
طبق على الكائن الذي تنتمي إليه (بدون إرساله كمعامل بين قوسيها) ،هي دوال مشتركة "
الدوال التي ال تُ ّ
األساسية ،Base Classوذلك ما فعلناه مع الدالة .IsInfinity
ّ الخلية
،"Sharedيمكن استخدامها 7كذلك من ّ
المتغيرات المنطقية :Boolean Variables
تخزن واحدةً فقط من القيمتين" :صواب" Trueو"خطأ" ،False 7وهي في األساس أعداد صحيحة،
المنطقية ّ
ّ المتغيرات
فالقيمة "صواب" 7تعادل ،1-والقيمة "خطأ" تعادل صفرا ..وفي الواقع ،أي قيمة غير صفرية ،تعتبر .True
ويمكنك تعريف المتغيرات من هذا النوع ،بجملة كالتالية:
Dim Failure As Boolean
المبدئية .False
ّ المتغير
ّ ابتدائية ،فستكون قيمة
ّ تحدد قيمةً
ولو لم ّ
إن ك ّل التعبيرات التالية متاحة:
المتغير Failure؟ّ ..
ّ ولكن كيف نضع القيم في
Dim Failure As Boolean = True
Failure = False
منطقية ' )(Failure = CheckFailure
ّ دالة تعيد قيمة
عملية مقارنة ،كالتالي:
أي ّ المتغير Failureنتيجة ّ
ّ الحد ،بل يمكن أن تضع في
وال يتوقّف 7األمر عند هذا ّ
"" = Failure = TextBox1.Text
مرة أخرى مع وضع قوسين ،حتّى يسهل علينا فهمه: أن هذا التعبير قد يكون غريبا عليك ..تعال نعيد كتابته ّ
أعرف ّ
)"" = Failure = (TextBox1.Text
صحة العالقة الموجودة بين القوسين ،فإذا كانت صحيحة ،يضع القيمةاآلن سيفعل VBما يأتي :سيتحقّق أوال من ّ
المتغير .Failure
ّ المتغير ،Failureوإ ن كانت خاطئة ،يضع القيمة Falseفي ّ Trueفي
التقليدية المكافئة لها:
ّ أهمّية هذه الصيغة ،تعال نكتبها بالطريقة
ولكي تدرك مدى ّ
If TextBox1.Text = "" Then
Failure = True
Else
Failure = False
End If
أن الصيغة األولى تختصر خمسة أسطر في سطر واحد فقط! جدا ّ
واضح ّ
النص به كلمات أم فارغا،
ّ مربعات
تفعل أو تمنع تفعيل أحد األزرار 7،تبعا لما إذا كان أحد ّ
وعلى هذا ،لو أردت أن ّ
النص:
ّ مربع
تغير حروف ّ فاكتب السطر التالي في حدث ّ
_ Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal
e As System.EventArgs) Handles TextBox1.TextChanged
"" >< Button1.Enabled = TxtElem.Text
End Sub
المنطقية في اختبار الشروط ،كالتالي:
ّ وتُستخدم 7المتغيرات
العملية"(If Failure Then MsgBox
ّ )"ال يمكن إكمال
المنطقية "و" " ،ANDأو" " ، ORليس" ،NOT
ّ منطقيين أو أكثر ،باستخدام 7العمليات
ّ ويمكن تكوين عالقة بين متغيرين
الحصرية" :XOR
ّ "أو
" Then Exit Subتجاهل الخطأ" >< If Failure = True And TextBox1.Text
الثنائية Bit
ّ العمليات
ّ المنطقية فقط ،بل تستخدم 7كذلك في
ّ المتغيرات
ّ وال تستخدم المعامالت Andو Orو Notمع
العد الثنائي ..Binaryعليك بقراءته في ملحق .2لتتعرف على نظام ّبد لك من وقفةّ ،
..Wise Operationsهنا ال ّ
صيّة String Variables
المتغيّرات النّ ّ
صيّة:
تعريف المتغيّرات النّ ّ
تشبيك النصوص :Concatenation
مقارنة النصوص:
صيّة:
تعريف المتغيّرات النّ ّ
يتم تعريفها كالتالي:
Dim SomeText As String
نص ،مها كانت مكوناته (حروف ،رموز 7،أرقام ،عالمات تنسيق ...إلخ) ،ومهما كان
أي ّاآلن يصبح بإمكانك أن تضع ّ
طوله (يمكن أن يصل إلى 2جيجا بايت ،أي 2مليار حرف!).
النص ّي:
ّ المتغير7
ّ وهذه الجمل تُريك كيف تستخدم
Dim AString As String
المتغير" = AString
ّ "اكتب ما تريد في هذا
نصي فارغ ' "" = AString متغير ّ
المتغير نصا جديدا أطول من القديم" = AString
ّ "ولكن بإمكانك أن تكتب بهذا
رقمية ،ويمكن استخدام دوال التحويل '
ّ هذا نص يحتوي على قيمة
للتعامل معها كرقم وليس كنص '
"AString = "25000
النص يوضع 7بين عالمتي تنصيص ..وهذا بالتأكيد سيدفعك للتساؤل :ماذا لو أردت أن أضع عالمة
ّ أن
طبعا الحظت ّ
متغير؟
التنصيص نفسها في ّ
في هذه الحالة يجب أن تكتب أربع عالمات تنصيص كالتالي:
"""" = Dim AString As String
وهناك ح ّل آخر ،هو استخدام الدالة Chrللتعبير عن عالمة التنصيص كالتالي:
)Dim AString As String = Chr(34
سؤال آخر سيراودك :ما الفارق بين التعبيرين التاليين:
Dim ANumber As Integer = 25000
"Dim AString As String = "25,000
إن كال المتغيرين يحمل قيمة مختلفة عن اآلخر:
النص ّي AStringيحتوي على ستة حروف ،وهي " "2و " "5و " ",و " "0و " "0و " ،"0بينما العدد
ّ -1فالمتغير
الصحيح ANumberيحتوي 7على رقم 7واحد هو .25000
الستّة في 12
النص ّي يخزن حروفه ّ
ّ المتغير
ّ -2بما أن كل حرف يتم تخزينه في وحدتي 7ذاكرة ،Bytes 2فإن
يخزن العدد الصحيح العدد 25000في 4وحدات فقط. وحدة ذاكرة ،بينما ّ
المتغير
ّ الحسابية ،وتستخدم7
ّ النص ّي AStringفي العمليات
ّ المتغير7
ّ فإن بإمكانك أن تستخدم
ولكن برغم هذه الخالفاتّ ،
صّية ،حيث يقوم VBبالعمليات الالزمة للتحويل بين النوعين (ما لم تمنعه من الن ّ
العمليات ّ
ّ الرقمي ANumberفي
ّ
القيام بذلك ،باستخدام 7جملة .)Option Strict On
مقارنة النصوص:
نصين عن طريق عالمة "=" كالتالي:
يمكنك مقارنة تساوي ّ
"محمد" = ", Y As Stringمحمد" = Dim X As String
If X = Y Then
)"النصان متساويان"( MsgBox
ّ
End If
نصين،
كما يمكن استخدام عالمة عدم التساوي( "><" 7وهي عبارة عن عالمة < تليها عالمة >) للتأ ّكد من اختالف ّ
كالتالي:
"أحمد" = Y
)"النصان مختلفان"( If X <> Y Then MsgBox ّ
النصين باستخدام 7عالمتى "<" و ">" وذلك لتعرف من منهما يسبق اآلخر في الترتيب
ّ والطريفّ 7أنك تستطيع مقارنة
النص األصغر:
ّ الهجائي هو
ّ يكون األسبق منهما في الترتيب
ُ األبجدي ،حيث
ّ
أبجديا"(If Y < X Then MsgBox
ّ )"أحمد يسبق محمد
معينة أم ال ..انظر
النص يحتوي على صيغة ّ Pattern
ّ كما يمكنك استخدام المعامل "يشبه" Likeلمعرفة إذا ما كان
للمثال التالي:
نص للتجريب" = Dim S As String "هذا ّ
)"الكلمة موجودة"( *" Then MsgBoxنص*" If S Like
ِ
الحروف مهما كانت هذه الحروف ،ومهما كان عددها أي عدد من
الحظ استخدامنا للعالمة "*" ،وهي تقوم بديال عن ّ
(يمكن أن يكون هذا العدد صفرا!).
ٍ
واحد فقط مهما كان هذا الحرف ،والعالمة #كبديل ٍ
لحرف اإلنجليزية "?" كبديل
ّ ويمكن استخدام عالمة االستفهام
لألرقام (من 0إلى .)9
انظر لألمثلة التالية:
نص للتجريب" = Dim S As String "هذا ّ
عملية التساوي '
ّ خاصة يكافئ
ّ عدم وجود عالمات
لن تظهر الرسالة ' )"الكلمة موجودة"( " Then MsgBoxهذا" If S Like
الص '
هل كلمة "هذا" تبدأ من الحرف الثاني في ّ
لن تظهر الرسالة ' )"الكلمة موجودة"( " Then MsgBoxهذا!" If S Like
النص '
ّ هل كلمة هذا هي آخر كلمة في
لن تظهر الرسالة ' )"الكلمة موجودة"( " Then MsgBoxهذا*" If S Like
النص بكلمة هذا وينتهي بكلم للتجريب '
ّ هل يبدأ
ستظهر الرسالة ' )"الكلمة موجودة"( " Then MsgBoxهذا*للتجريب" If S Like
مشدد '
حرف ّ
ٌ النص على حرف نون يليهّ هل يحتوى
ستظهر الرسالة ' )"الكلمة موجودة"( !ّ*" Then MsgBoxن*" If S Like
إما ٍ
لنعبر عن حرف واحد من الحروف 7الموجودة بين القوسين ..هذه الحروفّ 7
كما يمكن استخدام قوسين مضلّعين [ ] ّ
تعبر هذه الصيغة عن الحروف
أن تكتب متتالية مثل [ ،]ACdFوإ ّما أن تكتب على صورة مجال ،مثل [ ]g-yحيث ّ
النص يبدأ بحرف الهاء ،وهي محصورة بين حرفي الميم والياء:
ّ ألن
من gإلى ..yفمثال المقارنة التالية صحيحةّ ،
ستظهر الرسالة ' )"الكلمة موجودة"( ]*" Then MsgBoxم-ي[" If S Like
أي حرف من تلك الموجودة بين القوسين ،فضع في بداية القوسين عالمةالنص ال يحتوي 7على ّ
ّ أن
ولو أردت أن تتأ ّكد ّ
النص يبدأ بحرف الهاء ،وهي محصورة بين حرفي الميم والياء،
ّ ألن
! ..وفي المثال التالي ستكون المقارنة خاطئةّ ،
وهو عكس المطلوب:
لن تظهر الرسالة ' )"الكلمة موجودة"( ]*" Then MsgBoxم-ي![" If S Like
ملحوظة:
النص ،فضعها بين قوسين مضلّعين،
ّ الخاصة بالمعامل Likeفي
ّ أي عالمة من العالمات
إذا أردت البحث عن ّ
النص.
ّ أي موضع من
مثل استخدام الصيغة '*[?]*' للبحث عن عالمة االستفهام اإلنجليزية في ّ
مالحظة:
ال تستطيع مقارنة حرف بعدد مباشرة ..فجملة كالتالية هي جملة مرفوضة:
If Char1 = 5 Then Char1 = 40
والصحيح أن تستخدم الجملة التالية:
)If Char1 = Chr(5) Then Char1 = Chr(40
هامة:
قاعدة ّ
منطقي أو كائن من
ّ حرفي أو
ّ نص ّي أو
رقمي أو ّ
ّ7 كل دالة لها قيمة معادة ،Return Valueهذه القيمة لها نوع ما،
أي نوع ..أبشر إذن :بمجرد كتابة نقطة بعد قوس الدالة ،سيظهر لك قائمة بكل خصائص ووسائل نوع القيمة
متغير
جدا ،فلو لديك ّ
المعادة ،حيث يمكنك استخدامها 7مباشرة ..مثل هذه الطريقة تم ّكنك من كتابة جمل معقّدة ّ
نص ّي مثال ،يمكنك استدعاء إحدى دواله ،ولتكن قيمتها 7المعادة حرفا ،حيث يمكنك استدعاء إحدى دوال الحروف
ّ
المنطقية
ّ منطقية (صواب أو خطأ) ،حيث يمكنك استدعاء إحدى دوال المتغيرات
ّ منها ،ولتكن قيمتها المعادة
منها .... ،وهكذا..
معناه الرمز
عشرية في هذا الموضع ،فإذا كانت غير موجودة ،يتم وضع صفر مكانها ،وأنت ّ خانة
العشرية ال يؤثّر في قيمة العدد ،فالعدد 0.1 7هو
ّ أن الصفر على أقصى يمين العالمة
تعرف ّ 0
نفسه العدد .0.10
رقم يؤثّر 7في قيمة العدد في هذا الموضع (مثل الجزء الصحيح من العدد). #
عالمة عشرية في هذا الموضع. .
فاصلة في هذا الموضع. ,
مئوية في هذا الموضع.
عالمة ّ %
E+0
أن العدد 12 10 × 233يمثّله الكمبيوتر7
ّ سابقا ذكرنا ولقد ة.. يأس
ّّ صيغة في 7
م الرق لتنسيق E-0
e+0كالتالي.233E+12 :
e-0
أن الجزء التالي من النص سيعرض في سطر جديد.
سطر جديد ،بمعني ّ \n
لعرض نص بين عالمتي تنصيص. ""
مثال:
))"MsgBox (123.4890.ToString("#.00
ستعرض الرسالة الرقم مقربا إلى أقرب خانتين عشريتين' 123.49 :
وسيوضحها لك األمثلة التالية ،حيث وضعنا الناتج
ّ هامة ،هي الرموز 7المستخدمة لتنسيق 7التواريخ،
ما زالت لدينا نقطة ّ
كتعليق بجوار 7كل جملة:
))"Console.WriteLine(birthDate.ToString("d
'1/1/2000
))"Console.WriteLine(birthDate.ToString("D
'Saturday, January 01, 2000
))"Console.WriteLine(birthDate.ToString("f
'Saturday, January 01, 2000 12:00 AM
))"Console.WriteLine(birthDate.ToString("s
'2000-01-01T00:00:00
))"Console.WriteLine(birthDate.ToString("U
'Saturday, January 01, 2000 12:00:00 AM
ملحوظة:1
المنسق ،يمكنك استخدام الوسيلة ،Parseالتي تمتلكها ك ّل أنواع البيانات
ّ النص
ّ األصلي من
ّ الستعادة الرقم
الرقمية.
ّ
ملحوظة:2
الخاصة بـ VB6ما زال بإمكانك استخدامها 7حتّى اآلن ..هذه الدوا ّل هي:
ّ هناك مجموعة من دوال التنسيق7
تنسيق Formatـ تنسيق العملة FormatCurrencyـ تنسيق التاريخ والوقت FormatDateTime 7ـ تنسيق
مهمة استكشاف هذه الدوا ّل ،وإ ن
مئوي ..FormatPercentوسأترك لك ّ
ّ األرقام FormatNumberـ تنسيق
كنت ال أرى ّأنك ستحتاج إليها أصال!
أن هناك دافعا حقيقيا يدفعك الستخدام مثل هذه االختصارات ،إال إذا كنت من هواة إرباك نفسك!!
وال أرى ّ
الملف:
ّ الخاصّية ،بكتابة الجملة التالية في بداية
ّ ويمكنك أن توقف هذه
Option Strict On
أن خطوطا 7متعرجة قد ظهرت ،لتدل على وجود خطإ كالتالي:
وبهذا لن يمكنك تنفيذ المثالين السابقين ،حيث ستجد ّ
"خيار التحويل الدقيق يمنع التحويل التلقائي من نص إلى مزدوج" Option strict disallows implicit
.conversions from String To Double
الرقمية
ّ الضمنية ستصير 7مستحيلة ،فما زال التحويل بين أنواع المتغيرات
ّ أن كل أنواع التحويالتولكن هذا ال يعني ّ
المتغير األكبر ،كأن تضع "عددا صحيحا"Integer
ّ آليا ،ولكن في اتجاه واحد فقط :حينما تضع المتغير األصغر 7في
يتم ّ
في "عدد مزدوج" ..Doubleولكن العكس ليس مسموحا به ،كأن تحاول وضع "عدد مزدوج" Doubleفي "عدد
ألن هناك احتماال كبيرا أال يستوعب العدد الصحيح قيمة العدد المزدوج.
صحيح" ّ ،Integer
المتأخر" ..Late-bind 7أتذكر عندما كنا نبرمج أزرار
ّ وهناك شيء آخر سيمنعه خيار التحويل الدقيق ،ذلك هو "الربط
األرقام في تطبيق اآللة الحاسبة في الفصل السابق؟ ..لقد كان تعريف اإلجراء المستجيب لضغط الحدث كالتالي:
_ Private Sub Digit_Click(ByVal sender As System.Object,
_ ByVal e As System.EventArgs) HAndles Bt1.Click, Bt2.Click,
_ Bt3.Click, Bt4.Click, Bt5.Click, Bt6.Click,
Bt7.Click, Bt8.Click, Bt9.Click, Bt0.Click
End Sub
المتغير senderهو متغير عام من النوع "كائن" ،Objectيمكن أن يستقبل أي نوع من أنواع البيانات أو
ّ إن
وقلنا ّ
ألننا نعرف ّأنه سيستقبل الزر المضغوط ،فيمكننا 7كتابة جملة من نوع:
الكائنات ..ونظراّ 7
"sender.Text = "1
الخاصية ،Textال يستطيع مترجم
ّ المتغير senderعلى ّأنه زر ،وله
ّ المتأخر" ،فبينما 7تعامل أنت
ّ هذا هو "الربط7
ألن المترجم ال يقرأ الغيب ،وال
الكود أن يستوعب هذه المعلومة إال عند محاولة تنفيذ هذه الجملة عند تشغيل البرنامجّ ،
المتغير الذي سيستقبله المتغير العام senderقبل أن يستقبله بالفعل!
ّ يعرف ما نوع الكائن أو
لهذا عندما تكتب ،.senderوتظهر لك قائمة األعضاء ،لن تجد فيها خاصية ..Textبل لن تجد فيها إال دالة واحدة
ألن المترجم لن
خطيراّ ،
ً استخداما
ً هي "اقرأ نوع الكائن" ..GetTypeلهذا فإن استخدام التعبير sender.Textيعتبر
يهدد بحدوث أخطاء أثناء تشغيل
مما ّ
يستطيع أن يتحقّق من قدرة الكائن على تنفيذ الجملة التي كتبتها ،إال أثناء تنفيذهاّ ،
البرنامج وإ نهاء تشغيله.
لهذا فإن استخدام 7خيار "التحويل الدقيق" لن يسمح بمثل هذا االستخدام ،ويجب عليك ساعتها أن تستخدم "الربط المب ّكر"7
،Early-bindبتحويل نوع الكائن senderإلى زر ،كالتالي:
"CType(sender, Button).Text = "1
صحة الكود قبل تشغيل البرنامج.
أي شيء يتعامل ،ويمكنه أن يتحقّق من ّ
ففي هذه الحالة يعرف المترجم مع ّ
ملحوظة:
قلنا إن كتابة الخيارين:
Option Explicit Off
Option Strict On
تؤثّر 7على كل ملفات
الملف ..فماذا لو أردت أن ّ
ّ أي ملف من ملفات المشروع 7،يؤثّر فقط على هذا
في بداية ّ
المشروع؟7
في هذه الحالة ،يمكنك أن تختار هذين الخيارين من صفحات الخواص للمشروع الحالي ،وذلك بضغط زر الفأرة
األيمن على اسم المشروع 7في متصفّح المشاريع ،Solution Explorerوضغط" 7خصائص" Properties 7من
عامة لكل المشروع.
الموضعية ..وفي 7هذه الحالة ،ستكون اإلعدادات التي تختارها لهما ّ
ّ القائمة
التحويل بين أنواع المتغيّرات :Converting Variable Types
متغير آلخر:
في الجدول التالي ،ستجد الدوال التي تسمح لك بالتحويل من نوع ّ
تحول إلى
ّ الدالة
منطقي Boolean CBool
وحدة ذاكرة Byte CByte
حرف Unicode character CChar
تاريخ Date CDate
عدد مزدوج Double CDbl
عدد عشري Decimal CDec
عدد صحيح )Integer (Int32 CInt
عدد طويل )Long (Int64 CLng
كائن Object CObj
عدد قصيرShort (Int16) 7 CShort
عدد مفرد Single CSng
نص String
ّ CStr
مثال:
جرب ما يلي:
لتحويل عدد صحيح إلى عدد مزدوجّ ،
Dim A As Integer
Dim B As Double
)B = CDbl(A
فيم نحتاج ذلك؟
ولكن َ
عرفت عددين صحيحين كالتالي:
افترض ّأنك ّ
Dim A As Integer, B As Integer
A = 23
B=7
ٍ
جملة كالتالية: لو حاولت قسمة العددين ،23/7فسيكون الناتج عددا مزدوجا ..هنا سينتج خطأ عن
A=A/B
ولكن استخدام 7دالة التحويل ،يمكن أن ُيخلصك من هذا الخطإ:
)A = CInt(A / B
الدقّة العشرية للناتج ،ولو لم تكن تريد ذلك ،فعليك أن تعرف متغيرا مزدوجا 7تستقبل فيه
وإ ن كان الثمن هو ّأنك ستفقد ّ
الناتج:
Dim C As Double
C=A/B
تحدده لها ..إليك هذا المثال:
العامة "تحويل النوع" ،CTypeللتحويل إلى أي نوع ّ
كما أن بإمكانك استخدام 7الدالة ّ
"Dim A As String = "34.56
Dim B As Double
B = CType(A, Double) / 1.14
إجباري فقط في حالة عمل الخيار "التحويل 7الدقيق"Option 7
ّ فإن استخدام التحويل الصريح
وكما أوضحنا 7من قبلّ ،
الضمني قد ُيفسد
ّ ألن التحويل
ولكن األفضل دائما أن تراعي دقّة التحويل أثناء كتابتك للكود ،وذلك ّ
ّ ، Strict On
بعض البيانات ،مثل ما يحدث عندما تحاول وضع عدد مزدوج في عدد صحيح ،ففي هذه الحالة ستخسر الجزء
العشري من الرقم ،وهو ما قد ال تريده.
ّ
ولو أردت أن تعرف إذا ما كان المتغير 7مرتبطا بكائن أم ال ،استخدم جملةً كالتالية:
If B Is Nothing Then Exit Sub
مرة أخرى ،فاستخدم جملة كالتالية: المتغير بنسخة جديدة من الكائن ّ
ّ ولو أردت إعادة ربط هذا
B = New Button
ملحوظة:
الرقمية (العدد الصحيح ،Integerوالمفرد
ّ األساسية ذات القيمة
ّ أي نوع من أنواع البيانات
عند تعريف متغير 7من ّ
االفتراضية (صفر لألرقام و
ّ ،Singleوالمزدوج ،Doubleوالقيم المنطقية ..Booleanإلخ) فإنه يأخذ القيمة
الحرفية ،Charفهي
ّ والمتغيرات7
ّ النصّية ،String
ّ المتغيرات
ّ ولكن هذا ال ينطبق على
ّ المنطقية)..
ّ Falseللقيمة
مما
االبتدائية ّ ،Nothing
ّ فإنها تأخذ القيمة
مرجعية ،Reference Typeلهذا ّ
ّ ولكنها أنواع
رقميةّ ،
ليس أنواعا ّ
ولتنجب
ألي دالةّ ..
أي وسيلة من وسائلها أو عند محاولة إرسالها كمعامل ّيهدد بحدوث خطإ عند محاولة استخدامّ 7
ّ
أي أخطاء محتملة استخدم واحدا من الحلول التالية:
ّ
نصا فارغا "":
أي قيمة ،حتّى لو كانت ّ
النصي أو الحرفي ضع فيه ّ
ّ المتغير
ّ -بعد تعريف7
Dim X As String
"" = X
ابتدائية في سطر 7تعريفه:
ّ للمتغير قيمة
ّ -أو ضع
"" = Dim X As String
المتغير بنسخة جديدة بعد تعريفه:
ّ -أو اربط
Dim X As Char
X = New Char
المتغير فارغة القيمة "":
ّ المتغير منذ البداية ،حتّى يرتبط بنسخة جديدة من
ّ -أو استخدم كلمة Newفي تعريف7
Dim X As New Char
ملحوظة:
الرقمية ،مثل األعداد الصحيحة والمفردة
ّ المتغيرات
ّ ال يمكن استخدام 7التعبير TypeOf ….. ISمع أنواع
المرجعية Reference Typeمثل النصوصّ المنطقية ..يمكن استخدامها فقط مع األنواع
ّ والمزدوجة والقيم
يجب
ب من هذا االختالفُ ،تتعج َ
والحروف والكائنات Objectsواألنواع المشتقّة من الخاليا ..Classesوقب َل أن ّ
الرقمية ـ على خالف الحروف والنصوص ـ ليست في الواقع خاليا ،بل هي عبارة عنّ المتغيرات
ّ أن
أخبرك ّ
أن َ
سنتعرف عليها في نهاية هذا الفصل.
ّ يهمّنك..
تعرف ما هي السجالت؟ ..ال ّ
ُ7 سجالت ..Structuresماذا؟ ..ال
نصا
أي نوع ،حتّى لو كان ّ
تُرجع "صواب" ،Trueإذا كان معاملها رقما من ّ رقمي"
ّ "إنه
ّ
يحتوي على رقم. )(IsNumeric
تُرجع "صواب" ،Trueإذا كان معاملها تاريخا أو وقتا. ّإنه تاريخ"
)(IsDate
بأي كائن. إنّه ال شيء"
تُرجع "صواب" ،Trueإذا كان معاملها غير مرتبطّ 7
IsNothing
بأي كائن ..وهذه الدالة مماثلة
تُرجع "صواب" ،Trueإذا كان معاملها غير مرتبطّ 7 "إنه فارغ"
ّ
"إنه فارغ".)(IsNull 7
لدالة ّ VB6 )(IsDBNull
"إنه كائن"
تُرجع "صواب" ،Trueإذا كان معاملها كائنا ،وهي مماثلة لدالة ّ VB6 "إنه مرجع"
ّ
.)(IsObject )(IsReference
وسنتعرف 7على المصفوفات7
ّ تُرجع "صواب" ،Trueإذا كان معاملها مصفوفة.. IsArray
الحقا في هذا الفصل.
مجال المتغيّر :Variable Scope
المتغير واستخدامه.
ّ المتغير هو مقطع الكود الذي يمكن خاللَه رؤيةُ
ّ مجال
المتغير ،من المقاطع التالية:
ّ وهذا المجال ببساطة ،هو أصغر مقطع يوجد فيه
.Sub.. End Sub -
.Function.. End Function -
.If.. End If -
.For.. Next -
.Do.. Loop -
.While.. End While -
متغير يتم تعريفه في أحد هذه المقاطع ،ال يمكن التعامل معه إال داخل هذا المقطع ،هو وما ينتمي
أي ّ أن ّ
وهذا يعني ّ
فرعية ..وبهذا يمكن أن يحتوى البرنامج على عشرات المتغيرات بنفس االسم (مثل المتغير sender ّ إليه من مقاطع
ولكنها معزولة عن بعضها ،كل في نطاقه ومجاله ،بحيث
الذي تجده في معامل كل اإلجراءات المستجيبة لألحداث)ّ ،
تكون لك ّل منهما قيمته المستقلّة.
المتغير
ّ يسمى
موضعيا ،Local Variable 7بينما ّ
ّ متغيرا
المعرف على مستوى 7اإلجراء أو الدالة ّ
ّ المتغير
ّ سمى7
وي ّ
هذاُ ،
الخلية أو
المعرفة على مستوىّ 7
ّ المتغيرات
ّ أما
نعرفه داخل أحد المقاطع متغيرا 7مقطعيا ّ ..Block Variable
الذي ّ
فتسمى متغيرات مستوى القالب .Module-level Variables
القالبّ ،
متغير 7يحمل االسم :X
انظر لهذا المثال ،والحظ كم لدينا من ّ
)(Sub VarDomain
متغير خاص بهذا اإلجراء فقط' Dim I As Integer
If I = 3 Then
متغير خاص بجملة الشرط فقط ' Dim X As Integer = 3
End If
For I = 1 To 3
متغير خاص بجملة التكرار "من إلى" فقط ' Dim X As String
Next I
Do While I < 5
متغير خاص بجملة التكرار :نفذ بينما" فقط ' Dim X As Long
Loop
End Sub
ألن I
متغير اسمه Iداخل أي مقطع من مقاطع اإلجراء السابقّ ،
أن VBلن يسمح لك بتعريف ّ ورغم هذه المرونة ،إال ّ
المتغير الذي يحمل نفس
ّ موضعي سبق تعريفه على مستوى اإلجراء كلّه ،مما سيمنعك من استخدامه مع
ّ7 متغير
هو ّ
المتغير
ّ المتغير األصغر 7يحجب
ّ أن
تسمى هذا األمر "التظليل" ،Shadowingبمعنى ّ
اسمه داخل نفس المقطعّ ..
ألنهما يحمالن نفس االسم ،فال يمكن استخدام 7أكثر من واحد منهما في نفس المقطع.
األكبرّ ،
المتغيرين الحاملين لنفس االسم قد تم تعريفه على مستوى 7النموذج ،واآلخر
ّ ولكن حدوث هذا مقبول عندما يكون أحدّ
على مستوى 7اإلجراء ،ففي هذه الحالة يمكن التفريق بينهما كما في المثال التالي:
Public Class Form1
Inherits System.Windows.Forms.Form
Dim I As Int16 = 3
مالحظة:
ال يمكن تعريف 7مثل هذا النوع من المتغيرات على مستوى المقطع وال على مستوى اإلجراء أو الدالة.
تمتد كذلك لألدوات ،فلو لديك أداة على نموذج ،وتريد التعامل معها من
وال تقتصر كلمة Publicعلى المتغيرات ،بل ّ
الخاصة بهذه األداة إلى "عام" .Public
ّ خاصّية "المجال" Modifier
ّ نموذج آخر ،فيمكنك تعديل
ولكن هناك مشكلة :استخدام المجال العام للمتغيرات ،يجعلها قابلة لالستخدام 7من خارج المشروع 7نفسه ،من أي
ّ
مشروع آخر ُيضيف مرجعا لمشروعك ..فماذا لو لم تكن تريد حدوث ذلك؟
مرئيا في كل أجزاء المشروع،
المتغير ّ
ّ في هذه الحالة استخدم 7كلمة "صديق" Friendبدال من ،Publicفهي تجعل
ولكن ال يمكن استخدامه من خارجه من أي مشروع آخر:
Friend Var As Integer
عمر المتغيّر :The Lifetime of a Variable
المتغير هو الفترة التي يحتفظ خاللها بقيمته.
ّ عمر
المعرفة على مستوى 7المشروع 7تحتفظ بقيمتها طوال تشغيل البرنامج.
ّ -المتغيرات
المعرفة على مستوى النموذج ،توجد عند تحميل النموذج ،Loadولو حاولت استخدامها قبل تحميل
ّ -والمتغيرات7
النموذج ،فسيتم 7تحميل النموذج أوال ..وعند إنهاء تحميل النموذج ،UnLoadتنتهي هذه المتغيرات ،فلو أعيد
كأنما أعيد حجزها في الذاكرة من جديد.
تحميل النموذج ،توضع بها قيمها االبتدائيّة ّ
المعرفة داخل اإلجراءات ،تحتفظ بقيمتها إلى أن ينتهي اإلجراء ،حيث يتم تحرير الذاكرة منها ،فإذا
ّ والمتغيرات7
ّ -
عاد البرنامج إلى اإلجراء من جديد ،يتم حجزها من جديد ،ومنحها قيمها االبتدائية.
مالحظة:
ينتهي اإلجراء بإحدى ثالث جمل:
:End Sub -1وهي النهاية الطبيعية لإلجراء.
Exit Sub -2أو :Returnوهي نهاية طارئة ،تنهي اإلجراء عند حدوث سبب من األسباب.
:End -3وهي تنهي البرنامج كلّه.
ولكن من الممكن أن يغادر VBاإلجراء مؤقّتا ،نتيجة استدعاء إجراء آخر من داخله ..في هذه الحالة يتم االحتفاظ
طبيعية.
ّ األول بطريقة
الفرعي ،ويعود VB 7لتنفيذ اإلجراء ّ
ّ بقيم جميع المتغيرات كما هي ،حتّى ينتهي اإلجراء
الثوابت :Constants
عرف الثوابت؟
ون ّ
ف ُ المتغيرات ،فلماذا ال ِ
نعر ُ ّ وعرفنا
عرفنا ّ َ
ولكن هذه القيمة ال
ّ كالمتغيرات،
ّ سيقال هنا :هذا نوع من مخازن الذاكرة ،توضع فيه قيمة ،تماما يبدو ّأنك قد فهمت ما ُ
فهمت بالضبط 7ما هي الثوابت!
َ يمكن تغييرها 7بعد ذلك ،وستظ ّ7ل ثابتة طوال البرنامج ..مرحى :لقد
وهذه طريق 7تعريفها:
Const MyValue = 10
نعرف 7مثل هذه الثوابت؟
ولكن لماذا ّ
بمجرد
ّ فإنها تم ّكنك من تغيير الكثير من الحسابات
المتغيراتّ ،
ّ أهمّية كبيرة ..فبخالف ّأنها تُنفّذ أسرع من
إن لذلك ّ
ّ
متفرقة من
حسابية في مواضع ّّ عملية
المتغير MyValueفي ثالثين ّ ّ تغيير جملة واحدة ..افترض ّأنك تستخدم
أن القيمة 10غير مناسبة ،فكل ما عليك هو تغييرها 7في جملة التعريف ،ليتم تعديل كل
التطبيق ..اآلن لو اكتشفت ّ
الحسابية الثالثين دفعة واحدة:
ّ العمليات
Const MyValue = 15
تتخيل حجم المأساة ،لو كنت تستخدم العدد 10مباشرةً في حسابات العمليات الثالثين!! ..في هذه الحالة
ولكن حاول أن ّ
عملية شاقّة!
كلّما اكتشفت حاجتك لتغيير هذه القيمة ،فعليك البحث عن هذه الجمل واستبدالها ..يا لها من ّ
تحدد نوع الثابت لمترجم الكود ،كما يلي:
ويمكن أن ّ
"اسمي هو محمد" = Const MyValue As String
تحدد مجال الثابت ،بكلمة من الكلمات Public :أو Privateأو :Friend كما يمكن أن ّ
Public Const MyValue As Integer = 15
ومسموح لك باستخدام 7الثوابت في تعريف ثوابت أخرى ،فمثال :يمكن استخدام التعبير التالي لتعريف 7ثابت يحتوي على
التقريبية "ط":
ّ النسبة
Const Pi = Math.Pi
Const Pi2 = 2 * Pi
ولكن ليس مسموحا 7لك باستخدام الدوال في تعريف الثوابت ،فمثال :التعريف 7التالي غير مسموح به:
)Const Pi = Math.Log(Math.Pi
ملحوظة:
الدائرية Circular Declarationعند تعريف ثوابت بثوابت أخرى ..فمثال عند
ّ حاول أال تقع في التعريفات
تعريف:
Const Pi = Pi2 / 2
Const Pi2 = 2 * Pi
فأي منهما لن تكون له قيمة بدون اآلخر،
ستجد أن كال من التعريفين معتمد على اآلخر ،بطريقة ليس لها معنىّ ،
مما سيجعل المترجم 7يعرض رسالة خطإ. ّ
المصفوفات Arrays
ملحوظة:
عرفت مصفوفة من النوع "كائن" ،Objectفيمكنك أن تضع في كل
كل خانات المصفوفة لها نفس النوع ،ولكن لو ّ
خانة قيمة مختلفة في النوع عن األخرى.
} }Dim A(,) As Integer = { {10, 20, 30}, {11, 21, 31}, {12, 22, 32
الناتج Console.WriteLine(A(0, 1)) ' 20
الناتج Console.WriteLine(A(2, 2)) ' 32
ألن المصفوفة 3صفوف × 3أعمدة. الحظ أن أكبر خانة في المصفوفة السابقة هي (ّ ،)2،2
خاصّية "الرتبة" ،Rankالتي يمكنك استخدامها لمعرفة عدد
ّ خواص المصفوفة ،هي
ّ هامة من
لخاصية ّ
ّ هنا ستحتاج
أبعاد المصفوفة:
Dim Salaries(1,99) As Object
ستعرض الرسالة MsgBox(Salaries.Rank) ' 2
فإن الناتج
خاصّية "الطول" Lengthفي مصفوفة متعددة األبعادّ ،
ّ وأحب أن ألفت نظرك إلى شيء :عندما تستخدم7
سيكون هو الطول الكلّ ّي للمصفوفة ،الناتج من ضرب أطوال كل أبعادها:
ستعرض الرسالة "MsgBox (Salaries.Length) ' )100×2( "200
ولكن ماذا لو أحببت أن تعرف طول بعد بعينه؟ ..في هذه الحالة استخدم 7الدالة "اقرإ الطول" ،GetLengthوابعث لها
البعد الذي تقصده كمعامل:
الناتج Console.WriteLine(Salaries.GetLength(0)) ' 2
ملحوظة:
وأنها تتشابه مع صيغة تعريف الكائنات (باستخدام كلمة
خاصة ّ ّ قد يصيبك 7بعض االرتباك من الصيغة األخيرة،
تعرف عددا صحيحا منفردا: إن الجملة التالية ّ
ّ ..)New
)(Dim StudentAge As New Integer
جيدا ،وال
فستؤدي 7الجملة لتعريف 7مصفوفة أعداد صحيحة ..انتبه لهذا ّ
ّ بينما لو أزلت كلمة Newوتركت القوسين
تنس أن تحذف القوسين عند حذف كلمة Newحتّى ال يختلف معنى الجملة عن الذي تريده. َ
الجدير بالذكرّ ،أنك ال تستطيع 7استخدام كلمة Newفي تعريف مصفوفة كائنات ..فالجملة التالية مرفوضة تماما:
)(Dim X() As New Form1
فماذا تفعل لو أردت أن تنشئ نسخة جديدة من ك ّل كائن في خانات المصفوفة؟
في هذه الحالة استخدم هذه الصيغة:
})(Dim X() As Form1 = {New Form1
أي كائن تريده).
وبهذا تحصل على مصفوفة ،تحتوي 7ك ّل خانة منها على نسخة جديدة من النموذج (أو ّ
ثم حينما تجد نفسك أثناء البرنامج محتاجا لحجز عدد من الخانات ،استخدم 7تعبير"أعد تعريف" ReDimكالتالي:
)ReDim DynArray(UserCount
رقمي ،يحتوي على عدد أدخله المستخدم ،وليكن .20
ّ متغير
حيث UserCountهو ّ
خاصّية ،فهي ليست مثل ،Dimوال تظهر أبدا
ّ وجملة "أعد تعريف" ReDim 7ال تُستخدم فقط إال في إجراء أو دالة أو
على مستوى 7النموذج.
كما يمكن تحديد أبعاد المصفوفة بجملة :ReDim
Dim Matrix( , , ) As Double
)ReDim Matrix(9, 9, 9
ولكن ال يمكنك تغيير عدد هذه األبعاد فيما بعد ،فجملة كالتالية لن تكون مقبولة:
)ReDim Matrix(9, 9
وإ ن كان من الممكن تغيير طول أي بعد من األبعاد:
)ReDim Matrix(9, 2, 3
مالحظات:
-1ال يمكن تغيير نوع المصفوفة بجملة ..ReDimهذا هو السبب في غياب الجزء الخاص بتعبير Asمنها.
-2يمكن استخدام 7جملة ReDimلتغيير حجم المصفوفات ثابتة الحجم كذلك! ..انظر المثال التالي:
Dim X(3) As Integer
)ReDim X(4
إن اللغة تتعامل مع ك ّل المصفوفات على ّأنها مرنة ،لدرجة
إن المالحظة السابقة تقو ُل بوضوحّ :
-3في الواقعّ ،
ّأنك صرت تستطيع كتابة شيء كان ممنوعا في النسخ السابقة وفي 7باقي لغات البرمجة ،أال وهو تعريف عدد
بمتغير ،شريطةَ أن يكون قد تم تعريفه في أي سطر يسبق تعريف 7المصفوفة ،وذلك حتّى
ّ خانات المصفوفة
ابتدائية تضعها فيه أثناء تعريفه ،أو أي قيمة
ّ االفتراضية ،0أو أي قيمة
ّ مبدئية ،سواء القيمة
ّ تكون له قيمة
إن كل الجمل التالية
أخرى تضعها فيه بعد أن تتلقاها من مربع نص أو أي وسيلة إدخال يستخدمها 7المستخدمّ ..
مباحة:
Dim I As Integer
Dim X(I) As Integer ' I = 0
Dim I As Integer = 3
Dim X(I) As Integer
Dim I As Integer
)I = Val( Text1.Text
Dim X(I) As Integer
مالحظة:
المتأخرLate 7
ّ ألنه نوع من الربط
لن تعمل هذه الطريقة في حالة اختيار" 7التحويل الدقيق" ّ ،Option Strict On
،Bindingفالكود الذي تكتبه يشير 7إلى أن إحدى خانات المصفوفة تحتوي على مصفوفة أخرى ،وهو ما ال يمكن
صحته ،إال عند تنفيذ البرنامج بالفعل.
لمترجم 7الكود أن يتحقّق من ّ
مشروع المصفوفات:
المتغيرات والمصفوفات ..وسنفعل ذلك عن طريق
ّ نتدرب على استخدام بعض ما تعلّمناه حتّى اآلن عن
آن األوان لكي ّ
نص ،ويضعها في مصفوفة ،مانحا للمستخدم 7القدرة على عكس
مربع ّإنشاء تطبيق يأخذ القيم التي يدخلها المستخدم 7في ّ
أن VB.Netتمنحك اآلن وسائل جاهزة عكس المصفوفة وترتيبها7 هذه المصفوفة أو ترتيبها 7أو البحث فيها ..ورغم ّ
(سنتعرف 7عليها بالتفصيل في فصل المجموعات ،)Collectionsإال ّإنه سيكون تدريبا مفيدا أن نبني هذه
ّ والبحث فيها
األساسية ..ستجد هذا التطبيق في مجلّد هذا الفصل باسم
ّ البرمجية
ّ نتعرف 7على بعض المهارات
الوسائل بأنفسنا ،حتّى ّ
.Arrays
ابدأ بتصميم واجهة التطبيق 7كما في الصورة التالية:
"متعدد 7األسطر"MultiLine 7
ّ خاصية
ّ تغير
تنس أن ّ
النص ،ال َ
ّ مربع
وحتّى يستطيع 7المستخدم كتابة أكثر من سطر في ّ
إلى صواب .True
قراءة المدخالت:
الخاصية
ّ النص في خانة في مصفوفة ..أبسط طريقة لفعل هذا هو استخدام7
ّ مربع
نخزن ك ّل سطر في ّ نريد اآلن أن ّ
نصية ،تحتوي ك ّل خانة منها على سطر من سطور الخاصية تعيد لك مصفوفة ّ
ّ النص ..هذه
ّ بمربع
الخاصة ّ
ّ Lines
النص ..إذن فك ّل ما نحتاجه هو السطران التاليان:
ّ مربع
ّ
Dim Arr() As String
Arr = TextBox1.Lines
النص ،حتّى ال
ّ مربع
أن المستخدم قد أدخل بعض العناصر 7في ّولكن قبل أن نفعل ذلك ،يجب علينا أوال أن نتأ ّكد من ّ
نص فارغ.
مربع ّ
أي خطأ غير متوقّع نتيجةً للتعامل مع ّ يحدث ّ
لهذا سنتستخدم 7الكود التالي:
If TextBox1.Text = "" Then
النص أوال"(MsgBox
ّ مربع
نص في ّأي ّ
)"ال تحاول التذاكي علينا ..أدخل ّ
النص' )(TextBox1.Focus
ّ مربع
شر الكتابة في ّ
ضع مؤ ّ
العملية ' Exit Sub
ّ عدم إكمال
End If
البحث في المصفوفة:
أبسط طريقة يمكن أن نستخدمها 7للبحث في المصفوفة هي في نفس الوقت أسوأ وأبطأ 7طريقة ،وذلك بالمرور عبر ك ّل
بنص الخانة.
نص البحث ّ خانات المصفوفة خانة خانة ،ومقارنة ّ
يعد أسرع بكثير من الطريقة األولى.
وتوجد طرق أفضل للبحث ،مثل البحث الثنائي ،Binary Searchالذي ّ
جيدةً بالبرمجة
الثنائي يتطلّب معرفة ّ
ّ ألن البحث
نظرا ّ
ول ّكنا سنقتصر 7على كتابة الطريقة األولى في هذا الفصلً ،
وسنتعرف 7عليها بالتفصيل في الفصل القادم بإذن اهلل.
ّ االرتدادية ،Recursive Programming
ّ
التقليدي:
ّ البحث
َ تعا َل َنر
النص الذي يريد البحث عنه:
ّ في البداية يجب أن نطلب من المستخدم 7أن ُيدخل
)""(Dim S As String = InputBox
مربع اإلدخال فارغا ،فعلينا أال نقوم بالبحث:
فإذا ترك المستخدمّ 7
If S = "" Then
)"!نص البحث فارغ ..ال تحاول التذاكي علينا"( MsgBox
ّ
Exit Sub
End If
نص بحث ،فهذا هو الكود الذي يبحث عنه: فإذا كان هناك ّ
Dim Found As Boolean, I As Integer
)For I = 0 To Arr.GetUpperBound(0
If S = Arr(I) Then
نص البحث موجود في السطر رقم"(MsgBox ))ّ " + Str(I + 1
Found = True
يمكنك استخدام هذه الجملة لو أردت االكتفاء بالعثور على ّأول نسخة من النص '
' Exit For
ستستمر جملة التكرار لنهاية المصفوفة '
ّ ،ومن دونها
مرة '
النص أكثر من ّ
ّ وقد تعثر على نفس
End If
Next
النص فيجب أن نخبر المستخدم xبهذا '
ّ لو لم نجد
نص البحث"(If Found = False Then MsgBox يتم العثور على ّ
)"لم ّ
ترتيب المصفوفة:
هناك طرق عديدة لترتيب المصفوفات ،سنكتفي هنا بشرح إحداها ،وهي طريقة الفقّاعة ،Bubble Sortوسنحيل7
الطريقة األخرى 7األفضل واألسرع ـ وهي طريقة الترتيب السريع Quick Sortـ إلى الفصل القادم إن شاء اهلل.
أعرف ّأنك ستسألني 7في لماضة:
ظفات؟
-ما هو ترتيب الفقاقيع هذا؟ ..وهل لهذا عالقة بالصابون والمن ّ
األخف يطفو!
ّ نظرية:
ّ حق! ..فهذه الطريقة في الترتيب تستخدم
-يبدو ّأنك على ّ
ِ
بالماء! ..هل يبدو لك ّأنك أضفت لي جديدا؟ الع ِ
سر بعد ُ
الماء َ
َ فسر
-كمن ّ
-اصبر قليال وستفهم.
سيدي!
تفضل يا ّ
اللهم الروحّ .. -أطل ّ
يتم تبادل
-الحكايةُ وما فيها ّأننا سنقارن قيمة ك ّل خانة في الصفوفة بما يليها ،فإذا كانت الخانة التالية أصغرّ ،
إن هذا في النهاية سيجعل العناصر 7األصغر 7تطفو إلى بداية المصفوفة ..تماما كما الحاليةّ ..
ّ قيمتها 7مع الخانة
تفعل الفقاقيع حينما تتصاعد إلى سطح الماء.
ٍ
حاجة لبعض اإليضاح. ولكنني 7ما زلت في
-أعتقد ّأنني فهمتّ ،
عمليا.
-إذن فلنأخذ مثاال ّ
أن لدينا المصفوفة التالية:
افترض ّ
5
2
6
4
3
بد من مبادلتهما:
أن بها الرقم 5وهو أكبر من الرقم ..2 7إذن فال ّ
سنبدأ بمقارنة الخانة األولى بما يليها ..سنكتشفّ 7
2
5
6
4
3
وكأن شيئا لم يكن ..الفارق الوحيد ّأنها صارت تحتوي على الرقم
ّ سنستمر في مقارنة الخانة األولى بما يليها
ّ الحظ ّأننا
..2لحسن الحظّ ّأنه أصغر من الرقم 6 7والرقم 4والرقم .3
بد من "تعويم" الرقم 4
ولكنه أكبر من الرقم ..4إذن فال ّ
ننتقل اآلن للخانة الثانية ..سنجد أن الرقم 5أق ّل من الرقم ّ ،6
إلى أعلى:
2
4
6
5
3
2
3
6
5
4
2
3
5
6
4
وسنواصل 7المقارنة على الخانة الثالثة وفيها الرقم ..5سنجد ّأنه أق ّل من الرقم ..4فلنقُم بعمل الالزم:
2
3
4
6
5
2
3
4
5
6
المرقََّمات :Enumerators
ُ o
السجالت :Structures o
المرقََّمات Enumerators
ُ
المرقََّمات:
تعريف ُ
المرقّمات كمؤشّرات :Flags
بعض وسائل خليّة المرقّم :Enum Class
المرقََّمات:
تعريف ُ
المرقَّمات :وهي أنواع تحتوى على تعبيرات ّ
نصّية مناظرة لمجموعة من األرقام، من األنواع التي تستطيع 7تعريفهاُ ،
الستخدامها بدال من هذه األرقام 7عند كتابة الكود ،ليصبح أكثر سهولة ووضوحا عند قراءته.
المرقَّمات في بداية النموذج أو القالب أو ّ
الخلية كالتالي: عرف ُ وتُ ّ
اسم_المرقم Private Enum
تعبير = 1قيمة1
…….
تعبير_ن = قيمة_ن
End Enum
عام Publicأو "صديق" Friend 7للمرقّم 7بدال من .Private
إمكانية استخدام مجال ّ
ّ هذا مع
مثال :مرقّم 7أيام األسبوع:
Private Enum WeekDays
السبت = 0
Saturday = 0
األحد = 1
Sunday = 1
االثنين = 2
Monday = 2
الثالثاء = 3
Tuesday = 3
األربعاء = 4
Wednesday = 4
الخميس = 5
Thursday = 5
الجمعة = 6
Friday = 6
End Enum
واإلنجليزية ،ومنحنا 7اسمي نفس اليوم في اللغتين نفس الرقم ،حتّى يمكن استخدام
ّ بالعربية
ّ األيام
طبعا تالحظ ّأننا أسمينا ّ
دت فعل هذا حتّى أريك أن المرقّم يمكن أن يحتوي 7على أكثر من اسم لنفستعم ُ
أحدهما مكان اآلخر بدون قيود ..لقد ّ
الرقمية بدون مشاكل.
ّ القيمة
واآلن تعال نستخدم 7هذا النوع:
Dim X As WeekDays
السبتX = WeekDays.
)"القيمتان متكافئتان"( If X = WeekDays.Saturday Then MsgBox
الرقمي مباشرة ..فمثال الكود التالي مماثل تماما لذلك الذي في
ّ7 وال يوجد ما يمنعك من استخدام الرقم المناظر للتعبير
المثال السابق:
Dim X As WeekDays
X=0
)"القيمتان متكافئتان"( If X = WeekDays.Saturday Then MsgBox
ويمكن تعريف المرقّم على الصيغة المختصرة التالية:
Private Enum DigitNames
Zero
One
Two
Three
Four
Five
Six
Seven
Eight
Nine
End Enum
أن التعريف السابق هو
أي ّ
سيعتبر ّأول عضو هو القيمة صفر ،والثاني 7هو القيمة ..،1وهكذاّ ..
حيث في هذه الحالة ُ
اختصار لهذا التعريف:
Private Enum DigitNames
Zero = 0
One = 1
Two = 2
Three = 3
Four = 4
Five = 5
Six = 6
Seven = 7
Eight = 8
Nine = 9
End Enum
السجالت :Structures
كثيرا ما ستحتاج للتعامل مع مجموعات من المتغيرات مختلفة األنواع ،لتخزين سج ّل واحد من البيانات ،كأن تريد
تخزين سجالت عن الطلبة ،كل سجل يحتوي على اسم الطالب ورقمه وفصله ...إلخ.
عرف مثل هذا السج ّل Structureكالتالي:
ويمكنك أن تُ ّ
Structure Student
Dim Name As String
Dim ID As Integer
Dim StudentClass As Integer
End Structure
إي إجراء أو دالة ،وإ نما على مستوى النموذج أو القالب.
يكون داخل ّ
َ هذا التعريف 7ال يمكن أن
هامة:
ملحوظة ّ
فكأن
موضعيا Localللمقطع الذي يوجد بهّ ،
ّ المعرف باستخدام كلمة Dim
ّ المتغير
ّ أي موضع في اللغة ،يكون
في ّ
كلمة Dimمناظرة لكلمة ..Privateإال في مقطع السج ّل ،حيث تكون كلمة Dimمناظرة لكلمة ،Publicوبذلك
خاصا ،ال
ّ المتغير
ّ أما لو شئت أن تجعل
عاما قابال لالستخدام 7عبر اسم السج ّل في باقي البرنامجّ ..
المتغير ّ
ّ يكون
فعرفه باستخدام 7كلمة
يمكن استخدامه إال داخل مقطع السج ّل فقط ،وال يظهر اسمه في قائمة أعضاء السج ّلّ ،
.Private