PracticU

יוצרים חלון ידני מ-console application

בלי כתוביותעם כתוביות
PracticU › קורס WinForms - תוכנות רגילות בווינדוס › יוצרים חלון ידני מ-console application
מילון מושגים:
טופס - אזור בממשק שבו המשתמש מזין נתונים בשדות ושולח אותם, למשל טופס הרשמה או התחברות.
DLL - קובץ ספרייה ב-Windows המכיל קוד ופונקציות שתוכנות שונות יכולות לטעון ולהשתמש בהן במשותף.
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.
Visual Studio - סביבת פיתוח משולבת (IDE) של מיקרוסופט לכתיבה, ניפוי והרצה של קוד, בעיקר בשפות .NET.
כפתור - רכיב בממשק המשתמש שהמשתמש לוחץ עליו כדי להפעיל פעולה, כמו שליחת טופס או מעבר לדף אחר.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
גופן - העיצוב הגרפי של האותיות והתווים המוצגים בטקסט, הכולל צורה, סגנון וגודל.
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.

יוצרים חלון ידני מ-console application
השיעור מראה כיצד בונים טופס Windows Forms בתוך פרויקט Console Application. המטרה היא לראות בדיוק מה קורה מאחורי הקלעים, לפני שעוברים לפרויקט Windows Forms מוכן שמייצר חלק מהקוד אוטומטית.
למה בונים את הטופס ידנית
בפרויקט Console צריך להוסיף בעצמך את ההפניות ל-DLL הנדרשים ולכתוב בקוד את כל הרכיבים. כך יודעים בדיוק אילו רכיבים, מחלקות ו-DLL קיימים בפרויקט, ואיך כל הדברים מתחברים זה לזה.
שלבי הבנייה
1. הפניות (References): מוסיפים את System.Windows.Forms ואת System.Drawing. בלי ההפניה המחלקה Form לא מוכרת, ו-Visual Studio מציע להוסיף using למרחב השמות המתאים.
2. מחלקה שיורשת מ-Form: המחלקה שלנו יורשת את Form ומקבלת את כל התכונות והפונקציות שלה. הרכיבים מוגדרים כ-Data Members של המחלקה.
3. הוספת רכיבים לאוסף Controls: Label, TextBox ו-Button הם שדות פרטיים, אבל הם יוצגו על הטופס רק אחרי Controls.Add. הדובר הדגים שבלי הוספה כזאת הלייבל לא מופיע.
4. הגדרת מאפיינים בבנאי: Text, Left, Top, Height, BackColor, Font, WindowState, MaximizeBox ו-StartPosition. ערך כמו StartPosition = CenterScreen פותח את הטופס במרכז המסך.
5. אירועים: רישום לאירוע עם += ופונקציית קולבק. מוסכמה לשם: שם הרכיב, קו תחתון, ושם האירוע (למשל btnOk_Click).
6. פונקציה אחת לכמה רכיבים: רושמים את אותו אירוע למספר רכיבים, ומשתמשים ב-sender כדי לדעת איזה רכיב הפעיל את האירוע. לפני השימוש בו ממירים (cast) ל-Button.
7. ביטול סגירה: באירוע FormClosing שואלים את המשתמש, ואם הוא לא בטוח מבטלים את הסגירה עם e.Cancel = true.
8. הרצה: Application.Run מריץ את הטופס הראשי.
פקודות וערכים שהופיעו
- Application.EnableVisualStyles(); ו-Application.SetCompatibleTextRenderingDefault(false); לעיצוב בסגנון Windows XP ומעלה.
- MessageBox.Show(...) להצגת הודעה ולשאלה עם כפתורי Yes ו-No.
- MaximizeBox = false מבטל את לחצן ההגדלה.
- Output type של הפרויקט משתנה ל-Windows Application, כדי שחלון הקונסול לא יופיע.
טעויות נפוצות
- מחיקת פונקציית אירוע בלי לנקות את הרישום שלה גורמת לשגיאת קומפילציה.
- רישום אירוע משותף בלי לבדוק את sender גורם לכך שהפעולה מתבצעת על הרכיב הלא נכון. הדובר הראה שמעבר עכבר על לחצן אחד שינה את צבע הלחצן השני.
בסיום השיעור הסטודנט מבין שטופס הוא מחלקה שיורשת מ-Form, שהרכיבים שלו הם שדות במחלקה, ושאירועים הם מה שמחבר בין פעולת המשתמש לקוד.
השיעור הבא בקורס: פרוייקט חדש - WinForm Project

פרקי ההרצאה: יוצרים חלון ידני מ-console application

  1. 00:00

    בניית טופס מפרויקט Console

  2. 01:14

    יצירת פרויקט Console Application

  3. 02:26

    המחלקה Form והוספת Reference

  4. 05:40

    הצגת הטופס עם ShowDialog

  5. 07:00

    ירושה מהמחלקה Form

  6. 10:47

    הוספת Label כ-DataMember

  7. 13:46

    הוספה לאוסף Controls

  8. 16:24

    הוספת TextBox

