משיב מוביל
סגירת WinForm ופתיחת אחד אחר

שאלה
-
אני מפתח תוכנה שיש לה שתי מסכים, אחד להתחברות ואחד לפעולה של התוכנה (לא קשור לשאלה ולכן לא ארחיב).
הרעיון הכללי הוא כזה -- בפעם הראשונה/ המשתמש לא מחובר המסך שיופיע הוא מסך ההתחברות
- כשהוא מתחבר (כלומר לוחץ על הכפתור והאימות מצליח) זה עובר למסך השני
- ברגע שהמשתמש לוחץ על כפתור התנתקות הוא עובר למסך הראשון
הבעיה היא שאני לא מצליח ליצור פונקציה, שתסגור את החלון הנוכחי, ותפתח את החלון השני.
הנה כמה מהבעיות שהיו עד עכשיו -- החלון לא באמת נסגר
- החלון כאילו נסגר (למען האמת הוא "הוחבא") אבל כשסוגרים את האפליקציה רואים שסוגרים אותו, וזה לא אסתטי.
- התוכנה כולה נסגרת
האם יש פתרון שבאמת סוגר את החלון והופך את ה-Winform השני לחלון המרכזי?
- נערך על-ידי yoavst יום רביעי 02 אוקטובר 2013 13:51
תשובות
-
טוב, יצרתי קובץ ריק עם 2 forms וניסיתי את כל התשובות שמצאתי באינטרנט.
האפשרות שעבדה לי היא האפשרות הבאה:
Form2 frm2 = new Form2(); //new Form2 (Form) this.Hide(); // hide the currect form frm2.Show(); // show Form2
אני חושב שניסיתי כמה דברים דומים לזה, אבל כשעברתי שוב על פתרונות ב-StackOverFlow זה עבד לי.
האם לפי דעתך צריך בשביל זה Theard, או שזה מספיק?- סומן כתשובה על-ידי yoavst יום חמישי 03 אוקטובר 2013 11:47
כל התגובות
-
ברוך הבא לפורום יואב (זה השם?)
אני לא מפתח ב WIN FORM (אלא אם אני אהיה חייב), אבל אני בטוח שאוכל למצוא לך את התשובה בכמה דקות אם אני אראה את הפרוייקט. אני מניח שאתה אומר שאתה פותח מסך אתה מתכוון שאתה לפתיחת טופס (FORM) :-) אם תצרף לנו את הקוד שלך יהיה קל להבין איזה אלמנט אתה מציג וכיצד ואז נוכל למצוא מייד את התשובה כיצד סוגרים אותו.
* בעקרון טכנולוגיית win form כשמה כן היא, עובדת עם טפסים FORM. אני לא יודע אם זו הדרך הטובה ביותר עד שאראה קוד אבל אתה תמיד יכול לעשות שימוש בשיטה הבאה:
1. לפתוח THREAD חדש
2. ב THREAD הזה לפתוח טופס חדש
3. כשאתה רוצה לסגור את הטופס פשוט תסיים את ה THREAD ואז הכל יסגר לחלוטין ולא רק יוסתר.
* עם זה אני דיי בטוח שיש מתודה מובנית בשם CLOSE או משהו דומה (אם יהיה לי את הקוד והשמות של המחלקות איתן אתה עובד אני אוכל כמובן למצוא פרטים). יבנתים הרעיון של ה THREAD החדש אמור לעבוד בכל מקרה
אני מקווה שזה נותן כיוון להתחלה
[Personal Site] [Blog] [Facebook]
- נערך על-ידי pituachMVP, Moderator יום חמישי 03 אוקטובר 2013 03:59
-
היי, הנה מספר חלקים בקוד:
if (result.Equals("done") { openWindow(); } //זה חלק מפונקציה ארוכה של און קליק, וכמובן היא לא מסתיימת ככה, צריך עוד סוגרים public void openWindow() { Form2 frm2 = new Form2(); frm2.ShowDialog(); this.Close(); }
המתודה המובנית Close שייכת למחלקה Form, אבל היא לרוב סוגרת את הכל.
כל המחלקות שלי הם יורשות של Form.
איך אתה מציע שה-theard יעבוד? -
בוקר טוב (הנה הסבר כללי ארוך קצת וסיכום בסוף)
1. בפיתוח אין לרוב, למחשב אין רגשות שהוא פעם כועס ועושה משהו אחד ופעם אחרת הוא שמח ולכן עושה משהו אחר :-) הכל שחור לבן מבחינת ההתנהגות (לא תמיד זה קל להבין מה מה השפיע על התוצאה כי יש הרבה גורמים).
2. FORM הוא אלמנט שחי בפני עצמו כמו כל מופע של מחלקה זה בסך הכל מופע של מחלקה בשם FORM. תיאורטית אין סיבה שסגירה שלו תסגור את התוכנית אלא אם למשל יש תלות בינו לבין האפליקציה, וזה מה שיש אצלך כניראה. אתה צריך לדעת מה קורה אצלך באפליציה מאחורי הקלעים... זה לא חוכמה סתם לפתוח תבנית של אפליקציה מוכנה בלי להבין את הקוד ש VS יוצר בשבילך.
הערה חשובה: הרעיון של שימוש בתבניות של פרויקטים מסוגים המוגדרים מראש מתבסס על כך שתבניות אלו מוגדרות בתוכנת ה VS. כל פרויקט שאנחנו רוצים אפשר לפתח מאפס בלי להיעזר בתבנית מוכנה, ה VS פשוט עושר לנו לזירוז עניינים. בגלל אמרתי שלמרות שאני לא מכיר WINFORM לא תהיה לי בעיה לעזור ובטח תוך כמה דקות לתת פתרון :-) אחרי הכל אני יודע לפתח ו WINFORM זה רק תבנית מוכנה שמתאימה לעבודה עם טכנולגיה זו.
אם תציץ בקוד שה VS יצר לך לבד, אז תגלה שהאפליקציה מקושרת לטופס הראשי בפקודה Application.Run. לכן אם סגרת את הטופס הראשי של התוכניתאז אתה סוגר למעשה את כל האפליקציה. וזה מה שאתה עושה בקוד שלך ולכן האפליקציה נסגרת!
מה התכוונת לעשות כשכתבת this.close? האם התכוונת לסגור את הטופס השני או הטופס הראשי?!? אתה לא יכול לכתוב משהו אם אתה לא מבין אותו. קודם לומדים ואז כותבים ולא הפוך (מי שעובד הפוך עלול למצוא את עצמו ממשיך להעתיק קודים בלי להבין גם אחרי 10 שנים).
אם כן, אתה צריך לתכנן את הארכיטקטורה של האפליקציה בצורה נכונה. אם אתה רוצה לסגור את הטופס הראשי אז עלייך להתאים את הקוד שלך. אם משתמש סוגר את האפליקציה אז ברור שכל הטפסים באפליקציה יסגרו... התכנון שלך לא נכון אם כן. תחשוב על תכנון אחר. זה לא קשור לקוד אלא לתכנון ארכיטקטורה של האפליקציה! זה זמן טוב להבין למה כל ילד יכול לכתוב קוד אבל הפיתוח האמיתי הוא התכנון. זה זמן טוב לקחת נייר ועיפרון ולתכנן את האפליקציה בלי לרשום שורת קוד אחת. אחרי שתדע מה אתה רוצה לעשות ויהיה בזה הגיון אז תוכל להמשיך לקוד. למשל סגירת טופס ראשי של אפליקציה לא כל כך הגיוני אם לא רוצים שהאפליציה עצמה תיסגר... אבל מי אמר שצריך בכלל טופס ראשי לאפליקציה (זה רמז חשוב לפתרון אפשרי אם בכל זאת אתה רוצה לסור את הטופס הראשון)
3. אתה יודע מה ההבדל בין שימוש ב ShowDialog לעומת שימוש ב Show?
אם אתה לא בטוח במאה אחוז אז לפני שאתה ממשיך אני מאוד ממלית ללכת ולחפש חומר בגוגגל על הנושא! חפש בגוגל ShowDialog vs show
בקריאה של כמה שניות אני רואה ש ShowDialog הוא מסוג מודל בעוד show הוא מסוג moderless וזה אומר שאולי עשית שימוש במתודה לא מתאימה. אחרי הכל אתה לא רוצה תלות בין הטפסים אלא לסגור את הטופס אב אם הבנתי נכון.
https://www.google.co.il/webhp?sourceid=chrome-instant&ie=UTF-8&ion=1#q=ShowDialog+vs+show
לדוגמה
http://msdn.microsoft.com/en-US/library/39wcs2dh(VS.80).aspx4. נחזור לשאלה שלך לגבי פתיחת THREAD אז ישנם יותר ממאה דרכים שונות כמו תמיד. אני מבין שאתה עובד ב vb.net ולכן הקישור הבא יעזור לך:
https://www.google.co.il/webhp?sourceid=chrome-instant&ie=UTF-8&ion=1#q=vb.net+open+new+thread
לדוגמה אפשרות הכי פשוטה ב C# היא
Thread MyThread = new Thread(The_Method_Name); MyThread.Start();
מה שקורה כאן זה שאנחנו פותחים THRED חדש ומריצים בו את המתודה The_Method_Name (במתודה הזו אצלך אתה יכול לפתוח טופס חדש ואז הטופס החדש נפתח למעשה ב THREAD חדש)
לסיכום:
* כן צריך ללמוד עדיין אולי ובעיקר להבין מה קורה מאחורי הקלעים. נסה לעבור לעומק על מה שרשמתי מעל ומה שלא מובן תשאל ואני אנסה לפרט.
* אתה צריך לתכנן את האפליקציה כך שלא תסגור את האפליקצה עצמה אלא טפסים שאין להם תלות באפליקציה. אתה יכול לפתוח אפליקציה גם בלי טופס ראשי אם אתה רוצה... תתכנן ותחזור עם מה שאתה מחליט לבצע. אבל תנבה לתכנן בדיוק מה קורה אצלך ומה מתאים לך
*מכיוון שיש מתודה מוכנה של CLOSE למחלקה של FORM אז אין משמעות לפתרון עם THREAD חדש (למרות שהוא יעבוד נהדר). אתה צריך לבדוק רק איזה טופס אתה מנסה לסגור וכמובן בהתאם לנקודה קודמת לא לסגור טופס ראשי.
[Personal Site] [Blog] [Facebook]
-
אני אנסה לשים הסבר יותר מסודר בסוף השבוע בבלוג שאני אפרסם. תנסה לעקוב אחרי ההסבר למעלה למרות שהוא קצת ארוך ולא כל כך מסודר :-)
תספר לנו אם הצלחת להבין או לא או חלקית, ותגיד היכן אתה עומד
[Personal Site] [Blog] [Facebook]
-
טוב, יצרתי קובץ ריק עם 2 forms וניסיתי את כל התשובות שמצאתי באינטרנט.
האפשרות שעבדה לי היא האפשרות הבאה:
Form2 frm2 = new Form2(); //new Form2 (Form) this.Hide(); // hide the currect form frm2.Show(); // show Form2
אני חושב שניסיתי כמה דברים דומים לזה, אבל כשעברתי שוב על פתרונות ב-StackOverFlow זה עבד לי.
האם לפי דעתך צריך בשביל זה Theard, או שזה מספיק?- סומן כתשובה על-ידי yoavst יום חמישי 03 אוקטובר 2013 11:47
-
הקוד הזה לא סוגר את הטופס (הראשי) אלא רק מסתיר אותו ואז מציג את הטופס השני.
אם זה מתאים לך אז הקוד טוב ולא צריך THREAD נפרד.... תשתמש בפתרון הזה
* זה מאוד דומה לקוד שלך המקורי עם הבדל אחד של שימוש ב SHOW במקום SHOWDIALOG. שוב כדאי קצת לקרוא תיאוריה על ההבדל בין המתודות האלו :-) בקצרה: SHOWDIALOG יוצר תלות בין הטופס אב לבין הטופס בן שנפתח ולכן אולי SHOW היה באמת יותר מתאים לך (אבל שוב תזכור שהוא ממשיך לעבוד בצורה נסתרת ולא באמת סגרת את הטופס). האחד מסוג MODELESS ו MODEL והאחר מסוג MODELESS. אתה יכול לקרוא על זה יותר כאן:
http://msdn.microsoft.com/en-US/library/39wcs2dh(VS.80).aspx** הערה: כשאני כותב "אתה יכול לקרוא על זה" הכוונה שאתה חייב לקרוא על זה אם אתה רוצה ללמוד :-)
[Personal Site] [Blog] [Facebook]
-
-
אהלן יואב
הנה, העלתי הסבר מסודר וכמעט מלא על הנושא. אני מאוד ממליץ לך לקרוא אותו מההתחלה עד הסוף בצורה מעמיקה ולא רק לרוץ לקודים. יש שם הסבר קצת על מה קורה לך מאחורי הקלעים כשאתה מריץ אפליקציית Winform ולמה סגירת הטופס הראשי יצרה לך בעיה. כמו כן יש את 2 הפתרונות עליהן דיברתי (אחד מהן שאתה בחרת הוא הסתרה של הטופס והפתרון השני של סגירה אמיתי של הטופס הראשון גם קיימת שם).
אני עוד אוסיף כמה מילים בשבוע הקרוב כניראה אבל בהחלט זה מסכם את העניין טוב אני חושב.
קריאה מהנה
http://ariely.info/Blog/tabid/83/EntryId/126/Closing-Main-Form-Without-exit-the-application.aspx
[Personal Site] [Blog] [Facebook]