
EventArgs ויורשת מ-EventArgs. היא מחזיקה את כל מה שהאירוע מדווח, בשדות public readonly, עם קונסטרקטור. אירוע על דלק מקבל FuelEventArgs עם FuelLeft מסוג double, ואירוע על וירוס מקבל VirusEventArgs עם FileName.void, שמו מסתיים ב-Handler, ומקבל שני פרמטרים: object sender ו-האובייקט של ה-EventArgs בשם e.sender הוא האובייקט שהעלה את האירוע, ו-e מחזיק את כל הפרמטרים של האירוע, בין אם יש אחד, כמה או אפס.this כ-sender, ואובייקט חדש של ה-EventArgs עם הערכים.EventArgs.Empty.(object sender, FuelEventArgs e), ואת הדלק קוראים מ-e.FuelLeft.sender אפשר להגיע לשדות של האובייקט שהעלה את האירוע, שלא קשורים לאירוע עצמו. עושים casting מ-object ל-Car וניגשים ל-DriverName.DriveName ומציגים באיזה כונן נמצא הווירוס, דרך sender.+= ולוחצים Tab פעמיים. Visual Studio יוצרת את ה-delegate ואת פונקציית הטיפול עם החתימה הנכונה.event) יוצר משתנה פרטי נסתר, ולכן אפשר להעלות אותו רק בתוך המחלקה שהגדירה אותו. במחלקה יורשת, למשל SuperAntivirus, מתקבלת שגיאה שהאירוע יכול להופיע רק בצד שמאל של += או -=.protected virtual void On<EventName>(...), למשל OnVirusFound. היא בודקת אם יש נרשמים, יוצרת את ה-EventArgs ומעלה את האירוע. מחלקות יורשות קוראות לפונקציה הזו.private של מחלקת הבסיס נחסם גם הוא עם הודעת "inaccessible due to its protection level".System.Windows.Forms ו-System.Drawing, יוצרים Form וקוראים ל-ShowDialog. אפשר להסתיר את הקונסול ב-Properties על ידי שינוי Output Type ל-Windows Application.MouseEnter ו-MouseLeave מדווחים רק EventArgs. אפשר לרשום אותה פונקציה לשניהם כי החתימה זהה. בדוגמה היא צובעת את הטופס בצבע אקראי (Color.FromArgb עם שלושה מספרים בין 0 ל-255), עם sender מומר ל-Form.MouseMove שולח MouseEventArgs, שאפשר ממנו לקרוא X, Y ו-Location, ובדוגמה הם מוצגים בכותרת הטופס.KeyUp שולח e.KeyCode. בדוגמה בלחיצה על Escape (Keys.Escape) הטופס נסגר עם Close.הטקסט המלא של הדקות הראשונות בהרצאה «אירועים - Events - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
ואנחנו חוזרים בחזרה למחלקת הכר. עכשיו נשים אותה פה בצד, בואו נסתכל על עוד משהו מאוד מעניין. בדוטנט זה לא נכון להעלות אירוע בצורה כזאת. מה הסיבה שמקודם הראיתי את זה?
רק בכדי להבין מה זה אירוע ומה קורה כאשר אתם קוראים לפונקציה, ומה בעצם אתם מעוניינים לדווח. אם אני מעוניין לדווח את הדלק שיש כרגע למכונית, כאשר עומד להיגמר לה הדלק, אז כמובן שאני רוצה לשלוח לפונקציה את הדלק.
אבל למה אני מתכוון שזאת לא חתימה נכונה בדו"ט נט עבור אירועים? אז בדו"ט נט יש מוסכמה בינלאומית לגבי מה אירוע אמור לדווח.
וזה טיפה טריקי, כי כל אירוע רוצה לדווח משהו אחר. שימו לב לאירוע No Fuel. האירוע No Fuel רוצה לדווח כמה דלק יש לי כרגע.
שימו לב לאירוע No Oil. האירוע No Oil בכלל לא רוצה לדווח כלום. עצם העובדה שהוא קורא לפונקציה כבר אומר שוואלה אין שמן ואו שתעצור בצד או שאין לך מנוע.
האנטיווירוס בכלל דיווח לנו משהו אחר, הוא דיווח לנו סטרינג שזה בעצם השם של הווירוס שנמצא. איך זה יכול להיות שהחתימה של האירוע קובעת לנו מה לדווח?
ואיך זה יכול להיות בכלל שיש איזושהי מוסכמה בינלאומית לגבי מה צריך לדווח? אז בואו נראה שלב שלב מה באמת היא המוסכמה הזאת. והמוסכמה אומרת את הדבר הבא.
דבר ראשון אנחנו צריכים להסתכל מה בדיוק הפונקציה מדווחת. אנחנו רוצים באירוע של פיול הנדלר שמדווח את רמת הדלק שיש כרגע לדווח משתנה מסוג דאבל שנקרא פיול לפט ואנחנו צריכים עכשיו ללכת ולבנות מחלקה חדשה שהתפקיד היחידי שלה זה להחזיק כל מה שהאיבנט מדווח אם האיבנט מדווח מידע
אחד ויחיד כמו במקרה הזה פיול לפט אז יהיה למחלקה הזאת משתנה אחד ויחיד אם האיבנט מדווח 14 פרמטרים שונים אז יהיה למחלקה 14 משתנים שונים.
אוקיי, אז בואו נבנה את המחלקה הזאת והמחלקה הזאת צריכה להסתיים בשם event args. בואו נקרא לה fuel event args. args היא צורך של arguments, כלומר פרמטרים ומה שאנחנו צריכים עכשיו לבנות במחלקה הזאת הוא קודם כל אנחנו צריכים לרשת מחלקת בסיס של כל ה-event
args האלה שקיימים בדוטנט את הבסיס הזאת נקראת EventArgs. כעת אנחנו צריכים לבנות את אותם משתנים שקיימים במחלקה.
כל משתנה כזה צריך להיות Public Read Only, כי אנחנו לא רוצים שאף אחד ישנה אותו, מפני שאנחנו הולכים לדווח אובייקט מהמחלקה הזאת, מתוך המחלקה לאזור שמשתמש בה, ואנחנו אומרים לו בדיוק מה הדלק שיש.
אנחנו לא רוצים שהוא ישנה לנו את המשתנה הזה, כי זה דיווח שלנו. דלק ודאבל, והוא נקרא פיול לפט. למחלקה כזאת קיים שיא תור שמקבל את המשתנים האלה, דאבל פיול לפט.
נכנס אותו, פיול לפט שווה פיול לפט. ופה סיימנו לבנות את המחלקה, היא מאוד מאוד טריוויאלית, מאוד מאוד פשוטה, והתפקיד שלה זה רק להכיל את הפרמטרים הדרושים לדיווח עבור איבנט ספציפי.
זאת אומרת, יש לנו כאן איבנט ספציפי מאוד שמדווח על הדלק, ולכן אנחנו הולכים להכיל מחלקה שהולכת להכיל רק את הפרמטרים של הדלק.
הדבר הבא שאנחנו הולכים לעשות זה לבנות דלגייט בחתימה הנכונה. הדלגייט לא אמור לשלוח דאבל. כל דלגייט בעולם בדוט-נאפ שהתפקיד שלו זה להוות טיפוס עבור אירועים, כל דלגייט בנוי לפי החתימה הבאה.
דבר ראשון הוא מחזיר ווייד. דבר שני יש לו איזשהו שם שמסתיים במילה Handler. דבר שלישי הוא מקבל שני פרמטרים. פרמטר אחד זה אובייקט מטיפוס Object והשם שלו זה Fender.
תכף אנחנו נראה מה בדיוק התפקיד שלו. פרמטר שני זה האובייקט מטיפוס המחלקה שבנינו, איבנט ארגס והשם שלו זה E. מה בעצם שני הפרמטרים האלה מדווחים?
סנדר זה תמיד האובייקט שהעלה את האירוע. E זה תמיד הפרמטרים של האירוע. כל הפרמטרים של האירוע בין אם זה פרמטר אחד ובין אם זה 17 פרמטרים או 0 פרמטרים כולם נמצאים במשתנה E הזה בתוך אובייקט אחד ויחיד.
זה נותן לנו איזשהו סדר מסוים ומוסכמה מסוימת לגבי כל האירועים בעולם. יש אלפי אלפים של אירועים וכולם בדוט נט אינם בעלי החתימה הזאת.
זאת אומרת, כולם מדווחים רק שני פרמטרים. אחד, איזה אובייקט העלה את האירוע, שזה גם כן נקודה מעניינת שעוד מעט אנחנו הולכים לראות מה זה עוזר לנו.
והדבר השני, ושיש איזשהו משתנה אחד ויחיד שמחזיק את כל המשתנים שעלינו לדווח. אוקיי, זה אומר עכשיו שאנחנו כשאנחנו מעלים את האיבנט אנחנו צריכים לדווח שני משתנים.
בואו נסתכל מה קורה כאשר אנחנו פותחים את הפונקציה. המערכת אומרת לנו תביא לי שני ערכים אחד זה מאיזה אובייקט בדיוק מעלה את האירוע עכשיו בואו נחשוב מאיזה אובייקט מעלה את האירוע אני מעלה את האירוע האובייקט הנוכחי ולכן הדבר הנכון לדווח זה this פרמטר השני ותן לי אובייקט שמחזיק את כל הפרמטרים שברצונך לדווח.
אני רוצה לדווח כרגע כמה fuel left, אז אנחנו צריכים לבנות אובייקט מטיפוס fuel event args ולשלוח לקונסטרקטור שלו את ה-fuel. כעת המחלקה, לפחות מהבחינה הזאת של האיבנט הזה, בנויה כמו שצריך.
אנחנו תכף הולכים לתקן גם את האיבנט השני. אז אנחנו מדווחים עכשיו, איס זה האובייקט שהעלה את האירוע, שזה אנחנו, וכל הפרמטרים שברצוננו לדווח.
כעת אנחנו צריכים לתקן את הפונקציות האלה. הפונקציה showFuel כבר לא מקבלת דאבל, היא חייבת לקבל בדיוק מה שהדלגייט מקבל. זאת אומרת, היא חייבת לקבל את שני המשתנים האלה sender ואי.
בואו נחזור לפה, נרשום sender ואי. אבל אם היא לא מקבלת פיול left אלא מקבלת sender ו-e, שזה משתנה שמחזיק את כל הפרמטרים, מאיפה יש לי את ה-u-left?
אז אם שמתם לב לגבי מה שקרה כאן, ראיתם שהמשתנה הזה שאנחנו שולחים מחזיק את הפיול. זאת אומרת שדרך ה-e אנחנו יכולים להגיע לכל הפרמטרים שהאיבנט מדווח.
אנחנו רואים את ה-fuel left. אוקיי, אותו הדבר בדיוק אנחנו צריכים לעשות בפונקציה של Entering to Fuel Station שגם היא צריכה לקבל שני הפרמטרים האלה. בואו נשים אותה ליד החברה שלה פה למעלה.
איך עכשיו אנחנו מטפלים באיוונט השני? האיוונט השני חייב להיות באותה מוסכמה בדיוק והוא לא, הוא לא מקבל כלום. אז אנחנו עכשיו צריכים לבנות בדיוק את המוסכמה הזאת.
זאת אומרת שהדלגייט שלו צריך לקבל Object Sender ואיזשהו טיפוס שהשם שלו זה E, השם שלו משתנה ב-E, אבל הטיפוס צריך להחזיק את כל הפרמטרים שהאיבנט רוצה לדווח.
אבל רגע, מקודם אנחנו ראינו שאני לא מדווח שום דבר אם נגמר השמן באוטו, כי אם נגמר השמן באוטו אז דאט סיט הולך המנוע.
בעצם העובדה שקראתי לפונקציה שנמצאת באזור שמשתמש בי, זאתי, ואמרתי לה תקשיבי, אין שמן יותר במנוע, זה כבר מציין לאזור שמשתמש בנו שאין שמן.
לא היינו חייבים לדווח שום דבר. אז אם אין לנו מה לדווח, איך אנחנו בדיוק שולחים אובייקט שמחזיק את כל הפרמטרים שברצוננו לדווח, כמו שעשינו מקודם?
אז התשובה, אנחנו מדווחים את event tags שזאת מחלקת הבסיס שמקודם ירשנו זאת שבעצם אין בה כלום והיא אומרת אם אין לכם מה לדווח עדיין תשמרו על המוסכמה הבינלאומית הזאת של כל event בעולם זורק שני דברים object sender מי העלה את האירוע ואיזשהו משתנה שאומר מה הפרמטרים שהאבנט מדווח בין אם זה אפס
אחד או מספר רב של פרמטרים כולם נמצאים באובייקט אחד. אם אין לנו מה לדווח אנחנו פשוט שולחים EventArgs.
כעת אנחנו צריכים לחזור לפה ולחשוב מה בדיוק אנחנו שולחים. אז כאשר אין שמן כל מה שאנחנו צריכים לעשות זה מי מדווח? אני מדווח.
מה אני שולח? או שאני יוצר אובייקט EventArgs ריק אבל זה די מיותר או שאני פשוט משתמש ב-event args נקודה empty.
event args נקודה empty זה בדיוק משתנה שמציין שכרגע אין לי מה לדווח, וזה פשוט אובייקט ריק מטיפוס event args. אז כעת שמרנו על החתימה הבינלאומית של האירוע גם כשעבדנו עם האיבנט שלא מדווח כלום.
אנחנו עכשיו צריכים ללכת ולדאוג שהחתימה הזאת אכן נמצאת בפונקציה הזאת. אז בואו ניקח בדיוק את החתימה שכתובה פה, נדביק בפונקציה show oil message וזאת החתימה.
בואו נבדוק כעת את כל הנושא של המכונית. ניקח את כל הנושא של האנטיווירוס, נשים אותו בפונקציה נפרדת, נשים אותו כרגע בהערה ונחזור לקוד של המכונית, נבדוק, נריץ את התוכנית ונראה שכל התהליך הקודם קורה בדיוק אותו הדבר.
אנחנו רואים את כל הנהיגה, ברגע שאין דלק אנחנו מקבלים את הדיווחים, ברגע שאין שמן אנחנו מקבלים את הדיווח, אבל הדבר היחידי ששונה בין הדוגמה הקודמת לדוגמה הנוכחית זה שאנחנו עשינו את זה בחתימה בינלאומית שידועה לכל המתכנתים בעולם של דוטנט,