VB.NET: ما حدث للتحكم في المصفوفات

يعتبر حذف صفائف التحكم من VB.NET تحديًا لأولئك الذين يدرسون حول المصفوفات.

  • لم يعد من الممكن ببساطة نسخ عنصر تحكم ، مثل مربع نص ، ثم لصقه (مرة أو عدة مرات) لإنشاء مصفوفة تحكم.
  • كان رمز VB.NET لإنشاء بنية مشابهة لمجموعة مصفوفة ، في جميع الكتب على VB.NET التي اشتريتها وعبر الإنترنت ، أطول بكثير وأكثر تعقيدًا. تفتقر إلى بساطة تشفير مجموعة تحكم موجودة في VB6.

إذا كنت تشير إلى مكتبة التوافق VB6 ، فهناك كائنات هناك تشبه إلى حد كبير صفائف التحكم. لمعرفة ما أعنيه ، ما عليك سوى استخدام معالج ترقية VB.NET مع برنامج يحتوي على مجموعة تحكم. الرمز قبيح مرة أخرى ، لكنه يعمل. الأخبار السيئة هي أن Microsoft لن تضمن استمرار دعم مكونات التوافق ، وليس من المفترض أن تستخدمها.

رمز VB.NET لإنشاء "صفائف التحكم" واستخدامها أطول بكثير وأكثر تعقيدًا.

وفقًا لمايكروسوفت ، فإن القيام بشيء قريب حتى مما يمكنك القيام به في VB 6 يتطلب إنشاء "مكون بسيط يكرر وظائف مجموعة التحكم."

أنت بحاجة إلى فئة جديدة ونموذج استضافة لتوضيح ذلك. يقوم الفصل بالفعل بإنشاء وتدمير ملصقات جديدة. رمز الفصل الكامل كما يلي:

LabelArray للفئة العامة
نظام الوراثة. مجموعات. CollectionBase

instagram viewer

خاص للقراءة فقط HostForm As _
النظام. شبابيك. نماذج. شكل
الوظيفة العامة AddNewLabel () _
كنظام. شبابيك. نماذج. ضع الكلمة المناسبة
'إنشاء نسخة جديدة من فئة Label.
تعتيم التسمية كنظام جديد. شبابيك. نماذج. ضع الكلمة المناسبة
أضف التسمية إلى المجموعة
القائمة الداخلية.
أنا. قائمة. إضافة (aLabel)
أضف التسمية إلى مجموعة عناصر التحكم
'للنموذج المشار إليه بواسطة حقل HostForm.
هوستفورم. ضوابط. إضافة (aLabel)
'تعيين الخصائص الأولية لكائن التسمية.
aABel. الأعلى = العدد * 25
aABel. العرض = 50
aABel. اليسار = 140
aABel. العلامة = أنا. العد
aABel. Text = "Label" & Me. العد. إلى سلسلة
إرجاع a Label
وظيفة النهاية
عام فرعي جديد (_
مضيف ByVal كنظام. شبابيك. نماذج. شكل)
HostForm = المضيف
أنا. AddNewLabel ()
نهاية فرعية
افتراضي خاصية الملكية العامة للقراءة فقط
العنصر (فهرس ByVal كعدد صحيح) كـ _
النظام. شبابيك. نماذج. ضع الكلمة المناسبة
احصل على
إرجاع CType (Me. List. البند (فهرس) ، _
النظام. شبابيك. نماذج. ضع الكلمة المناسبة)
احصل على النهاية
نهاية الممتلكات
إزالة فرعية عامة ()
تحقق للتأكد من وجود ملصق لإزالته.
إذا أنا. العد> 0 ثم
'إزالة آخر ملصق تمت إضافته إلى الصفيف
'من مجموعة عناصر تحكم نموذج المضيف.
لاحظ استخدام الخاصية الافتراضية في
الوصول إلى الصفيف.
هوستفورم. ضوابط. إزالة (أنا (عدد - 1))
أنا. قائمة. RemoveAt (Me Count - 1)
إنهاء إذا
نهاية فرعية
نهاية الفصل الدراسي

لتوضيح كيفية استخدام رمز الفصل هذا ، يمكنك إنشاء نموذج يطلق عليه. يجب عليك استخدام الرمز الموضح أدناه في النموذج:

