PracticU

אירועים - Events - חלק 2

בלי כתוביותעם כתוביות
PracticU › קורס תכנות מונחה עצמים - OOP - Object Oriented Programming - חומר לימוד של מדעי המחשב › אירועים - Events - חלק 2
מילון מושגים:
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.
אנטי וירוס - תוכנה שמזהה, חוסמת ומסירה תוכנות זדוניות מהמחשב, ומנטרת פעילות חשודה.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
טופס - אזור בממשק שבו המשתמש מזין נתונים בשדות ושולח אותם, למשל טופס הרשמה או התחברות.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
Visual Studio - סביבת פיתוח משולבת (IDE) של מיקרוסופט לכתיבה, ניפוי והרצה של קוד, בעיקר בשפות .NET.

אירועים - Events - חלק 2
בדוטנט יש מוסכמה קבועה לדיווח על אירועים, והיא הופכת כל אירוע לקל לשימוש. ההרצאה לוקחת מחלקת מכונית (Car) ומחלקת אנטי-וירוס ומתקנת את האירועים שלהן לפי המוסכמה, ואז מראה איך מעלים אירוע ממחלקה יורשת ואיך אותה מוסכמה מופיעה באובייקט Form של המערכת.
המוסכמה הבינלאומית
1. מחלקת EventArgs: לכל אירוע בונים מחלקה שמסתיימת ב-EventArgs ויורשת מ-EventArgs. היא מחזיקה את כל מה שהאירוע מדווח, בשדות public readonly, עם קונסטרקטור. אירוע על דלק מקבל FuelEventArgs עם FuelLeft מסוג double, ואירוע על וירוס מקבל VirusEventArgs עם FileName.
2. חתימת ה-delegate: מחזיר void, שמו מסתיים ב-Handler, ומקבל שני פרמטרים: object sender ו-האובייקט של ה-EventArgs בשם e.
3. משמעות הפרמטרים: sender הוא האובייקט שהעלה את האירוע, ו-e מחזיק את כל הפרמטרים של האירוע, בין אם יש אחד, כמה או אפס.
4. העלאה: שולחים this כ-sender, ואובייקט חדש של ה-EventArgs עם הערכים.
5. אירוע בלי נתונים: באירוע NoOil אין מה לדווח, אבל שומרים על החתימה. שולחים EventArgs.Empty.
6. הפונקציה שנרשמת: חייבת לקבל בדיוק (object sender, FuelEventArgs e), ואת הדלק קוראים מ-e.FuelLeft.
למה מדווחים את sender
- דרך sender אפשר להגיע לשדות של האובייקט שהעלה את האירוע, שלא קשורים לאירוע עצמו. עושים casting מ-object ל-Car וניגשים ל-DriverName.
- אותה פונקציה יכולה לשרת כמה אובייקטים. בדוגמה יש שתי מכוניות, של מוישה ושל דנה, ואותה פונקציה מציגה את שם הנהג הנכון.
- בדוגמת האנטי-וירוס מוסיפים שדה DriveName ומציגים באיזה כונן נמצא הווירוס, דרך sender.
רישום מהיר ב-Visual Studio
כותבים שם אובייקט, נקודה, שם האירוע, += ולוחצים Tab פעמיים. Visual Studio יוצרת את ה-delegate ואת פונקציית הטיפול עם החתימה הנכונה.
העלאת אירוע ממחלקה יורשת
- אירוע (event) יוצר משתנה פרטי נסתר, ולכן אפשר להעלות אותו רק בתוך המחלקה שהגדירה אותו. במחלקה יורשת, למשל SuperAntivirus, מתקבלת שגיאה שהאירוע יכול להופיע רק בצד שמאל של += או -=.
- הפתרון: במחלקת הבסיס כותבים פונקציה protected virtual void On<EventName>(...), למשל OnVirusFound. היא בודקת אם יש נרשמים, יוצרת את ה-EventArgs ומעלה את האירוע. מחלקות יורשות קוראות לפונקציה הזו.
- שדה private של מחלקת הבסיס נחסם גם הוא עם הודעת "inaccessible due to its protection level".
אירועים של המערכת: Form
- מוסיפים reference ל-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.
תרגילים שהוצעו
מחלקת Prime Numbers Generator שמעלה אירוע בכל מספר ראשוני אקראי שנמצא בין 1 ל-100,000, ומחלקת Clock שמעלה אירוע בכל דקה עגולה כשהשניות הן 0.
אחרי ההרצאה אפשר לבנות אירוע לפי המוסכמה של דוטנט, להעלות אותו גם ממחלקות יורשות ולהירשם לאירועים של אובייקטים מוכנים.
השיעור הבא בקורס: אירועים - Events (הסבר נוסף)

