PracticU

פרויקט מעשי ב-#C - תוכנת צייר - חלק 41

בלי כתוביותעם כתוביות
PracticU › פרויקט מעשי ב-#C - תוכנת צייר › פרויקט מעשי ב-#C - תוכנת צייר - חלק 41
מילון מושגים:
קומפיילר - תוכנה שממירה קוד מקור שנכתב בשפת תכנות לקוד שהמחשב יכול להריץ, ומדווחת על שגיאות תחביר.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
XML - שפת סימון לייצוג נתונים מובְנים בעזרת תגיות, המשמשת להחלפת מידע בין מערכות ולקובצי הגדרות.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.

פרויקט מעשי ב-#C - תוכנת צייר - חלק 41
השיעור עוסק בשמירה ופתיחה של ציור לקובץ, ובשני דברים שהתגלו בדרך: התנגשות שמות בין Width של Shape ל-Width של Figure, ושדות שאינם ניתנים לשמירה.
השלבים העיקריים
1. התנגשות שמות: ל-Shape היה Width שמייצג עובי קו, ול-Figure היה Width שמייצג רוחב אמיתי. הקומפיילר הודיע שהשדה מסתיר שדה שהורש. הוחלט לשנות את השם בבסיס ל-Thickness, בעזרת Find and Replace. אם באמת רוצים להסתיר, אפשר להשתמש במילה new.
2. דיאלוג שמירה: לחיצה על שמירה מציגה SaveFileDialog. אחרי אישור נפתח FileStream עם FileMode.Create, והקובץ נוצר או נדרס.
3. סריאליזציה: SoapFormatter כותב את רשימת הצורות לקובץ. לשם כך כל מחלקה צריכה להיות מסומנת כ-Serializable, כולל Shape ויורשיה.
4. שדות שאינם ניתנים לשמירה: Pen ו-SolidBrush לא סומנו כניתנים לשמירה. הפתרון: הם הפכו לתכונות שיוצרות אובייקט חדש בכל קריאה, מתוך הצבע והעובי ששמורים.
5. פתיחה: OpenFileDialog, ואחריו Deserialize שמחזיר אובייקט. מבצעים המרה לטיפוס הרשימה, והציור משוחזר.
6. בדיקה בתוך Notepad: הקובץ שנשמר הוא XML בפורמט SOAP, ואפשר לראות בו את הצורות, השדות שלהן והערכים.
7. מה נשמר: נשמרים שדות ונתונים. בנאים, פונקציות ותכונות שמחזירות ערך אינם נשמרים כנתונים.
שימו לב
הקובץ נראה מסובך לקריאה ידנית, והמרצה מציין שהמנגנון הזה חשוב גם לתקשורת בין מערכות, ונלמד בהמשך הקורס.
השיעור הבא בקורס: פרויקט מעשי ב-#C - תוכנת צייר - חלק 42

פרקי ההרצאה: פרויקט מעשי ב-#C - תוכנת צייר - חלק 41

  1. 00:00

    שינוי שמות שדות העובי לאחידות

  2. 03:55

    שמירה ופתיחה של קובץ ציור

  3. 05:41

    סריאליזציה לשמירת אובייקטים

  4. 07:35

    כתיבת הצורות לקובץ בעזרת FileStream

  5. 12:03

    שגיאה: מחלקת הצורה אינה Serializable

  6. 14:04

    סימון המחלקות כ-Serializable

  7. 16:44

    שדות Pen ו-Brush הופכים לתכונות

  8. 21:51

    קריאת הקובץ בחזרה לתוכנה