نموذج الطبقة العامة 1. نظام الوراثة. شبابيك. نماذج. شكل. #Region "التعليمات البرمجية المنشأة بواسطة Windows Form Designer" يجب عليك أيضًا إضافة العبارة: 'MyControlArray = New LabelArray (Me) 'بعد استدعاء InitializeComponent () في. كود المنطقة المخفية. قم بتعريف كائن ButtonArray جديد. خافت MyControlArray كما LabelArray. btnLabelAdd_Click فرعية خاصة (_. مرسل ByVal كنظام. موضوع، _. ByVal e كنظام. EventArgs) _. يعالج btnLabelAdd. انقر. استدعاء الأسلوب AddNewLabel. 'من MyControlArray. MyControlArray. AddNewLabel () 'تغيير خاصية BackColor. 'الزر 0. MyControlArray (0) .BackColor = _. النظام. رسم. اللون. أحمر. نهاية فرعية. btnLabelRemove_Click فرعية خاصة (_. مرسل ByVal كنظام. موضوع، _. ByVal e كنظام. EventArgs) _. يعالج btnLabelRemove. انقر. 'استدعاء طريقة إزالة MyControlArray. MyControlArray. إزالة() نهاية فرعية. نهاية الفصل الدراسي

أولاً ، هذا لا يؤدي المهمة في وقت التصميم مثلما اعتدنا القيام بذلك في VB 6! وثانيًا ، أنهم ليسوا في صفيف ، إنهم في مجموعة VB.NET - شيء مختلف كثيرًا عن الصفيف.

السبب في أن VB.NET لا يدعم "صفيف التحكم" VB 6 هو أنه لا يوجد شيء مثل صفيف "التحكم" "(لاحظ تغيير علامات الاقتباس). يقوم VB 6 بإنشاء مجموعة من وراء الكواليس ويجعلها تظهر كمصفوفة للمطور. ولكنها ليست مصفوفة ولديك القليل من التحكم فيها بخلاف الوظائف المقدمة من خلال IDE.

VB.NET ، من ناحية أخرى ، يطلق عليه ما هو: مجموعة من الكائنات. ويسلمون مفاتيح المملكة للمطور من خلال إنشاء كل شيء في العراء.

كمثال على نوع المزايا التي يمنحها هذا للمطور ، في VB 6 يجب أن تكون عناصر التحكم من نفس النوع ، ويجب أن يكون لها نفس الاسم. نظرًا لأن هذه مجرد كائنات في VB.NET ، يمكنك جعلها أنواعًا مختلفة وإعطائها أسماء مختلفة وإدارتها في نفس المجموعة من الكائنات.

في هذا المثال ، يعالج حدث النقر نفسه زرين ومربع اختيار ويعرض الزر الذي تم النقر عليه. افعل ذلك في سطر واحد من التعليمات البرمجية باستخدام VB 6!

عناصر تحكم فرعية مختلطة خاصة (_)
مرسل ByVal كنظام. موضوع، _
ByVal e كنظام. EventArgs) _
زر المقابض 1. انقر فوق _
زر 2. انقر فوق _
CheckBox1.Click
يجب أن يكون البيان أدناه عبارة واحدة طويلة!
'إنها على أربعة أسطر هنا لإبقائها ضيقة
ما يكفي لتناسب صفحة الويب
Label2.Text =
مايكروسوفت. البصرية الأساسية. حق (مرسل). GetType. إلى سلسلة،
لين (المرسل. GetType. إلى سلسلة) -
(InStr (المرسل. GetType. ToString ، "نماذج") + 5))
نهاية فرعية

إن حساب السلسلة الفرعية معقد نوعًا ما ، ولكنه ليس في الواقع ما نتحدث عنه هنا. يمكنك فعل أي شيء في حدث Click. يمكنك ، على سبيل المثال ، استخدام نوع عنصر التحكم في عبارة If للقيام بأشياء مختلفة لعناصر تحكم مختلفة.

ملاحظات مجموعة دراسات الحوسبة الخاصة بـ Frank على المصفوفات

