الكائنات المخزنة في المتغيرات المتغيرة
يمكن تخزين الكائنات في المتغيرات المتغيرة. يمكن أن يكون هذا مفيدًا عندما تحتاج إلى التعامل بكفاءة مع أنواع البيانات المختلفة، بما في ذلك الكائنات. على سبيل المثال، يجب أن يكون لجميع العناصر في المصفوفة نفس نوع البيانات. قم بتعيين نوع بيانات الصفيف إلى Variant لتخزين الكائنات مع أنواع البيانات الأخرى في نفس الصفيف.
صفيف
إذا كانت لديك خبرة في البرمجة بلغات أخرى، فيجب أن تكون على دراية بمفهوم المصفوفات. بفضل المصفوفات، يمكنك الرجوع إلى سلسلة من المتغيرات بنفس الاسم وتحديدها عدديا (مفهرسة). في العديد من المواقف، يمكن أن يؤدي استخدام المصفوفات إلى تقصير البرامج وتبسيطها لأنه يمكنك تصميم حلقة باستخدام قيم الفهرس للتعامل مع المواقف المتعددة بكفاءة. للمصفوفات حدود علوية وسفلية، وعناصر المصفوفة متصلة ضمن الحدود العلوية والسفلية. لأن Visual Basic يخصص مساحة لكل قيمة فهرس، لا تقم بتعريف صفيف كبير بشكل غير واقعي.
لاحظ أن المصفوفات التي تمت مناقشتها في هذا القسم هي صفائف من المتغيرات المعلنة في البرنامج. وهي تختلف عن صفائف التحكم، التي يتم تحديدها في وقت التصميم عن طريق تعيين خاصية الفهرس لعنصر التحكم. المصفوفات المتغيرة تكون دائمًا متجاورة؛ على عكس صفائف التحكم، لا يمكن تحميل عناصر المصفوفة أو إلغاء تحميلها من منتصف المصفوفة.
جميع العناصر في المصفوفة لها نفس نوع البيانات. بالطبع، عندما يكون نوع البيانات متغيرًا، يمكن أن يحتوي كل عنصر على أنواع مختلفة من البيانات (كائنات، سلاسل، قيم، وما إلى ذلك). يمكن الإعلان عن مصفوفات من أي نوع بيانات أساسي، بما في ذلك الأنواع المعرفة من قبل المستخدم (راجع "إنشاء أنواع البيانات الخاصة بك" في الفصل الثامن، "البرمجة مرة أخرى") ومتغيرات الكائنات (انظر الفصل التاسع، "البرمجة باستخدام الكائنات").
هناك نوعان من المصفوفات في Visual Basic: المصفوفات ذات الحجم الثابت - والتي تظل دائمًا بنفس الحجم، والمصفوفات الديناميكية التي يمكن أن يتغير حجمها في وقت التشغيل. ستتم مناقشة المصفوفات الديناميكية بالتفصيل في "المصفوفات الديناميكية" لاحقًا في هذا الفصل.
قم بتعريف مصفوفة ذات حجم ثابت
هناك ثلاث طرق للإعلان عن مصفوفة ذات حجم ثابت، وتعتمد الطريقة التي تستخدمها على النطاق الصالح الذي يجب أن يحتوي عليه المصفوفة:
لإنشاء مصفوفة عامة، قم بتعريف المصفوفة باستخدام العبارة العامة في قسم التصريح بالوحدة النمطية.
لإنشاء صفيف على مستوى الوحدة النمطية، قم بتعريف الصفيف باستخدام عبارة PRivate في قسم التصريح بالوحدة النمطية.
قم بإنشاء صفيف محلي وقم بتعريف الصفيف باستخدام العبارة الخاصة في هذه العملية.
تعيين الحدود العلوية والسفلية
عند الإعلان عن مصفوفة، يتبع اسم المصفوفة حد أعلى محاط بين قوسين. يجب ألا يتجاوز الحد الأعلى نطاق نوع البيانات الطويل (-2,147,483,648 إلى 2,147,483,647). على سبيل المثال، قد يظهر إعلان المصفوفة التالي في قسم الإعلان في الوحدة النمطية:
DimCounters(14)AsInteger '15 العناصر.
DimSums(20) كعناصر مزدوجة 21.
لإنشاء مصفوفة عامة، استبدل Dim مباشرةً بـ Public.
العدادات العامة (14) كعدد صحيح
PublicSums(20) كمزدوج
يستخدم نفس الإعلان Dim في الإجراء: DimCounters(14)AsIntegerDimSums(20)AsDouble يقوم الإعلان الأول بإنشاء مصفوفة تحتوي على 15 عنصرًا، مفهرسة من 0 إلى 14. ينشئ الإعلان الثاني مصفوفة تحتوي على 21 عنصرًا، مفهرسة من 0 إلى 20. الحد الأدنى الافتراضي هو 0.
لتحديد حد أدنى، استخدم الكلمة الأساسية To لتوفير حد أدنى صريح (لنوع البيانات الطويل):
عدادات خافتة (1 إلى 15) كعدد صحيح
DimSums(100To120)AsString
في العبارة السابقة، العدادات لها قيم فهرس تتراوح من 1 إلى 15، بينما المجاميع لها قيم فهرس تتراوح من 100 إلى 120.
المصفوفات التي تحتوي على مصفوفات أخرى
من الممكن إنشاء صفائف من أنواع البيانات المتغيرة وتحديد موقعها مع صفائف من أنواع البيانات المختلفة. يقوم التعليمة البرمجية التالية بإنشاء صفيفين، أحدهما يحتوي على أعداد صحيحة والآخر يحتوي على سلاسل. ثم قم بتعريف مصفوفة متغيرة ثالثة ووضع المصفوفات الصحيحة والسلسلة فيها:
PrivateSubCommand1_Click()
DimintXAsInteger 'الإعلان عن متغير العداد.
"قم بتعريف ووضع مجموعة من الأعداد الصحيحة."
DimcountersA (5) كعدد صحيح
فورنتكس=0To4
العدادات أ(intX)=5
نيكستينتكس
"قم بإعلان ووضع مجموعة من السلاسل."
DimcountersB(5)AsString
فورنتكس=0To4
countersB(intX)=hello
نيكستينتكس
DimarrX(2)AsVariant 'قم بتعريف مصفوفة جديدة تضم عضوين.
arrX(1)=countersA() 'انقل المصفوفات الأخرى إلى المصفوفة.
arrX(2)=عداداتB()
MsgBoxarrX(1)(2) 'عرض كل عضو في المصفوفة.
MsgBoxarrX(2)(3)
EndSub
مصفوفة متعددة الأبعاد
في بعض الأحيان يكون من الضروري تتبع المعلومات ذات الصلة في المصفوفة. على سبيل المثال، لتتبع كل بكسل على شاشة الكمبيوتر، تحتاج إلى الرجوع إلى إحداثيات X وY الخاصة به. في هذا الوقت، يجب استخدام المصفوفات متعددة الأبعاد لتخزين القيم. يمكن الإعلان عن المصفوفات متعددة الأبعاد باستخدام Visual Basic. على سبيل المثال، تعلن العبارة التالية عن صفيف ثنائي الأبعاد 10×10 ضمن الإجراء.
StaticMatrixA(9,9) كمزدوج
يمكنك الإعلان عن أحد البعدين أو كليهما بحد أدنى واضح:
StaticMatrixA (1To10،1To10) كمزدوج
كل هذا يمكن تعميمه على المصفوفات ذات أكثر من بعدين. على سبيل المثال:
ديممولتي د (3،1 إلى 10، 1 إلى 15)
يقوم هذا الإعلان بإنشاء مصفوفة ثلاثية الأبعاد بحجم 4×10×15. العدد الإجمالي للعناصر هو حاصل ضرب الأبعاد الثلاثة، وهو 600.
لاحظ أنه عند زيادة أبعاد المصفوفة، ستزداد مساحة التخزين التي تشغلها المصفوفة بشكل ملحوظ، لذا يجب استخدام المصفوفات متعددة الأبعاد بحذر. كن حذرًا جدًا عند استخدام المصفوفات المتغيرة لأنها تتطلب مساحة تخزين أكبر.
استخدام الحلقات للتعامل مع المصفوفات
يمكنك استخدام حلقات For المتداخلة لمعالجة المصفوفات متعددة الأبعاد بشكل فعال. على سبيل المثال، في MatrixA، يتم تعيين قيمة لكل عنصر بناءً على موضعه في المصفوفة:
DimIAsInteger,JAsInteger
StaticMatrixA (1To10،1To10) كمزدوج
ForI=1To10
ForJ=1To10
مصفوفةA(I,J)=I*10 J
التاليج
التاليأنا
مزيد من المعلومات لمزيد من المعلومات حول الحلقات، راجع قسم "بنيات الحلقات" لاحقًا في هذا الفصل.
مجموعة ديناميكية
في بعض الأحيان يكون حجم المصفوفة غير معروف. لذلك آمل أن أتمكن من تغيير حجم المصفوفة في وقت التشغيل.
يمكن للمصفوفات الديناميكية تغيير الحجم في أي وقت. في Visual Basic، تعد المصفوفات الديناميكية هي الأكثر مرونة وملاءمة، مما يساعد على إدارة الذاكرة بشكل فعال. على سبيل المثال، يمكنك استخدام مصفوفة كبيرة لفترة قصيرة ثم تحرير مساحة الذاكرة للنظام عندما لا يكون المصفوفة قيد الاستخدام.
إذا كنت لا تستخدم مصفوفة ديناميكية، فقم بإعلان مصفوفة بأكبر حجم ممكن، ثم قم بمسح العناصر غير الضرورية. ومع ذلك، إذا تم استخدام هذه الطريقة بشكل مفرط، فسوف تتسبب في إبطاء بيئة تشغيل الذاكرة.
لإنشاء مصفوفة ديناميكية، اتبع الخطوات التالية:
1. (إذا كنت تريد أن يكون المصفوفة مصفوفة عامة، إذن) قم بإعلان المصفوفة باستخدام العبارة العامة، أو (إذا كنت تريد أن يكون المصفوفة على مستوى الوحدة النمطية، إذن) قم بإعلان المصفوفة باستخدام العبارة Dim على مستوى الوحدة النمطية أو (إذا كنت تريد أن يكون المصفوفة مصفوفة محلية، إذن) في استخدم عبارة Static أو Dim لتعريف المصفوفة أثناء الإجراء. قم بتعريف المصفوفة بأنها ديناميكية عن طريق إلحاق جدول أبعاد فارغ بها.
ديمديناراي ()
2. استخدم عبارة ReDim لتخصيص العدد الفعلي للعناصر.
ريديمديناراراي(X 1)
يمكن أن تظهر عبارات ReDim ضمن الإجراءات فقط. تختلف عبارة ReDim عن عبارة Dim والبيان الثابت، وهي عبارة عن عبارة قابلة للتنفيذ. وبسبب هذا البيان، يقوم التطبيق بتنفيذ عملية في وقت التشغيل. تدعم عبارة ReDim بناء جملة مماثل لتلك المستخدمة مع المصفوفات الثابتة. لكل بعد، يمكن لكل عبارة ReDim تغيير عدد العناصر والحدود العلوية والسفلية. ومع ذلك، لا يمكن تغيير أبعاد الصفيف.
ريديمديناراي(4to12)
على سبيل المثال، استخدم المصفوفة الديناميكية Matrix1 التي تم إنشاؤها على مستوى الوحدة لأول مرة:
DimMatrix1()AsInteger
ثم قم بتخصيص مساحة للمصفوفة في الإجراء:
SubCalcValuesNow()
.
.
.
ريديم ماتريكس 1(19,29)
EndSub
يخصص بيان ReDim هنا مصفوفة عددية 20 × 30 للمصفوفة (إجمالي حجم العنصر هو 600). هناك طريقة أخرى لاستخدام المتغيرات لتعيين حدود المصفوفات الديناميكية:
ريديم ماتريكس 1 (س، ص)
لاحظ أنه يمكنك تعيين سلسلة إلى صفيف بايت متغير الحجم. يمكن أيضًا تعيين صفيف بايت لسلسلة ذات طول متغير. من المهم ملاحظة أن عدد البايتات في السلسلة سيختلف باختلاف النظام الأساسي. تحتوي نفس السلسلة على ضعف عدد البايتات الموجودة على نظام Unicode الأساسي كما هو الحال على نظام أساسي غير Unicode.
الحفاظ على محتويات مجموعة ديناميكية
في كل مرة يتم فيها تنفيذ عبارة ReDim، يتم فقدان جميع القيم المخزنة حاليًا في المصفوفة. يقوم Visual Basic بإعادة تعيين قيمة عنصر الصفيف إلى فارغ (لصفيف متغير)، إلى 0 (لصفيف رقمي)، إلى سلسلة ذات طول صفري (لصفيف سلسلة)، أو إلى لا شيء (لصفيف من الكائنات) .
يعد هذا مفيدًا عند إعداد مصفوفة للبيانات الجديدة، أو عندما تريد تقليل حجم المصفوفة لتوفير الذاكرة. في بعض الأحيان تريد تغيير حجم المصفوفة دون فقدان البيانات الموجودة في المصفوفة. يمكن القيام بذلك باستخدام عبارة ReDim مع الكلمة الأساسية Preserve. على سبيل المثال، يؤدي استخدام الدالة UBound للإشارة إلى الحد العلوي إلى توسيع المصفوفة وإضافة عنصر دون فقدان قيمة العنصر الموجود:
ريديمبريسيرفيديناراي(UBound(DynArray) 1)
عند استخدام الكلمة الأساسية "الاحتفاظ"، يمكنك فقط تغيير الحد الأعلى للبعد الأخير في مصفوفة متعددة الأبعاد؛ وإذا قمت بتغيير الحد الأدنى للأبعاد الأخرى أو البعد الأخير، فسيحدث خطأ في وقت التشغيل. لذا يمكن برمجته كالتالي:
ReDimPreserveMatrix(10,UBound(Matrix,2) 1)
بدلا من البرمجة مثل هذا:
ReDimPreserveMatrix(UBound(Matrix,1) 1,10)
للحصول على معلومات أكثر تفصيلاً حول المصفوفات الديناميكية، راجع "وظيفة ReDim" في مرجع اللغة. للحصول على معلومات حول صفائف الكائنات، راجع الفصل 9، "البرمجة باستخدام الكائنات".
->