
ShowDialog(). זו הצגה מודלית: הקוד נעצר בשורה הזאת עד שהמשתמש סוגר את התיבה.ShowDialog() הקוד Text = "done" מתבצע רק אחרי סגירת התיבה.DialogResult שמוחזר: רק אם הוא OK ממשיכים לעבד את הבחירה. בלחיצה על Cancel או על X לא משנים דבר.Owner (הטופס עצמו, this) מגדיר את החלון ההורה של התיבה, וכך היא לא נעלמת כשהמשתמש עובר בין חלונות.Color.DialogResult.OK. בלחיצה על Cancel הטופס נשאר בצבעו.Font מחזירה את הגופן שנבחר.Controls ונתן לכל רכיב את הגופן בנפרד, כדי ששינוי הגופן לא ישפיע על גודל הטופס.SelectedPath מחזירה את הנתיב.C:\, שמניח שהכונן נקרא C. תיקיית התוכנה, דרך Application.StartupPath. תיקייה מיוחדת כמו Program Files, דרך Environment.GetFolderPath, שמוצא את הנתיב האמיתי בכל מחשב בלי לנחש.ShowNewFolderButton = false מסתיר את הלחצן ליצירת תיקייה חדשה.FileName. התיבה לא פותחת את הקובץ בעצמה.תיאור|סיומות, כשהסיומות מופרדות בנקודה-פסיק, למשל Image files|*.jpg;*.png ו-All files|*.*. כשמפרידים בין פילטרים משתמשים בקו אנכי.DialogResult לפני שימוש בבחירה, ולהגדיר פילטרים לקבצים.הטקסט המלא של הדקות הראשונות בהרצאה «תיבות דו-שיח - Build-In Dialog Boxes» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים לנושא שנקרא תיבות דו-שיח מובנות. בילד אין דיאלוג בוקס. קודם כל, מה זה דיאלוג בוקס או תיבת דו-שיח? דיאלוג בוקס זה בעצם איזשהו טופס שקיים בילד אין בתוך מערכת ההפעלה Windows, שמאפשר למשתמש לבחור דבר מסוים.
לדוגמה, טופס שמאפשר למשתמש לבחור צבע. אתם בטח נתקלתם בטופס הזה פה ושם. השתמש יכול לבחור צבע, ואחר כך אנחנו בתור מתכנתים יכולים להשתמש עם הצבע שהוא בחר.
ככה אנחנו יכולים להציג לו איזושהי תיבה כזאת, מובנית, אנחנו לא צריכים לבנות אותה בעצמנו, בכדי שהוא יבחר דבר מסוים. פה אנחנו יכולים לראות איזה תיבות build-in קיימות ואנחנו יכולים להשתמש בהן.
אז התיבות שקיימות נמצאות בסרגל Dialogs. כאן כבר אנחנו רואים את Color Dialog. בואו נתחיל עם Color Dialog ונתקדם לאחר מכן לשאר התיבות. כל מה שאנחנו צריכים לעשות זה לגרור על הטופס את התיבה שאנחנו רוצים ושימו לב שכשאני עוזב לא רואים את התיבה על הטופס זה לא רכיב שנראה אלא זה נמצא פה למטה בכדי להציג את התיבה
אני אקח איזשהו לחצן בואו נשים פה לחצן וניתן לו איזשהו שם btn color text שעליו select color אני נכנס לתוך הקוד של הלחצן וכל מה שאנחנו צריכים לעשות זה קודם כל לגשת לרכיב colorDialog1 שפרסנו על הקובץ, נקודה, showDialog.
showDialog זה פונקציה שמאפשרת להציג את התיבה עצמה, תכף אנחנו נראה בדיוק מה אנחנו רואים בתיבה, והפונקציה הזאת היא פונקציה שמציגה את התיבה בצורה שנקראת צורה מודלית או הצגה מודלית.
מה זה אומר הצגה מודלית? הצגה מודלית זה אומר שהפקודה הזאת נחשבת כ-Blocking Operation. Blocking Operation זה אומר שכל עוד הפקודה לא מסתיימת, הפונקציה לא מסתיימת, לא חוזרת, אז התוכנית נתקעת ולא ממשיכה הלאה.
דבר ראשון, בואו נריץ ונראה מה אנחנו בעצם רואים, ואז תכף נבין מה זה אומר הצגה מודלית. אם אני לוחץ עכשיו על הלחצן, אני רואה את התיבה.
להלן התיבה מאפשרת למשתמש לבחור צבע, משתמש יכול לבחור איזשהו צבע ברשימה, הוא יכול לעצב לעצמו צבע בעזרת ה-Define Custom Color בצורה כזאת, בצורה כזאת, עם החץ הזה.
אחרי שהוא בחר צבע הוא יכול ללחוץ על Add to Custom Colors ולבחור מכאן צבע שהוא יצר בעצמו, ולוחץ אוקיי או קאנסל. עכשיו, הזכרתי מקודם את המונח הצגה מודלית, מה זה אומר?
זה אומר שאם לדוגמה אחרי שאנחנו כתבנו את השואו דיאלוג אנחנו כותבים איזשהו קטע קוד מסוים לדוגמה טקסט שווה דן אני מריץ לוחץ על הלחצן ושימו לב שמוצגת לי התיבה אבל הפקודה טקסט שווה דן לא מתבצעת עדיין איך אני יודע שהפקודה לא מתבצעת כי הפקודה טקסט שווה דן פשוט אומרת, נא לכתוב את המחוזת done בטקסט
של הטופס, במקום הפורום אחד הזה היינו אמורים לראות done. בגלל שאנחנו לא רואים done, זה אומר שהפקודה הזאת נתקעת ולא זזה מילימטר עד שאנחנו לא נעשה או cancel או אוקיי.
בואו נעשה אוקיי, ואנחנו רואים את הדן למעלה. עכשיו, הנתון הזה הוא מאוד חשוב לנו. למה? כי זה אומר שכל עוד המשתמש לא בחר צבע או לחץ cancel, או cancel או אוקיי אנחנו לא נמשיך הלאה זאת הצגה מודלית מודל show וזה אומר שאחרי הפקודה אנחנו יכולים להשתמש עם
הצבע שלו במקום לרשום פה done אנחנו יכולים ללכת לדיס שווה הטופס עצמו נקודה back color כמובן אנחנו לא צריכים לרשום דיס סתם אני רושם שנבין שאנחנו נמצאים בטופס שווה color דיאלוג אחד, נקודה, הצבע שהיוזר בחר.
בואו נריץ, נלחץ על הלחצן, אנחנו רואים את התיבה, ושימו לב שעדיין הטופס לא נצבע. אני בוחר ירוק, מבצע אוקיי, ורק עכשיו התוכנית ממשיכה ואני צובע את זה בירוק.
אבל מה קורה אם עכשיו אני בוחר נניח כתום ולוחץ cancel? ואנחנו רואים שלא קרה כלום, אבל עדיין משהו קרה כאן, והפקודה הזאת התבצעה, אפילו שהיא לא באמת השפיעה על הטופס.
אנחנו רוצים לבצע משהו אחר. בואו רגע נריץ את זה, נפתח את התיבה, נבצע cancel, ושימו לב שבעצם קרה כאן איזשהו אפקט לא רצוי, כי כשעשיתי cancel, אז בעצם לא רציתי להמשיך ולבצע את הפעילות של התיבה הזאת, והצבע הדיפולטי היה שחור.
אני לא רוצה לצבוע את הטופס בשחור, אני ביצעתי cancel. זאת אומרת שאנחנו צריכים עכשיו איכשהו לדעת, מה המשתמש לחץ ואם אנחנו מסתכלים על הפונקציה show dialogue אנחנו רואים שהיא מחזירה אובייקט שהטיפוס שלו זה dialogue result אז בואו נפתח
אובייקט מטיפוס dialogue result ונבצע בדיקה אם result שונה מ-ok אולי המשתמש לחץ escape אולי הוא לחץ cancel אולי הוא לחץ על ה-x וסגר את הטופס אבל רק אם המשתמש עם ה-result שונה מ-ok אז בעצם האמת אם הוא הוא שונה מאוקיי אני לא רוצה לעשות כלום אז בואו נעשה את זה הפוך רק אם הוא שווה לאוקיי רק אז אני בעצם רוצה לבצע צביעה של הטופס בואו נבדוק אני מריץ מציג את התיבה לוחץ cancel שום דבר לא קורה
מציג את התיבה בוחר צבע לוחץ cancel שום דבר לא קורה אבל אם אני אבחר איזשהו צבע ונבצע אוקיי רק אז אנחנו קיבלנו מהdialog result את הקבוע אוקיי ואנחנו יכולים לעבוד לפיו ולהמשיך לעשות את הקוד שלנו.
דבר נוסף שחשוב להבין בפקודה הזאת זה שאם אני מסתכל על show dialogue אני רואה שיש לה עוד העמסה שאומרת owner, iwin32.window וסך הכל איזשהו אובייקט שמתאר את החלון שהוא נחשב ה-parent של התיבה ומבחינתנו זה אמור להיות this, כלומר אני, החלון שלי הוא זה שיצר את התיבה ולכן אני האונר שלה.
למה חשוב לנו להעביר את עצמנו בתור אונרים בתור החלון הפרנט שמציג את התיבה? הסיבה היא כי אם לדוגמה משתמש מציג את התיבה ואז הוא עובר לטופס אחר, קצת קשה לי להראות את זה, או פותח איזה תוכנה אחרת ולאחר מכן חוזר לטופס שלנו, יכול להיות מצב שאם זה לא owner הוא לא יראה את התיבה הזאתי ולא יבין למה הוא לא מצליח
להתעסק עם הטופס. קורים מקרים כאלה, זה די נדיר אבל יכול לקרות כל מיני מקרים כאלה. זה נקודות של עיבוד פוקוס והחזרת הפוקוס.
אם אני מגדיר שאני האונר של התיבה, תמיד כשאני אחזור לטופס המקורי שלנו, התיבה הזאתי גם תוצג אם היא הייתה בתהליך ההצגה. כלומר, אם עדיין המשתמש לא ביטל אותה.
אז חשוב לציין מי ה-Owner של התיבה שאנחנו מציגים. דבר נוסף שאנחנו יכולים לראות זה שכאשר אנחנו מציגים את התיבה אנחנו לא יכולים לעבור לטופס ה-Parent עד שאנחנו לא מתייחסים לתיבה הזאת.
זה גם כן חלק מהתנהגות ה-Dialog, ה-Module בעצם. התנהגות ה-Module, זה אומר א', אנחנו לא נמשיך הלאה עד שה-User לא ביצע Cancel או אוקיי, ב. אנחנו לא יכולים להציג או לחזור או לתת פוקוס לטופס פרנד שלנו.
אז מה שראינו כרגע זה סך הכל את תיבת הצבעים. אנחנו רוצים לעבור ולראות אילו עוד תיבות דו-שיח קיימות.
והתיבה הבאה שאנחנו הולכים לראות זה תיבת הגופנים. בואו ניקח לחצן btn font וניתן לו פה select font. נחזור לדיאלוגס ונבחר את פונט דיאלוג, נזרוק את זה על הטופס, אנחנו רואים שזה מופיע פה למטה.
נחזור בחזרה, דאבל קליק, ונבצע את אותו הדבר בדיוק, אבל הפעם נשתמש בפונט דיאלוג אחד, זאת התיבה. בסדר, יש לנו פה את התוצאה בריזולט.
במידה והיוזר בחר אוקיי, אנחנו רוצים לשנות את הפונט של הטופס. היוזר הרי בחר פונט. שינוי הפונט של הטופס אמור להשפיע על כל הפונטים של הרכיבים שעל הטופס.
לדוגמה, הפונטים של הלחצנים. סלקט פונט, בואו נבחר 14 bold italic, fixed myriam, underline.
מבצע אוקיי, ואנחנו רואים שהטופס הושפע מזה והרכיבים שעליו הושפעו מזה. דרך אגב, יכול להיות מצב שאנחנו לא רוצים שהטופס יושפע, שימו לב שכל הטופס גדל בייסיקלי.
אנחנו יכול להיות שנרצה שרק הרכיבים שעליו יושפעו מזה, בלי שהטופס יקרה לו משהו, אוקיי? אז בואו ניקח כאן איזושהי לייבל וניתן לה את הטקסט טסט פונט בצורה כזאת.
ומה שאנחנו יכולים לעשות, נגדיל טיפה את הטופס, במקום לצבוע את כל הטופס, בואו נשים את זה בהערה, נרוץ ב-foreach control ctl in dist.controls כלומר אנחנו רצים על אוסף הפקדים שעל הטופס ואז כל ctl ניתן לו את אותו פונט, בואו נריץ, נבחר את אותו הדבר שבחרנו מקודם פחות או יותר
הנה fixed miriam underline, הפעם בחרתי 12, נבצע אוקיי ושימו לב שהרכיבים עצמם שהיו על הטופס הושפעו מזה.
פשוט רצתי בלולאה ונתתי את הפונט לכל אחד מהרכיבים ולא נתתי לטופס. ככה הטופס לא התעוות ולא גדל. אז היכולת שלנו להציג את תיבת הדו-שיח של הגופנים ולאפשר למשתמש לבחור גופן מהתיבה מתבצע על ידי תיבת הדו-שיח פונט דיאלוג.
בואו נמשיך ונראה את התיבה הבאה, שמאפשרת לבחור תיקייה פולדר. יש לנו פה את הלחצן Select Folder, נחזור בחזרה ונבחר את Folder Browser Dialog.
בואו נזרוק את זה, נחזור לפה, Dialog Result שווה Folder Browser Dialog 1, אני בכוונה לא משנה את השמות, שנשאיר את השמות הדיפולטיים בכדי שנבין שאנחנו מתעסקים עם התיבות האלה, במציאות תמיד הייתי משנה את השם.
ויש לנו פה את Show Dialog, גם כאן נשלח את הטופס ובואו נסתכל מה התיבה מציגה לנו. נריץ את התוכנית, נלחץ על הלחצן ואנחנו הולכים לראות את תיבת בחירת התיקייה.
אנחנו יכולים לבחור תיקייה כלשהי, מייבוקס, מבצע אוקיי, אבל מה קרה? אז למעשה התיבה עצמה אפשרה למשתמש לבחור תיקייה אבל היא לא עושה שום דבר עם התיקייה.
היא לא פותחת אותה, היא לא מוחקת אותה, היא לא שומרת בדברים, היא רק מאפשרת למשתמש לבחור תיקייה ומאפשרת לנו בתור מתכנתים לדעת מה הנתיב לתיקייה שנבחרה.
אז בואו ניקח איזושהי לייבל ופשוט נציג בלייבל את הנתיב שנבחר. נשים פה את הלייבל, נגדיר אפילו Auto Size False ויהיה LBL Selected ונגדיר docking למטה עם border style fixed.
נעלים את הטקסט, וכעת אנחנו יכולים לגשת ל-LBL selected text, ולהכניס את folder browser dialog1.selected path.
כמובן אנחנו רוצים לעשות את זה רק אם result שווה ל-ok. בואו נבדוק. נאפשר למשתמש לבחור. איזשהו נתיב, בואו נלך לקונן C, Document and Settings, All Users, נבצע אוקיי ונראה שזה בדיוק הנתיב שהיוזר בחר.
אנחנו יכולים עכשיו לעשות איתו פעולה, אנחנו יכולים לפתוח את התיקייה, לשמור שם קובץ, למחוק את התיקייה אם אפשר, אנחנו רק, אפשר לנו למשתמש לבחור את הנתיב.
עכשיו, יכול להיות שב-Default אנחנו רוצים שהתיבה הזאת תצביע על איזושהי תיקייה מסוימת. כאן יש לנו כמה אפשרויות. אפשרות אחת, ולפני ההצגה של התיבה אנחנו רוצים ללכת ל-Selected Path ובוא נניח להחניף את C נקודותיים ולקוות שיש למשתמש תיקייה כזאת.
כי מי אמר שלמשתמש חייב להיות קונן שנקרא C? יכול להחליט שהכונן הראשי לא נקרא C, אלא נקרא D, E, F ולא C. אז כאן אנחנו רואים שבמקרה צדקתי, אבל זאת לא שיטה טובה, כי אני לא אמור לנחש איזה כוננים ואיזה תיקיות יש במחשב של המשתמש.
אפשרות אחרת זה פשוט לבוא ולומר ש-selected path שווה ל-application.startup path. זאת היא דווקא שיטה די טובה, והיא אומרת שעכשיו התיקייה שהולכת להיפתח תצביע אוטומטית על התקייה של קובץ האקסקיושן.
אם אני אריץ את זה אני אראה אוטומטית שנפתחה לי התקייה בול איפה שקובץ האקסקיושן נמצא. קובץ האקסקיושן נמצא בדיבאג שבתוך תקיית בין שבתוך הפרויקט שפתחנו build-in dialogue boxes שנמצא בנושא שנקרא 10 build-in dialogue boxes וזה נמצא בתקייה שנקראת Windows
פורמס אפליקיישן וכו' וכו', וזה נמצא בתוך קונאנסים. אז זה גם כן בסדר גמור, בואו רגע נלחץ על אוקיי, ונראה רק שיש לנו אפשרות ליצור את זה, לבחור את זה, ומתי אנחנו נשתמש בזה?
מתי שאנחנו יודעים שיש לנו בתיקייה של קובץ אקסקיושן איזשהו קובץ או סדרת קבצים, ואנחנו רוצים שהמשתמש יבחר משם את התיקייה בתור תיקייה דיפולטית. אפשרות אחרת, בואו נשים את זה בהערה, זה לגשת לתיקייה אמיתית אחרת שקיימת במחשב של המשתמש, אבל איך אני יודע איזה תיקייה קיימת לו במחשב?
אז יש לנו את המחלקה environment. במחלקה environment יש פונקציה שנקראת get folder path. get folder path מקבלת איזשהו enum שמחזיק כל מיני תיקיות ידועות.
יש לנו פה את הדסטופ אם אנחנו רוצים להציג למשתמש, יש לנו את תיקיית ה-cookies, יש לנו את common files, סטארט-אפ, כל התיקיות הידועות שקיימות בכל מחשב, my pictures, my music וכולי.
בואו נלך וניתן לו את program files. עכשיו, מה היתרון בשיטה הזאתי? זה שלא מעניין אותי בתור מתכנת מה הנתיב לתיקייה שלו.
ה.net בעצם תצליח לגלות בדיוק מה הנתיב האמיתי לאותה תיקייה מיוחדת, ספיישל פולדר, שקיימת לו במחשב, בלי שאני יודע שזה לדוגמה מתחיל בקונן C.
יכול להיות שתיקיית הפרוגרם פיילס שלו נמצאת בכלל בקונן E ושם זה נקרא פרוגרם פיילס. בואו נריץ את זה, נלחץ על הלחצן ואנחנו רואים שאוטומטית יש לנו הצבעה על תיקיית פרוגרם פיילס.
הנה אנחנו רואים שביצענו בחירה של התיקייה הזאת בלי באמת לדעת מה הנתיב האמיתי שלה. עכשיו אם שמתם לב כאשר אנחנו הצגנו את התיבה היה לה משתמש אפשרות ליצור תיקייה חדשה אתם רואים את הלחצן make new folder זאת אומרת אם אני עכשיו הולך בוחר איזושהי תיקייה אחרת בוא נניח wamp אני יכול ללכת ל-make new folder ללחוץ וליצור איזושהי תיקייה חדשה
על ה-abcd ואז כמובן לבצע בחירה של התיקייה הזאת אבל לא בטוח שאנחנו רוצים שהמשתמש יוכל לפתוח תיקייה חדשה אנחנו אולי רוצים שהוא יבחר מתיקייה קיימת במידה ואנחנו לא רוצים שהמשתמש יראה את הלחצן הזה ויש לנו show new folder button, false.
נלחץ על הלחצן, ואנחנו לא רואים את הלחצן שמאפשר ליצור תיקייה חדשה. עוד אופציה שקיימת, בואו נעשה cancel, וכל מה שראינו עכשיו זה בעצם האפשרות שהמשתמש יבחר איזושהי תיקייה נקסט.
התיבה הבאה שקיימת ויש לנו יכולת להשתמש איתה זה תיבה שנקראת open file dialog. Open File Dialog זאתי תיבה שמאפשרת למשתמש לבחור קובץ איך אנחנו עובדים איתה.
דבר ראשון, נגדיר לחצן לצורך בדיקת התיבה. נלך ל-Properties, השם של הלחצן btnopenfile יש לנו פה openfile, דאבל קליק ואנחנו רוצים לכתוב את הקוד המתאים.
נתחיל עם dialogue.result שווה openfile.dialog show דיאלוג אנחנו שולחים את עצמנו בתור הטופס שהוא ה-parent או ה-owner אם result שווה ל-ok, user לחץ על אוקיי ולא על cancel או על