قدمت مجموعة دراسة Frank مثالاً مع نموذج يحتوي على 4 تصنيفات وزرين. يقوم الزر 1 بمسح التسميات ويقوم الزر 2 بتعبئتها. من الجيد قراءة سؤال فرانك الأصلي مرة أخرى وملاحظة أن المثال الذي استخدمه كان حلقة يتم استخدامها لمسح خاصية التسمية التوضيحية لمجموعة من مكونات Label. إليك مكافئ VB.NET لذلك الرمز VB 6. يفعل هذا الرمز ما طلبه فرانك في الأصل!

نموذج الطبقة العامة 1. نظام الوراثة. شبابيك. نماذج. شكل. #Region "التعليمات البرمجية المنشأة بواسطة Windows Form Designer" Dim LabelArray (4) As Label. 'تعلن مجموعة من التسميات. نموذج فرعي خاص1 تحميل (_. مرسل ByVal كنظام. موضوع، _. ByVal e كنظام. EventArgs) _. يعالج MyBase. حمل. SetControlArray () نهاية فرعية. Set SubControlArray () LabelArray (1) = Label1. LabelArray (2) = Label2. LabelArray (3) = Label3. LabelArray (4) = Label4. نهاية فرعية. زر فرعي خاص 1 انقر (_. مرسل ByVal كنظام. موضوع، _. ByVal e كنظام. EventArgs) _. مقابض Button1.Click. الزر 1 مسح الصفيف. تعتيم كعدد صحيح. أ = 1 إلى 4. LabelArray (أ) .Text = "" التالى. نهاية فرعية. زر فرعي خاص 2 انقر (_. مرسل ByVal كنظام. موضوع، _. ByVal e كنظام. EventArgs) _. مقابض Button2.Click. 'الزر 2 تعبئة الصفيف. تعتيم كعدد صحيح. أ = 1 إلى 4. LabelArray (أ). Text = _. "صفيف التحكم" و CStr (أ) التالى. نهاية فرعية. نهاية الفصل الدراسي

إذا جربت هذا الرمز ، فستكتشف أنه بالإضافة إلى تعيين خصائص التسميات ، يمكنك أيضًا استدعاء طرق. فلماذا ذهبت (ومايكروسوفت) إلى كل المشاكل لبناء كود "قبيح" في الجزء الأول من المقال؟

يجب أن أختلف مع أنها "صفيف تحكم" بمعنى VB الكلاسيكي. صفيف التحكم VB 6 هو جزء مدعوم من بناء الجملة VB 6 ، وليس مجرد تقنية. في الواقع ، ربما تكون الطريقة لوصف هذا المثال هي أنه مجموعة من عناصر التحكم ، وليس مصفوفة تحكم.

في الجزء الأول ، اشتكت من أن مثال Microsoft يعمل فقط في وقت التشغيل وليس في وقت التصميم. يمكنك إضافة عناصر تحكم وحذفها من نموذج ديناميكيًا ، ولكن يجب تنفيذ الأمر برمته في التعليمات البرمجية. لا يمكنك سحب وإسقاط عناصر التحكم لإنشائها كما يمكنك في VB 6. يعمل هذا المثال بشكل أساسي في وقت التصميم وليس في وقت التشغيل. لا يمكنك إضافة عناصر التحكم وحذفها ديناميكيًا في وقت التشغيل. بطريقة ما ، هو العكس تمامًا لمثال الجزء الأول.

مثال صفيف التحكم VB 6 الكلاسيكي هو نفسه الذي يتم تطبيقه في التعليمات البرمجية VB .NET. هنا في كود VB 6 (هذا مأخوذ من Mezick & Hillier ، دليل امتحانات شهادة Visual Basic 6، ص 206 - تم تعديله قليلاً ، لأن المثال الموجود في الكتاب ينتج عنه عناصر تحكم لا يمكن رؤيتها):

خافت MyTextBox مثل VB.TextBox. رقم ثابت مثل العدد الصحيح. intNumber = intNumber + 1. تعيين MyTextBox = _. أنا. ضوابط. يضاف ("VB.TextBox" ، _. "نص" ورقم دولي) MyTextBox. نص = MyTextBox. اسم. MyTextBox. مرئي = صحيح. MyTextBox. اليسار = _. (رقم دولي - 1) * 1200

ولكن كما توافق Microsoft (وأنا) ، فإن صفائف التحكم VB 6 غير ممكنة في VB.NET. لذا فإن أفضل ما يمكنك فعله هو تكرار الوظيفة. كررت مقالتي الوظائف الموجودة في مثال Mezick & Hillier. يكرر رمز لجنة الدراسات وظيفة القدرة على تعيين الخصائص وأساليب الاتصال.

