ב- VB6, תת-אירוע של אירוע, כמו כפתור 1_Click, היה הרבה פחות מסובך מכיוון שהמערכת כינתה את תת-השערות בקפדנות בשמה. אם היה אירוע כפתור 1_קליק, המערכת קראה לזה. זה ישיר וברור.
אבל ב- VB.NET ישנם שני שדרוגים גדולים שעושים VB.NET SOOPercharged (זהו "OOP" עבור תכנות מונחה עצמים).
- סעיף "ידיות" קובע אם המערכת מכנה את תת הכוח ולא את השם.
- הפרמטרים של השולח וה- e מועברים לתת-השער.
שימוש בפרמטרים
בואו נסתכל על דוגמא פשוטה כדי לראות את ההבדל שעושים הפרמטרים ב- VB.NET.
לחצן משנה פרטי 1_קליק (
שולח ByVal כמערכת. חפץ,
מערכת ByVal e As. אירוע אירועים
) לחצן ידיות. לחץ על
'הקוד שלך כאן
סיום משנה
תפקודי משנה לאירועים מקבלים תמיד אובייקט "שולח" ופרמטר EventArgs מערכת "e". מכיוון שהפרמטר EventArgs הוא אובייקט, הוא תומך בכל המאפיינים והשיטות הדרושים. לדוגמה, תת-ההערכה VB6 MouseMove הישנה נהגה לקבל ארבעה פרמטרים:
- כפתור כמספר שלם
- הסט כמספר שלם
- X כרווק
- Y כרווק
כאשר יצאו עכברים מתקדמים יותר עם לחצנים רבים יותר, ל- VB6 הייתה בעיה אמיתית לתמוך בהם. VB.NET מעביר רק פרמטר MouseEventArgs אחד אך הוא תומך בהרבה יותר מאפיינים ושיטות. וכל אחד מהם הם חפצים התומכים עוד יותר. לדוגמה, ה- e. מאפיין הכפתור מכיל את כל המאפיינים הבאים:
- שמאלה
- אמצע
- ימין
- אף אחד
- XButton1
- XButton2
אם מישהו ימציא עכבר "טרנסנדנטלי" עם כפתור "וירטואלי", VB.NET יצטרך רק לעדכן את .NET Framework כדי לתמוך בו ואף קוד קודם לא יישבר כתוצאה מכך.
יש מספר טכנולוגיות .NET שתלויות לחלוטין בפרמטרים אלה. לדוגמה, מכיוון שבמחשב שלך בדרך כלל יש רק מסך יחיד להצגת גרפיקה, הקוד שלך צריך למזג את הגרפיקה שהוא יוצר לאותה תמונה בה משתמש Windows. מסיבה זו, יש לשתף אובייקט "גרפי" יחיד. הדרך העיקרית שבה הקוד שלך מסוגל להשתמש באותו אובייקט "גרפי" היא להשתמש בפרמטר e שהוא עבר לאירוע OnPaint עם האובייקט PaintEventArgs.
OnPaint Sub-overrides מוגדר (
מערכת ByVal e As. חלונות. טפסים. PaintEventArgs)
Dim g כגרפיקה = ה. גרפיקה
דוגמאות נוספות
מה עוד אפשר לעשות עם הפרמטרים האלה? כדי להמחיש, נניח שברצונך למצוא אם מחרוזת, אולי משהו שהזנת לתיבת טקסט, קיימת באחד מאוסף של תיבות טקסט אחרות כשתלחץ על אחת מהן. באפשרותך לקוד כמה עשרות שיטות משנה זהות כמעט לכל תיבת טקסט:
אם TextBox42.Text. אינדקס של(
SearchString. טקסט) = -1
ואז NotFound. טקסט =
"לא נמצא"
אבל הרבה יותר קל לקוד רק אחד ולתת לו להתמודד עם כולם. פרמטר השולח יגלה על איזו לחיצה על תיבת הטקסט.
FindIt Sub Sub (
שולח ByVal כמערכת. חפץ,
מערכת ByVal e As. אירוע אירועים
) מטפל ב- TextBox1.Enter,
TextBox2. הזן,
... ועוד ועוד.. .
TextBox42. הזן
עמעום את myTextbox כ- TextBox
myTextbox = שולח
עומק אינדקס צ'אר כמספר שלם =
myTextbox. טקסט. אינדקס של(
SearchString. טקסט)
אם IndexChar = -1 אז _
לא נמצא. טקסט = "לא נמצא" _
אחרת _
לא נמצא. טקסט = "מצא את זה!"
סיום משנה
לאחרונה, מתכנת ביקש ממני דרך טובה יותר "למחוק את השורה שנלחצה באחת משש הרשימות שצוינו." היה לו שזה עובד בכמה תריסר שורות קוד שפשוט בלבלו אותי. אבל באמצעות השולח, זה היה באמת די פשוט:
רשימת המשנה הפרטיתBox_Click (
שולח ByVal כאובייקט,
מערכת ByVal e As. אירוע אירועים
) מטפל ב- ListBox1.Click, ListBox2.Click
עמעום את myListBox כרשימה חדשה
myListBox = שולח
myListBox. פריטים. הסר את זה (myListBox. SelectedIndex)
סיום משנה
דוגמא אחת נוספת למספר את הנקודה היא שאלה שנשלחה על ידי פייר בבלגיה. פייר בדק את השוויון של כפתור 1 ושל השולח באמצעות הוא מפעיל לחפצים:
אם השולח הוא לחצן 1 ואז ...
זה נכון מבחינה תחבירית מכיוון ששולח ולחצן 1 הם שניהם אובייקטים שאפשר להפנות אליהם. ומכיוון שהשולח באמת זהה עם כפתור 1, מדוע הוא לא עובד?
התשובה תלויה במילת מפתח שנמצאת מעט מוקדם יותר בהצהרה. ראשית, בואו לבדוק את התיעוד של מיקרוסופט לגבי המסמך הוא מפעיל.
ויז'ואל בייסיק משווה שני משתני הפניה לאובייקט עם מפעיל האם. מפעיל זה קובע אם שני משתני הפניה מתייחסים לאותה מופע אובייקט.
שימו לב שהשולח מועבר ByVal. המשמעות היא שהעתק של כפתור 1 מועבר, ולא האובייקט עצמו. אז כשפייר בודק אם השולח והכפתור 1 הם אותו המופע, התוצאה היא שגויה.
כדי לבדוק אם לחצו על כפתור 1 או על כפתור 2, עליכם להפוך את השולח לאובייקט כפתור בפועל ואז לבדוק מאפיין של אותו אובייקט. בדרך כלל משתמשים בטקסט, אך ניתן לבדוק ערך בתג או אפילו בנכס המיקום.
קוד זה עובד:
עמעום את הכפתור שלי ככפתור
myButton = שולח
אם myButton. טקסט = "כפתור 1" ואז