תמלול ההרצאה: יוצרים חלון ידני מ-console application

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

  1. 00:04

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

  2. 00:19

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

  3. 00:34

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

  4. 01:00

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

  5. 01:21

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

  6. 01:34

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

  7. 01:59

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

  8. 02:13

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

  9. 02:36

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

  10. 02:59

    שלנו. אוקיי, אז זה אומר שבעצם חסר לנו איזשהו dll, איזשהו רפרנס שהמחלקה הזאת נמצאת בתוכו. והרפרנס שחסר לנו זה רפרנס שנקרא system windows forms.

  11. 03:18

    בואו נלך פה לכרטיסייה של .NET, רפרנס שנקרא system.windows.forums, הנה הוא כאן ונבצע אוקיי ואנחנו רואים שיש לנו כרגע את הרפרנס הזה, זאת אומרת כל המחלקות שמוגדרות כפאבליק ונמצאות בתוך ה-DLL הזה יש לנו עכשיו יכולת להשתמש איתן.

  12. 03:43

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

  13. 03:52

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

  14. 04:25

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

  15. 04:49

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

  16. 05:06

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

  17. 05:35

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

  18. 05:48

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

  19. 06:08

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

  20. 06:30

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

  21. 06:57

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

  22. 07:16

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

  23. 07:42

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

  24. 08:13

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

  25. 08:24

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

  26. 08:40

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

  27. 09:03

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

  28. 09:19

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

  29. 09:37

    ומה שאנחנו צריכים לעשות זה בעצם, אם אנחנו בונים מחלקה משלנו, כדאי שהיא תהיה בקובץ נפרד. לכן אני אוסיף כאן קלאס, אני אקרא לקלאס Details - Form, אני ארש את פורם, אני אשים את שני הקלאסים האלה Side by Side, ניפטר מ-Details - Form הזאת, וכך אנחנו יכולים לראות בעצם את כל התוכנית כולה.

  30. 10:33

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

  31. 10:57

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

  32. 11:14

    Data Member זה משתנה ברמת המחלקה כפי שלמדנו ב-Object Oriented. כל רכיב ויזואלי שנמצא על הטופס הוא בעצם Data Member של אותו הטופס.

  33. 11:25

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

  34. 11:38

    אז אנחנו צריכים פשוט מאוד בעולם ה-Winform להכיר את הרכיבים השונים שקיימים. אז אנחנו יוצרים פה private label ונקרא לה first name label. ניצור אובייקט label חדש, נריץ את הטופס, אבל תכף אתם תראו שאנחנו לא רואים שום label, כי כמובן גם לא הגדרתי מה הטקסט שאני רוצה לראות על הlabel.

  35. 12:12

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

  36. 12:34

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

  37. 12:52

    נריץ עדיין אנחנו לא רואים את הלייבל אוקיי אולי אנחנו צריכים מיקום הרי איפה אנחנו רוצים לראות את הלייבל? בואו נלך למאפיין left, נכניס 100, נלך למאפיין ונכניס 100. נריץ, אנחנו לא רואים את הלייבל.

  38. 13:25

    אוקיי, אולי אנחנו צריכים להגדיר את ה-visibility שווה true. נריץ, עדיין אנחנו לא רואים.

  39. 13:40

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

  40. 13:55

    בכדי לשייך את הDataMember הזה אנחנו צריכים לפנות לאוסף פנימי של הטופס שנקרא Controls ולהוסיף את הלייבל שלנו. כל הרכיבים הוויזואליים יורשים ממחלקת בסיס שנקראת Control ולכן באוסף Controls אנחנו יכולים לראות שפונקציית Add מקבלת רכיב ויזואלי ומוסיפה אותו לטופס.

  41. 14:22

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

  42. 14:42

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

  43. 14:57

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

  44. 15:25

    דבר נוסף שהייתי משנה כאן זה לא הייתי קורא ללייבל הזאת first name label. נהוג שרכיבים ויזואליים יתחילו בתחילית של בדרך כלל שלוש אותיות שמציינות מה הרכיב הוויזואלי מציין.

  45. 15:44

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

  46. 15:58

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

  47. 16:24

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

  48. 16:40

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

  49. 17:09

    txt top, ניתן את אותו הגובה של מקודם, 30. כמובן, גם אנחנו את התיבה טקסט צריכים לצרף לאוסף הפקדים. Controls, Add, txt first name, בואו נריץ ונראה איך זה מסתדר עכשיו על הטופס.

  50. 17:30

    ויש לנו כרגע את התיבת טקסט. אוקיי, בואו נסגור. נשכפל את שני החבר'ה האלה עבור lbl lastname וtxt lastname. נשכפל את כל אלה בכדי להכניס גם את lbl lastname ואת txt lastname.

  51. 18:15

    הטקסט של lbl lastname יהיה enter lastname.

לקורס המלא: קורס WinForms אונליין

ההרצאה הקודמת: הרצאת מבוא לקורס WinForms

ההרצאה הבאה: פרוייקט חדש - WinForm Project

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

  • מה זה console application
  • הסבר על חלון CONSOLE הראשי ב-AWS
  • Console Output
  • Console Log

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

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