لذا فإن الخلاصة هي أنه يعتمد حقًا على ما تريد القيام به. لا يحتوي VB.NET على كل شيء ملفوفًا كجزء من اللغة - حتى الآن - ولكنه في النهاية أكثر مرونة.

صفائف السيطرة على جون فانون

كتب جون: كنت بحاجة إلى صفائف تحكم لأنني أردت وضع جدول بسيط للأرقام في نموذج في وقت التشغيل. لم أكن أريد الغثيان من وضعها جميعًا بشكل فردي وأردت استخدام VB.NET. تقدم Microsoft حلاً مفصلاً للغاية لمشكلة بسيطة ، ولكنها مطرقة كبيرة جدًا للتخلص من الجوز الصغير جدًا. بعد بعض التجارب ، وصلت في النهاية إلى حل. إليك كيف فعلت ذلك.

يوضح المثال حول Visual Basic أعلاه كيف يمكنك إنشاء TextBox في نموذج عن طريق إنشاء مثيل الكائن ، وتعيين الخصائص ، وإضافته إلى مجموعة عناصر التحكم التي تعد جزءًا من النموذج موضوع.

خافت txtDataShow باسم TextBox جديد
txtDataShow. الارتفاع = 19
txtDataShow. العرض = 80
txtDataShow. الموقع = نقطة جديدة (X ، Y)
أنا. ضوابط. إضافة (txtDataShow)
على الرغم من أن حل Microsoft يخلق فئة ، فقد استنتجت أنه سيكون من الممكن لف كل هذا في روتين فرعي بدلاً من ذلك. في كل مرة تقوم فيها باستدعاء هذا الروتين الفرعي ، تقوم بإنشاء مثيل جديد لمربع النص في النموذج. إليك الرمز الكامل:

نموذج الطبقة العامة 1
نظام الوراثة. شبابيك. نماذج. شكل

#Region "التعليمات البرمجية المنشأة بواسطة Windows Form Designer"

BtnStart_Click فرعية خاصة (_
مرسل ByVal كنظام. موضوع، _
ByVal e كنظام. EventArgs) _
يعالج btnStart. انقر

Dim I As Integer
بيانات خافتة كسلسلة
لأني = 1 إلى 5
sData = CStr (I)
استدعاء AddDataShow (sData، I)
التالى
نهاية فرعية
إضافة بيانات فرعية (_
نص ByVal كسلسلة ، _
ByVal I كعدد صحيح)

خافت txtDataShow باسم TextBox جديد
خافت UserLft ، UserTop باسم عدد صحيح
Dim X، Y As Integer
UserLft = 20
UserTop = 20
txtDataShow. الارتفاع = 19
txtDataShow. العرض = 25
txtDataShow. TextAlign = _
محاذاة أفقية. مركز
txtDataShow. نمط الحدود = _
نمط الحدود. ثابت واحد
txtDataShow. نص = نص
X = UserLft
Y = UserTop + (I - 1) * txtDataShow. ارتفاع
txtDataShow. الموقع = نقطة جديدة (X ، Y)
أنا. ضوابط. إضافة (txtDataShow)
نهاية فرعية
نهاية الفصل الدراسي
نقطة جيدة جدا ، جون. هذا بالتأكيد أكثر بساطة من كود Microsoft... لذلك أتساءل لماذا أصروا على القيام بذلك بهذه الطريقة؟

لبدء التحقيق ، دعنا نحاول تغيير أحد مهام الملكية في الرمز. دعنا نتغير

txtDataShow. الارتفاع = 19
إلى

txtDataShow. الارتفاع = 100
فقط للتأكد من وجود فرق ملحوظ.

عندما نقوم بتشغيل الكود مرة أخرى ، نحصل على... ماذا ؟؟؟ نفس الشيء. لا تغيير على الإطلاق. في الواقع ، يمكنك عرض القيمة ببيان مثل MsgBox (txtDataShow. الارتفاع) وما زلت تحصل على 20 كقيمة للعقار بغض النظر عما تخصصه لها. لماذا يحدث ذلك؟

