
הטקסט המלא של הדקות הראשונות בהרצאה «פרויקט מעשי ב-#C - תוכנת צייר - חלק 35» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אז בשיעורים הקודמים בנינו את ה-whiteboard בשיעור הזה, מה אנחנו היינו רוצים לעשות? המשימה שלנו היום זה לבצע בעצם את ה-array, smooth, change width, change color, bring forward, send to back, כל מה שקשור בעצם ל-select ללהיות מסוגלים לבחור אובייקט ואז לדבר עליו, לבחור אובייקט קיים אז האמת היא שאנחנו צריכים לשם כך, בואו רק
נריץ את התוכנית הפסקתי גם את הגוי, נריץ אז זהו, אם כך אנחנו צריכים דבר ראשון כספור נוסף כאן של סלקט אני רוצה ללחוץ על הכספור הנוסף הזה ואז לבחור משהו שקיים אני רוצה להיות מסוגל לבחור אקספור ללחוץ על הכספור ואז לבחור אותו ואז לשנות לו את האוביל לשנות לו את הצבע למחוק אותו אז בואו נעשה את זה כספור אני צריך בעצם שני כספורים אחד זה סלקט סלקטור
אחד זה eraser אז נזיז את כולם קצת למטה אז נגדיל קצת איזה טופס כבר אנחנו רואים שהכפתור font לא מתמקם נכון אז נשים את הכפתור שיתמקם לו תמיד נכון בעזרת un-go ואת הדבר הזה נזיז לכאן ואת כל אלה נזיז ניקח את התחתון אולי עד שהוא ייצמד נכון את שני אלה ניקח ונעשה להם copy ו-paste ונשים אותם כאן, וזה יהיה הסלקטור, אין לנו
עדיין s, סלקטור, טול ציפי יהיה סלקטור, ובואו נגיד שבהתחלה הוא לא צ'ק, טייבל קליק, החליף את הצ'ק לפולס, סייב, ואירייסור, אירייסר אני חושב אומרים, ואי.
אז אם אני עושה מאוס דאון והסלקטור בחור אז בעצם אני רוצה לחפש שייפ שנמצא איפה שלחצתי אז נלך ל-mouse down, דרך אגב יש לנו פה פונקציות של גוי שברחו לנו החוצה של טקסט בוקס ושל פאנל ושל רידיו ושל בטן, כל מיני קונטרולים ניקח אותם מאיתנו כי זה הופך את הקובץ ללא קריא
ניקח את הפונקציות, נשים אותם כרגע בפורום הראשי אז בפורום הראשי יש לנו אפילו שתי פונקציות שהן כלליות לפורום, פורום אחד ורדיו, בוא נגיד שהם פשוט אלה הג'נרל, אין לי שם אחר בשביל זה, נעשה פה פייסט, ניקח גם את הפונקציה הזו ונעביר אותה לכאן ונסיים פה את ג'נרל, נסיים, יותר קרירי, ונחזור לפאנל ויידבורד,
אז במאוס דאון, זה מאוס דאון, אז זה היה רדיו בטן טקסט, פעלנו בו אם הוא לחוץ, רק אחד מהם יכול להיות לחוץ, בואו נטפל בסלקטור, עכשיו סלקטור לא אכפת לו מוויסט ומשום דבר והוא גם לא אמור, בוא נגיד שסלקטור הוא שונה לגמרי מכל מה שעשינו עד עכשיו אז אפשר להגיד שאולי
נחלק את זה אפילו ל-region, אתם יכולים לשאול למה בעצם אני לא מגדיר פונקציה נפרדת לטפל במאוס דאון סלקטור ופונקציה נפרדת לטפל במהוס דאון שיוצר קונטרונים חדשים, שייטים חדשים.
אז אמרנו כבר, פונקציה חדשה זה רק כאשר זה קוד של יותר משורה אחת שמופעל מיותר ממקום אחד. במקרה שלנו כרגע רק מהוס דאון מפעיל את הקוד של מולנו.
לכן אני לא מגדיר פונקציה נפרדת. הגדרה של פונקציות היא גם נוחה מאוד בשביל להפוך את הקוד ליותר קריא. זה מחלק את הכל ליותר פונקציות אז זה יותר קריא, זה היה פעם, היום יש לנו את האפשרות של לעשות ריג'ן, ריג'ן גם הופכת את זה ליותר קריא ויותר נכון, אין הצדקה לפונקציה נפרדת, זה גם יותר עבודה שחורה עכשיו לחלק את זה לפונקציות, זה יהיה האזור של הסלקטור,
נשכפל את זה ונגיד שזה האזור של השייפינג, יותר נכון ניו שייפ, בעצם זה ניו שייפ, וניקח את זה אולי לסוף הפונקציה, כי כל זה מטפל בניו שייפס, ככה.
נצמצם את הפונקציה הזו. קונטרול וסוגר ימני מסולסל מקפיץ אותי כמובן לתחילת ה-region, וקונטרול וסוגר ימני מסולסל גם הוא מביא אותי לסוף, מההתחלה לסוף, כמו שאתם רואים.
אז נצמצם את זה. תכף נעשה פה את ה-region של סלקטור, ככה תראה הפונקציה והיא כבר יותר קריאה. אבל האמת היא שהיא עדיין לא קריאה, כשאני פותח את New Shape זה גולש לי מהמסך וכל מה שגולש לי מהמסך הוא לא קריק קשה מאוד לעקוב אחרי דברים שגולשים מהמסך עכשיו ב-C++ כל if יש לו אוטומטית ריג'ן מובנה
זאת אומרת הוא יכול ללכות על המינוס מינוס מינוס וזה היה נורא נורא נוח אבל האמת היא שגם יש לי פה את הדבר הזה זה האזור של ה-elipse, זה האזור של הריקטנגל אופריהנד וליין וטקסט והכנה אז אפשר לבודד את זה לריג'נין ריג'ן אימית, איזושהי הכנה לכולם וריג'ן של הטקסט וריג'ן של סרי-הנד וליין ריג'ן של הרקטנגל, ריג'ן של האליפס ו-Edge-shape
היא שורה אחת, היא יכולה להישאר ככה, בואו נצטמצם ונראה איך זה נראה עכשיו פאנל ווייד-בורד מארס דאון, יכולה להיות פונקציה יותר קריאה עם אזור נפרד לסלקטור ואזור נפרד ל-New-shape כאשר יש לנו אזורים עדיין נפרדים אלא נזיז ונבדק שדברים יועמדו נכון בעזרת זה שנדרוס את הסוגר האחרון והכל יוזז נכון
אז יש לנו אימי, טקסט, נהיה בסדר גמור אני יכול גם לרחף ולראות את הקוד, אני לא חייב להיכנס כי בעצם כמות הקוד היא קטנה יותר אני לא חייב אפילו לפתוח את הקוד אם אני לא רוצה לערוך אותו זה ממש נוח, ממש קריא, יותר קריא בהחלט אז עכשיו אני רוצה לעבוד על האזור של סלקטור שאין לו קשר בעצם, אם הגעתי לאזור הזה בעצם אני עומד לצאת
מהפונקציה ולא להגיע בכלל לניו שייפ אם radio button לא eraser אלא selector.שקט ולתרו אז בסופו של דבר אני אעשה return אין לי מה להישאר בפונקציה מה אני רוצה בעצם לעשות אני רוצה כאן לעשות לולאה כמו בפנט לעבור על כל השייפים ולשאול כל אחד האם אתה נמצא האם אתה חושב שאתה בקואורדינטות של e האם לך יש נקודה ב-E מבחינתך, אתה תחליט.
אז בואו נלך לפיינט, ככה נראית פיינט. אז כדי לחלץ באמת את שייפס, טוב האמת היא שבטח את הקוד הזה יש לנו בסוף הפונקציה, או בפונקציה הנפרדת שעשינו, אדד שייפס.
בטח באדד שייפס יש לנו את הקוד שמחלץ בעצם את השתי שורות הראשונות האלה, אנחנו נצטרך לעשות אפשר להגיד באופן מיותר, אבל אני לא רואה כרגע פתרון אחר. אז פשוט ניקח אותה משם, או שנעתיק את זה מפיינט, הרבה יותר הגיוני.
אז נלך לפיינט, ואני לוקח את הקוד של פיינט, ואני מסביק אותו כאן, ובמקום להגיד לו, תצייר את עצמך, אני אשאל אותו: is point in, האם הנקודה הזו בתוכך, בתוך, וזה לא מקבל e-graphics, זה מקבל את e-x ואת e-y ונגדיר לו את הפונקציה
הזו, וזה X וזה Y. השאלה הנשאלת היא האם הפונקציה הזו היא אבסטרקטית או האם יש לה מימוש או האם היא משהו קצת שונה. והאמת היא שכן היא אבסטרקטית כי בעצם אין לי שום דרך לדעת בתור שייפ מי אני ומה אני ואם כן או לא אז אני לא רואה אז היא חייבת להיות אבסטרקטית.
אין לי שום הצעה למימוש של הפונקציה הזו ולכן אנחנו נלך עכשיו לכל אחד מהאובייקטים ושם בעצם נוסיף את הפונקציה. לדוגמה, ניקח משהו פשוט, הכי פשוט זה figure, וב-figure ניגע ב-shape, נרחף מעל הצ'ופצ'יק השמאלי ונגיד לו implement, ונגלול, זאת ידרו, וזאת י-update, והנה
is-point-in שמקבל x ו-y. נדרוס את זה שדברים יסתדרו יותר יפה. ובעצם מה רוצה הפונקציה הזו? קודם כל היא צריכה להחזיר true או false, זה דבר ראשון.
שוב נחזור לפרום הראשי, וזה בעצם צריך להיות ככה בול b שווה לזה אם b שווה לטרו אם אכן מצאנו אז בעצם בחרנו אז צריך בעצם להגדיר משתנה גלובלי בטופס הראשי שזוכר מי השייפ הבחור אז שוב נצמצם כאן עכשיו יש לנו פה קלעון משתנה אחד שנקרא דרואינג
והאמת היא שהוא יכול להיות כמובן private, read-only אבל אנחנו רוצים עכשיו עוד משתנה שהוא יהיה private, לא read-only, private-shape זה אומר ה-selected-shape, בהתחלה הוא null, משתנה גלובלי הוא תמיד null אולי גם לזה נגדיר region, זה ייקרא variables המשתנים למרות שזה לא משתנה כי הוא read-only אבל שם סביר, לא מדויק מדי
אז יש לנו את underscore selected, נחזור אחורה, ובמקרה הזה אני אומר שselected שווה ל-f, מצאתי, מצאתי אותה, ו-return, אין טעם להמשיך, אנחנו יודעים פה לעשות ריתרן, אפשר לעשות break, זה לא משנה, break או ריתרן, break מוציא אותי מה-reach ומוציא אותי ל-return, ו-return גם היה מוציא אותי מיד החוצה,
אז בוא נגיד ש-return יותר ברור. שאני בעצם רוצה לצאת כאן מהפונקציה כי סיימתי בעצם, מצאתי את השייפ אז בין אם מצאתי או לא מצאתי, אני מסיים, אין טעם, אין לי בשביל מה להישאר בפונקציה הזו מבחינת סלקטור סיימנו כך או אחרת אבל יכול להיות שאולי מהנגלה הקודמת סלקטד היה כבר שווה למשהו וזה לא תקין יכול להיות שפה אנחנו צריכים באמת לעשות
אותו שווה לנאל זאת אומרת אם לא מצאנו שום דבר אז נעשה אותו שווה לנאל אז אולי ניקח את השורה הזו, נשים אותה כאן או נגיד שווה לנאל אז זה במרוס דאון הדבר הבא שאנחנו רוצים זה נגיד לשנות לו את הצבע אז בחרנו אבל עוד לפני זה
עוד לפני זה צריך לממש, עוד לא מימשנו את איז פוינט אין, נחזור שוב לשייפ ואיז פוינט אין חייבת להחזיר בול נחזור לפיגר, נשנה את זה לבול ידנית, זה לא משנה, או שניתן לו לשנות את זה וכאן בעצם נשאלת השאלה איך אנחנו מזהים אם xy נמצאת בנו, איך נעשה את זה אז איזה שדות יש לנו? בואו נצמצם רגע יש לנו xy, width והight
זה לא נשמע כזה קטסטרופלי אם, בואו נגיד שזה לא משנה אם אנחנו צורה ריקה, non-field או צורה מלאה field, אנחנו תמיד נחזיר כאילו אנחנו field אם הגיעו לי באמצע זה גם טוב מספיק אני אומר טוב, זהו, בחרו אותי אז פייס פוינט אין אין איקס, עכשיו מכיוון שאני נרמל
בפיגורה, זה היתרון של הנרמול שעשינו באפ דייט אני חושב, תמיד וידאנו שהאיקס שלנו היא השמאלית והוואי היא העליונה והוויטס דאטים תמיד חיובים אז זה מאוד נקי עלינו עכשיו אז אין איקס, ידוע שהיא השמאלית אז אם השמאלית יותר גדולה אז זהו, פה יש בעיה
רגע, רגע, רגע, אם איקס שלנו אולי אני אפוס את מה שבחוץ ואז יהיה יותר קל לקרוא את זה אם ה-X שהגיע אלינו היא יותר שמאלית ה-X החדשה, ה-X הזו, היא יותר שמאלית אפילו, כאן יותר קטנה זה יותר שמאלי מה-X שלנו, אז ברור שזה לא אנחנו אין מה להישאר כאן אז עושים Return False אותו דבר אני יכול להגיד לגבי ה-Y
אם ה-Y שהגיע יותר קטנה מה-Y שלנו, אז גם אותו דבר עכשיו מה לגבי האולי זה בכלל מתחתנו או בכלל מי ממנו אז אפשר לשכפל את זה ולשאול אם הx שהגיע היא יותר גדולה מx ועוד wick אז גם זה לא אנחנו הx שהגיע יותר גדולה מהנקודה הימנית ביותר שלנו
כמובן לגבי הy אם הy יותר גדולה מהנקודה הכי תחתונה שלנו אז גם לא אנחנו אם הגענו לכאן, אז זה אנחנו, ואז, אוקיי, אז הגענו true, עכשיו כל השייפים האחרים עדיין לא נימשו את זה, אז בואו נעשה שתמיד הם מחזירים false, רק שנראה שזה עובד, שוב שקלובה לקראתנו, ותמיד מחזיר false, אחת מהדרכים שיכולנו לא
לכתוב לכל אחת פונקציה שמחזירה false, ואם היינו הולכים לשייפ, ואומרים שהפונקציה היא לא אבסטרקטית, אלא היא וירטואלית, ואז היינו כותבים לגוף שמחזיר פולטס, אולי נעשה את זה בתור שלב ראשון.
דווקא לא נממש, אני לא רוצה לממש בטקסט וגם לא בליין וגם לא בפריהנט. בפיגר כן, אבל בכל האחרון אני רוצה שתמיד יוחזר הפולטס.
איך אני עושה את זה? אז אני מגדיר שהפונקציה היא וירטואלית, ואז יש לי את ההזדמנות לכתוב לה גוף, ובגוף אני עושה return false. מה זה אומר?
מה זה וירטואלית? זה אומר שאני יכול לכתוב לגוף, שאני חייב לכתוב לגוף,