פרקי ההרצאה: אירועים - Events - חלק 2

  1. 00:00

    חתימה שגויה להעלאת אירוע

  2. 01:15

    מה אירוע אמור לדווח

  3. 02:35

    בניית מחלקת EventArgs

  4. 04:57

    בניית Delegate בחתימה הנכונה

  5. 05:58

    הפרמטרים Sender ו-E

  6. 08:39

    התאמת הפונקציות לחתימה

  7. 11:32

    דיווח אירוע ללא פרמטרים

  8. 13:33

    בדיקת התוכנית

תמלול ההרצאה: אירועים - Events - חלק 2

הטקסט המלא של הדקות הראשונות בהרצאה «אירועים - Events - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:08

    ואנחנו חוזרים בחזרה למחלקת הכר. עכשיו נשים אותה פה בצד, בואו נסתכל על עוד משהו מאוד מעניין. בדוטנט זה לא נכון להעלות אירוע בצורה כזאת. מה הסיבה שמקודם הראיתי את זה?

  2. 00:33

    רק בכדי להבין מה זה אירוע ומה קורה כאשר אתם קוראים לפונקציה, ומה בעצם אתם מעוניינים לדווח. אם אני מעוניין לדווח את הדלק שיש כרגע למכונית, כאשר עומד להיגמר לה הדלק, אז כמובן שאני רוצה לשלוח לפונקציה את הדלק.

  3. 00:55

    אבל למה אני מתכוון שזאת לא חתימה נכונה בדו"ט נט עבור אירועים? אז בדו"ט נט יש מוסכמה בינלאומית לגבי מה אירוע אמור לדווח.

  4. 01:16

    וזה טיפה טריקי, כי כל אירוע רוצה לדווח משהו אחר. שימו לב לאירוע No Fuel. האירוע No Fuel רוצה לדווח כמה דלק יש לי כרגע.

  5. 01:29

    שימו לב לאירוע No Oil. האירוע No Oil בכלל לא רוצה לדווח כלום. עצם העובדה שהוא קורא לפונקציה כבר אומר שוואלה אין שמן ואו שתעצור בצד או שאין לך מנוע.

  6. 01:43

    האנטיווירוס בכלל דיווח לנו משהו אחר, הוא דיווח לנו סטרינג שזה בעצם השם של הווירוס שנמצא. איך זה יכול להיות שהחתימה של האירוע קובעת לנו מה לדווח?

  7. 01:59

    ואיך זה יכול להיות בכלל שיש איזושהי מוסכמה בינלאומית לגבי מה צריך לדווח? אז בואו נראה שלב שלב מה באמת היא המוסכמה הזאת. והמוסכמה אומרת את הדבר הבא.

  8. 02:19

    דבר ראשון אנחנו צריכים להסתכל מה בדיוק הפונקציה מדווחת. אנחנו רוצים באירוע של פיול הנדלר שמדווח את רמת הדלק שיש כרגע לדווח משתנה מסוג דאבל שנקרא פיול לפט ואנחנו צריכים עכשיו ללכת ולבנות מחלקה חדשה שהתפקיד היחידי שלה זה להחזיק כל מה שהאיבנט מדווח אם האיבנט מדווח מידע

  9. 03:01

    אחד ויחיד כמו במקרה הזה פיול לפט אז יהיה למחלקה הזאת משתנה אחד ויחיד אם האיבנט מדווח 14 פרמטרים שונים אז יהיה למחלקה 14 משתנים שונים.

  10. 03:16

    אוקיי, אז בואו נבנה את המחלקה הזאת והמחלקה הזאת צריכה להסתיים בשם event args. בואו נקרא לה fuel event args. args היא צורך של arguments, כלומר פרמטרים ומה שאנחנו צריכים עכשיו לבנות במחלקה הזאת הוא קודם כל אנחנו צריכים לרשת מחלקת בסיס של כל ה-event

  11. 03:40

    args האלה שקיימים בדוטנט את הבסיס הזאת נקראת EventArgs. כעת אנחנו צריכים לבנות את אותם משתנים שקיימים במחלקה.

  12. 03:53

    כל משתנה כזה צריך להיות Public Read Only, כי אנחנו לא רוצים שאף אחד ישנה אותו, מפני שאנחנו הולכים לדווח אובייקט מהמחלקה הזאת, מתוך המחלקה לאזור שמשתמש בה, ואנחנו אומרים לו בדיוק מה הדלק שיש.

  13. 04:12

    אנחנו לא רוצים שהוא ישנה לנו את המשתנה הזה, כי זה דיווח שלנו. דלק ודאבל, והוא נקרא פיול לפט. למחלקה כזאת קיים שיא תור שמקבל את המשתנים האלה, דאבל פיול לפט.

  14. 04:31

    נכנס אותו, פיול לפט שווה פיול לפט. ופה סיימנו לבנות את המחלקה, היא מאוד מאוד טריוויאלית, מאוד מאוד פשוטה, והתפקיד שלה זה רק להכיל את הפרמטרים הדרושים לדיווח עבור איבנט ספציפי.

  15. 04:55

    זאת אומרת, יש לנו כאן איבנט ספציפי מאוד שמדווח על הדלק, ולכן אנחנו הולכים להכיל מחלקה שהולכת להכיל רק את הפרמטרים של הדלק.

  16. 05:09

    הדבר הבא שאנחנו הולכים לעשות זה לבנות דלגייט בחתימה הנכונה. הדלגייט לא אמור לשלוח דאבל. כל דלגייט בעולם בדוט-נאפ שהתפקיד שלו זה להוות טיפוס עבור אירועים, כל דלגייט בנוי לפי החתימה הבאה.

  17. 05:37

    דבר ראשון הוא מחזיר ווייד. דבר שני יש לו איזשהו שם שמסתיים במילה Handler. דבר שלישי הוא מקבל שני פרמטרים. פרמטר אחד זה אובייקט מטיפוס Object והשם שלו זה Fender.

  18. 05:58

    תכף אנחנו נראה מה בדיוק התפקיד שלו. פרמטר שני זה האובייקט מטיפוס המחלקה שבנינו, איבנט ארגס והשם שלו זה E. מה בעצם שני הפרמטרים האלה מדווחים?

  19. 06:16

    סנדר זה תמיד האובייקט שהעלה את האירוע. E זה תמיד הפרמטרים של האירוע. כל הפרמטרים של האירוע בין אם זה פרמטר אחד ובין אם זה 17 פרמטרים או 0 פרמטרים כולם נמצאים במשתנה E הזה בתוך אובייקט אחד ויחיד.

  20. 06:56

    זה נותן לנו איזשהו סדר מסוים ומוסכמה מסוימת לגבי כל האירועים בעולם. יש אלפי אלפים של אירועים וכולם בדוט נט אינם בעלי החתימה הזאת.

  21. 07:11

    זאת אומרת, כולם מדווחים רק שני פרמטרים. אחד, איזה אובייקט העלה את האירוע, שזה גם כן נקודה מעניינת שעוד מעט אנחנו הולכים לראות מה זה עוזר לנו.

  22. 07:22

    והדבר השני, ושיש איזשהו משתנה אחד ויחיד שמחזיק את כל המשתנים שעלינו לדווח. אוקיי, זה אומר עכשיו שאנחנו כשאנחנו מעלים את האיבנט אנחנו צריכים לדווח שני משתנים.

  23. 07:39

    בואו נסתכל מה קורה כאשר אנחנו פותחים את הפונקציה. המערכת אומרת לנו תביא לי שני ערכים אחד זה מאיזה אובייקט בדיוק מעלה את האירוע עכשיו בואו נחשוב מאיזה אובייקט מעלה את האירוע אני מעלה את האירוע האובייקט הנוכחי ולכן הדבר הנכון לדווח זה this פרמטר השני ותן לי אובייקט שמחזיק את כל הפרמטרים שברצונך לדווח.

  24. 08:08

    אני רוצה לדווח כרגע כמה fuel left, אז אנחנו צריכים לבנות אובייקט מטיפוס fuel event args ולשלוח לקונסטרקטור שלו את ה-fuel. כעת המחלקה, לפחות מהבחינה הזאת של האיבנט הזה, בנויה כמו שצריך.

  25. 08:37

    אנחנו תכף הולכים לתקן גם את האיבנט השני. אז אנחנו מדווחים עכשיו, איס זה האובייקט שהעלה את האירוע, שזה אנחנו, וכל הפרמטרים שברצוננו לדווח.

  26. 08:53

    כעת אנחנו צריכים לתקן את הפונקציות האלה. הפונקציה showFuel כבר לא מקבלת דאבל, היא חייבת לקבל בדיוק מה שהדלגייט מקבל. זאת אומרת, היא חייבת לקבל את שני המשתנים האלה sender ואי.

  27. 09:16

    בואו נחזור לפה, נרשום sender ואי. אבל אם היא לא מקבלת פיול left אלא מקבלת sender ו-e, שזה משתנה שמחזיק את כל הפרמטרים, מאיפה יש לי את ה-u-left?

  28. 09:36

    אז אם שמתם לב לגבי מה שקרה כאן, ראיתם שהמשתנה הזה שאנחנו שולחים מחזיק את הפיול. זאת אומרת שדרך ה-e אנחנו יכולים להגיע לכל הפרמטרים שהאיבנט מדווח.

  29. 09:56

    אנחנו רואים את ה-fuel left. אוקיי, אותו הדבר בדיוק אנחנו צריכים לעשות בפונקציה של Entering to Fuel Station שגם היא צריכה לקבל שני הפרמטרים האלה. בואו נשים אותה ליד החברה שלה פה למעלה.

  30. 10:18

    איך עכשיו אנחנו מטפלים באיוונט השני? האיוונט השני חייב להיות באותה מוסכמה בדיוק והוא לא, הוא לא מקבל כלום. אז אנחנו עכשיו צריכים לבנות בדיוק את המוסכמה הזאת.

  31. 10:39

    זאת אומרת שהדלגייט שלו צריך לקבל Object Sender ואיזשהו טיפוס שהשם שלו זה E, השם שלו משתנה ב-E, אבל הטיפוס צריך להחזיק את כל הפרמטרים שהאיבנט רוצה לדווח.

  32. 11:00

    אבל רגע, מקודם אנחנו ראינו שאני לא מדווח שום דבר אם נגמר השמן באוטו, כי אם נגמר השמן באוטו אז דאט סיט הולך המנוע.

  33. 11:12

    בעצם העובדה שקראתי לפונקציה שנמצאת באזור שמשתמש בי, זאתי, ואמרתי לה תקשיבי, אין שמן יותר במנוע, זה כבר מציין לאזור שמשתמש בנו שאין שמן.

  34. 11:30

    לא היינו חייבים לדווח שום דבר. אז אם אין לנו מה לדווח, איך אנחנו בדיוק שולחים אובייקט שמחזיק את כל הפרמטרים שברצוננו לדווח, כמו שעשינו מקודם?

  35. 11:42

    אז התשובה, אנחנו מדווחים את event tags שזאת מחלקת הבסיס שמקודם ירשנו זאת שבעצם אין בה כלום והיא אומרת אם אין לכם מה לדווח עדיין תשמרו על המוסכמה הבינלאומית הזאת של כל event בעולם זורק שני דברים object sender מי העלה את האירוע ואיזשהו משתנה שאומר מה הפרמטרים שהאבנט מדווח בין אם זה אפס

  36. 12:20

    אחד או מספר רב של פרמטרים כולם נמצאים באובייקט אחד. אם אין לנו מה לדווח אנחנו פשוט שולחים EventArgs.

  37. 12:29

    כעת אנחנו צריכים לחזור לפה ולחשוב מה בדיוק אנחנו שולחים. אז כאשר אין שמן כל מה שאנחנו צריכים לעשות זה מי מדווח? אני מדווח.

  38. 12:44

    מה אני שולח? או שאני יוצר אובייקט EventArgs ריק אבל זה די מיותר או שאני פשוט משתמש ב-event args נקודה empty.

  39. 12:59

    event args נקודה empty זה בדיוק משתנה שמציין שכרגע אין לי מה לדווח, וזה פשוט אובייקט ריק מטיפוס event args. אז כעת שמרנו על החתימה הבינלאומית של האירוע גם כשעבדנו עם האיבנט שלא מדווח כלום.

  40. 13:19

    אנחנו עכשיו צריכים ללכת ולדאוג שהחתימה הזאת אכן נמצאת בפונקציה הזאת. אז בואו ניקח בדיוק את החתימה שכתובה פה, נדביק בפונקציה show oil message וזאת החתימה.

  41. 13:39

    בואו נבדוק כעת את כל הנושא של המכונית. ניקח את כל הנושא של האנטיווירוס, נשים אותו בפונקציה נפרדת, נשים אותו כרגע בהערה ונחזור לקוד של המכונית, נבדוק, נריץ את התוכנית ונראה שכל התהליך הקודם קורה בדיוק אותו הדבר.

  42. 14:19

    אנחנו רואים את כל הנהיגה, ברגע שאין דלק אנחנו מקבלים את הדיווחים, ברגע שאין שמן אנחנו מקבלים את הדיווח, אבל הדבר היחידי ששונה בין הדוגמה הקודמת לדוגמה הנוכחית זה שאנחנו עשינו את זה בחתימה בינלאומית שידועה לכל המתכנתים בעולם של דוטנט,

לקורס המלא: קורס תכנות מונחה עצמים OOP

ההרצאה הקודמת: אירועים - Events - חלק 1

ההרצאה הבאה: אירועים - Events (הסבר נוסף)

הרצאות קשורות מקורסים אחרים

  • אירועים EVENTS ב-NodeJS
  • אירועים בריאקט - Events
  • Device Events
  • Animation Events

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת C# .NET - קורס תכנות למתחילים - דוט-נט / סי-שארפ - חומר לימוד של מדעי המחשב