الجواب هو أننا لا نشتق صفنا لإنشاء الكائنات ، بل نضيف أشياء إلى فصل آخر ، لذا علينا اتباع قواعد الفصل الآخر. وتنص تلك القواعد على أنه لا يمكنك تغيير خاصية الارتفاع. (Wellllll... تستطيع. إذا قمت بتغيير خاصية Multiline إلى True ، فيمكنك تغيير الارتفاع.)

لماذا يمضي برنامج VB.NET قدما وينفذ الكود بدون حتى أنينما قد يكون هناك شيء خاطئ ، في الواقع ، يتجاهل تمامًا عبارةك "قبضة أخرى". قد أقترح على الأقل تحذيرًا في المجموعة ، على أي حال. (ملحوظة! ملحوظة! ملحوظة! هل تستمع Microsoft؟)

المثال من الجزء الأول يرث من فئة أخرى ، وهذا يجعل الخصائص متاحة للتعليمة البرمجية في الفئة الموروثة. يعطينا تغيير خاصية الارتفاع إلى 100 في هذا المثال النتائج المتوقعة. (مرة أخرى... إخلاء مسؤولية واحد: عند إنشاء مثيل جديد لمكون Label كبير ، فإنه يغطي المكون القديم. لرؤية مكونات Label الجديدة فعليًا ، يجب عليك إضافة طريقة استدعاء aLabel. اجلب للمقدمة().)

يوضح هذا المثال البسيط أنه على الرغم من أنه يمكننا ببساطة إضافة كائنات إلى فئة أخرى (وأحيانًا يكون هذا هو الشيء الصحيح الذي يجب القيام به) ، فإن التحكم في البرمجة على الكائنات يتطلب منا اشتقاقها في فصل دراسي ، والطريقة الأكثر تنظيمًا (أجرؤ على القول ، "الطريقة .NET" ؟؟) هي إنشاء خصائص وأساليب في الفئة المشتقة الجديدة لتغيير أشياء. بقي جون غير مقتنع في البداية. وقال إن منهجه الجديد يناسب غرضه على الرغم من وجود قيود على عدم كونه "COO" (موجه نحو الكائن بشكل صحيح). ولكن في الآونة الأخيرة ، كتب جون ،

"... بعد كتابة مجموعة من 5 مربعات نصية في وقت التشغيل ، أردت تحديث البيانات في جزء لاحق من البرنامج - ولكن لم يتغير شيء - كانت البيانات الأصلية لا تزال هناك.

اكتشفت أنه بإمكاني تجاوز المشكلة عن طريق كتابة التعليمات البرمجية لإخراج الصناديق القديمة وإعادتها مرة أخرى ببيانات جديدة. أفضل طريقة للقيام بذلك هي استخدام Me. تحديث. لكن هذه المشكلة لفتت انتباهي لضرورة توفير طريقة لطرح مربعات النص وإضافتها ".

استخدم رمز John متغيرًا عامًا لتتبع عدد عناصر التحكم التي تمت إضافتها إلى النموذج ، لذا فإن الطريقة ...

نموذج فرعي خاص 1 تحميل (_
مرسل ByVal كنظام. موضوع، _
ByVal e كنظام. EventArgs) _
يعالج MyBase. حمل
CntlCnt0 = أنا. ضوابط. العد
نهاية فرعية

ثم يمكن إزالة عنصر التحكم "الأخير" ...

ن = أنا. ضوابط. العد - 1
أنا. ضوابط. RemoveAt (N)
وأشار جون إلى أنه "ربما هذا خرقاء قليلاً".

إنها الطريقة التي تتبعها Microsoft في تتبع الكائنات في COM AND في رمز المثال "القبيح" أعلاه.

لقد عدت الآن إلى مشكلة إنشاء عناصر تحكم بشكل ديناميكي في نموذج في وقت التشغيل وكنت أبحث مرة أخرى في مقالات "ما حدث للتحكم في المصفوفات".

لقد أنشأت الفئات ويمكنني الآن وضع عناصر التحكم في النموذج بالطريقة التي أريدها.

شرح جون كيفية التحكم في وضع عناصر التحكم في مربع مجموعة باستخدام الفئات الجديدة التي بدأ استخدامها. ربما كانت مايكروسوفت على حق في حلها "القبيح" بعد كل شيء!

instagram story viewer