תמלול ההרצאה: פרויקט מעשי ב-#C - תוכנת צייר - חלק 41

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

  1. 00:11

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

  2. 00:34

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

  3. 00:50

    הוא אומר, the wits hides inherited member wits הוא שם לב לזה שבעצם אנחנו בזה שיש לנו שני שדות גם שני שדות עם אותו שם אחד אצל המוריש ואחד אצל היורש זה אומר שבעצם היורש מחביא את זה של המוריש כי זה משהו אחר הו זה בכלל תכונה זה property וזה שדה זה בעצם תכונה זה פרופרטי ובפיגר זה ממש שדה של דאטה אז הוא שם לב לזה שניהם אותו שם ואז הוא אומר אם אתה באמת התכוונת להחביא תשתמש use the new keyword if

  4. 01:39

    hiding was intended אם באמת התכוונת ואתה לא רוצה לקבל את ההערה הזו כנראה שבגרסה הבאה של הדוטנט לחטוף שגיאה על השורה הזו אז תגיד private new אני מתכוון להחביא F6 ואז אין לי הערה בגרסה הבאה גם לא תהיה לי שגיאה נראה שבגרסה הבאה כבר תהיה שגיאה על דבר שכזה אין דבר כזה צריך להיות החלטי אתה לא יכול להשאיר את זה כזה באוויר אבל האמת היא שהמילה וויט לא כל כך מתאימה לדעתי בשייט בשייט פה מדובר על עובי הייתי קורא

  5. 02:19

    לזה פיקנס זה פרייבט זה לא כל כך משנה הוא לא לא בעניין אבל בכל זאת בוא נשנה את וויט לפיקנס כל המערכת קונטרול h וויט צריך להיות או thickness או v, match case, match whole world, search hidden, בקרנט פרוג'קט, וזה פרייבט, זה חייב להיות רק בקרנט דוקימנט, ונגיד לו replace, גם את זה,

  6. 02:55

    אז זהו, אז הוא מחליף את זה, אבל הוא לא מחליף את זה עם האנדרוס, אנחנו נגיד לו בלי match whole world, ואז נגיד לו, replace את זה, וreplace את זה, ואת זה, ואת זה, ואת זה, ואת זה, יפה.

  7. 03:14

    זה היה כאן זה היה המשתנה המקומי עכשיו למשהו טיפה יותר מאתגר וזה הפרופרטי אז אני אשנה אותה כאן ל-thickness ונשתמש ב- rename ונעשה F6 יפה ואין אפילו הערה שזה מצוין זה גם הרבה יותר הגיוני הבעיה היא שלאלה אנחנו קוראים גם כן wits זה גם מן הראוי היה לקרוא להם thickness ולא wits כי זה צריך להתבלבל אבל

  8. 03:55

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

  9. 04:39

    זה דיאלוג, אבל עם F קטנה ועם אחד לסוף, זה האובייקט שלנו. show dialogue, תציג אותו. אותו דבר לגבי הopen, double click. אז צריך open דיאלוג, אז צריך להוסיף אותו, F7, ונגרור open file dialogue, למרות שההבדל ביניהם הוא מינורי, זה יותר נוח שיהיו שניים נפרדים, ושוב נחזור

  10. 05:08

    לopen שלנו, וopen file dialogue 1. show dialogue. יפה, זה מה שגורם לדיאלוג להיות מוצג. עכשיו, כשהיוזר לוחץ על אוקיי, אז אפשר להגיד לו אופ או דאבל קליק, אופ או דאבל קליק על זה, זה גם יופעל, גם סייב וגם אופן.

  11. 05:41

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

  12. 06:14

    אז נכתוב סופ פורמטר והוא לא נמצא טוב אז הוא אמור להכיר אותו אבל הוא לא מכיר אותו אז נוסיף לו פה using בקורה ידנית using system.runtime.serialization.formatters אז אם נסתכל בhelp אנחנו נראה ש-soap formatter נמצא בסיסטם רנטם סיריליזיישן פורמטר soap name stage.

  13. 06:59

    כשאנחנו באים לכאן ל-visual studio ואנחנו מנסים להוסיף אותו אז הוא אומר לנו binary אין לו פה הוא אמור להגיד לי soap הוא לא אומר אותו זאת אומרת חסר לו הוא רפרנס אז אנחנו הולכים לרפרנסס ומוסיפים רפרנס לדבר הזה סיסטם רנטם סיריליזיישן פורמטר soap כנראה שהוא ב-dll נפרד משלו ועכשיו נגיד לו פה פה using והנה soap ושוב נלך ל-soap ונגיד soapformatter.sf שווה ל-new

  14. 07:39

    soapformatter.sf.serialize אנחנו רוצים לעשות serialize לתוך ה-file stream אז נגדיר file stream ונכתוב file stream בצורה ברורה file stream והנה השופצ'יק בא לעזרנו ונגיד לו using system.io והוא שם את זה במקום כמובן הלא נכון צריך שזה יהיה כאן ועכשיו נגיד לו FileStream

  15. 08:19

    0 שווה ל-New FileStream וכאן אנחנו אומרים לו שם הכובד תכף נחזור לזה ו-FileMode הולך להיות לכתיבה זה לא תמיד אני מתבלבל מ-Create ל-Create New ל-Open Open או-Create Create is equivalent to requesting that if the file does not exist it will create בוא נקרא את זה בצורה מסודרת פייסבייל זה אופרנטי שקריט ניו פייל אם הפייל

  16. 08:55

    הזה אקזיסט it will be overwritten נראה טוב בסדר עוד איזה פרמטרים אפשר להגיד לו פייל אקסס זה לרייט ופייל שייר זה בכתיבה אנחנו לא רוצים לחלוק את הקובץ הזה עם אף אחד עכשיו כשאני עושה סריאלייז אני אומר לו לכתוב לפייל סטרים תכף נעבור על הקוד הזה בצורה מאוד ברורה

  17. 09:22

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

  18. 09:51

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

  19. 10:20

    ואם משהו חרג ולא הסתדר, עדיין הוא ייסגר. אחרת הוא יישאר פתוח אם לא אני אשתמש ביוזינג הזה אז הוא יישאר פתוח עוד נחזור לדבר על היוזינג הזה ומה בדיוק זה אומר בוא נעשה F6 כאן לא הגדרנו את path אז נגדיר את path אז נגדיר string path שווה לסייב פייל דיאלוג 1 נקודה פייל ניים F6 בילד סקסידד יפה זה שומר בוא נשים פה breakpoint וננסה להריץ את זה

  20. 11:03

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

  21. 11:33

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

  22. 11:52

    זה בעצם whiteboard 1, אפשר להגיד, מה שבא לנו. הגענו לנקודה הזו, ונעשה step into, אז יש לנו את הפס, זה הנתיב, מקום מאוד מעניין, ויצאנו את ה-file stream, יצרנו את ה-soap formatter, חילצנו את ה-current slide, חילצנו את shapes,

  23. 12:15

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

  24. 12:46

    דה טייפ פיגר אין אסמבלי בלה בלה בלה is not marked as serializable. מה בעצם הוא אומר? הוא אומר שפיגר היא לא ניתנת לסריאליזיישן. מה זה סריאליזיישן?

  25. 13:04

    ומה זה אומר not marked as serializable? האמת היא שזה משהו די פשוט. הרעיון הוא שבעצם הפונקציה serialize הוצאה את כל העבודה שאנחנו עשינו באדרסבוק באדרסבוק אנחנו בחרנו איך לפרמנט את הכובד והסופט פורמטר הוא המקביל שלנו והוא זה שבוחר איך לפרמנט את הכובד ואחרי זה אם נשתמש בו באופן אז הוא גם ידע איך בעצם הוא פרמנט את הכובד איך הוא סידר

  26. 13:36

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

  27. 14:05

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

  28. 14:39

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

  29. 15:42

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

  30. 16:08

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

  31. 16:35

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

  32. 16:52

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

  33. 17:28

    ופלואוט הוא סיריאליזבילי כל השדות הם סיריאליזביליים הפונקציות לא מעניינות את הסיריאלייזר אבל השדות כן אנחנו לא נעשה את פן ואת בראש כשדות אלא נהפוך אותם לפרופרטיז ונעשה פה גט שעושה return new pen והפן הזה אני אתן לו את color ואת wick או ששינו את זה כבר

  34. 18:12

    לsickness ונריץ, לא נריץ אפילו שוב, פשוט נשנה גם את בראש, נוסיף לה את גט ונעשה return new solid brush היא מקבלת פשוט את ה-color וננסה להריץ שוב ריצארט ואנחנו עדיין צריכים לאחסן איפשהו אז זהו שאנחנו לא צריכים לאחסן מיותר לחלוטין כי כל פעם שמישהו מבקש את הפן שלי את הבראש שלי פשוט אני מקצה

  35. 18:26

    לו אותה מחדש את color ואת width אני תמיד שומר ונריץ שוב אז שמעתי את color ואת thickness יפה ואולי נעשה משהו פשוט כמו רק FE, סילד אליפט, ונעשה פייל סייב אס, בואו נראה שזה עובד.

  36. 19:31

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

  37. 19:47

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

  38. 20:21

    אנדוולופ, משהו נורא ארוך ולא מובן, SOP BODY, A1, אוה הנה הרייליסט שלנו, מה עוד אפשר לראות בטיפות שלו, הוא מסוג סיסטם קולקשן באמת, ניימספייס של ה-CLR, של סכמה של מייקרוסופט דוט קום אפשר אפילו ללכת לאתר הזה ולראות שם את ההגדרה של סיסטם קולקשן ושם למצוא את הרייליסט אחד זה בעצם

  39. 20:50

    ההגדרה של a1 בxml name space מה זה xml ולמה xml זה באמת בהזדמנות אחרת ניכנס יותר לעומק מוד אנחנו יכולים לראות פה אז יש לנו את figure הנה figure שלנו והנה אליפס והנה is field שווה לטרו ולטייץ והאיקס 122 והוואי 87 והוויט 179 וההייט 118 וכנראה שאנחנו יורשים את קלר יש פה איזה value 0 ונון קלר 35

  40. 21:37

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

  41. 22:15

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

לקורס המלא: פרויקט מעשי ב‑#C אונליין

ההרצאה הקודמת: פרויקט מעשי ב-#C - תוכנת צייר - חלק 40

ההרצאה הבאה: פרויקט מעשי ב-#C - תוכנת צייר - חלק 42

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

  • תרגיל 24 - תוכנת צ'אט - חלק 1
  • פרויקט מעשי ב-#C - ספר טלפונים - חלק 1
  • תרגיל מעשי Delegate Event
  • שדרוג צייר שלנו על canvas

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

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס תכנות מתקדם - #Advanced .NET C
  • קורס WCF - תקשורת למתקדמים בדוט-נט