6.3 עבודה עם טפסי MDI וטפסי בן 6.3.1 בחירת הטופס, או הפקד הפעיל כאשר המשתמש של ישןום ה MDI שלך פותח, שומר, וסוגר מספר טפסי בן בו זמנית, הוא צריך להיות מסוגל להתיחס לטופס הפעיל ותיחזוק מידע על מצב טפסי הבן. הפסקה הבאה מתארת את טכניקת כתיבת הקוד שאתה יכול להשתמש בכדי לבחור את הטופס או הפקד שעליו אתה רוצה לפעול, ותיחזוק מידע על מצב הטופס. לפעמים אתה רוצה ליצר פקד אשר יפעל על הטופס הפעיל כרגע . לדוגמא ,נניח שאתה רוצה להעתיק טקסט שבחרת מתיבת טקסט בטופס בן ל Clipboard .בדוגמא Mdinote.vbp ארוע ה Click של האפשרות "העתק" בתפריט Edit נקרא EditCopyProc ,פרוצדורה אשר מעתיקה טקסט נבחר ל Clipboard . מכיון שליישום יתכן ויהיו מספר מופעים של אותו טופס בן, הפרוצדורה צריכה לדעת לאיזה מופע להתיחס. לצורך זה הפרוצדורה משתמשת במאפיין ActiveForm ,אשר מחזיר את טופס הבן אשר הפוקוס עליו כרגע או אשר בו השתמשו אחרון. שים לב: לפחות טופס בן אחד צריך להיות מועלה ובמצב נראה בזמן קריאה למאפיין ActiveForm , אחרת תקבל הודעת שגיאה. כאשר יש לך מספר פקדים על הטופס, אתה צריך להחליט איזה יהיה פעיל. בדומה למאפיין ActiveForm , המאפיין ActiveControl מחזיר את הפקד המפוקס בטופס הבו הפעיל. לפניכם דוגמא לרוטינת העתקה אשר נקראת מתפריט של טופס בן ,תפריט בטופס ה MDI, או כפתור על סרגל הכלים:
באשר אתה כותב קוד עבור טופס בעל מספר מופעים, עדיף לא להשתמש בשם הטופס בזמן גישה למאפיין או פקד שלו.לדוגמא: פנה למאפיין הגובה של תיבת טקסט בטופס Form1 בצורה - Text1.Height במקום Form1.Text1.Height . בצורה זו , הקוד תמיד ישפיע על הטופס הנוכחי. דרך נוספת להשפיע על הטופס הנוכחי היא להשתמש במילה שמורה "Me " .השימוש במילה זו היא כאשר אתה רוצה שהקוד שבא אחריה יבוצע ע"י הטופס שהקוד שלו רץ כרגע. מילה זו מאוד שימושית כאשר רוצים להעביר את המופע בנוכחי של הטופס כארגומנט לפרוצדורה. כאשר אתה טוען טופס בו,טופס האב שלו(טופס ה MDI ) נטען אוטומטית ומופיע. אולם, כאשר אתה טוען את טופס ה MDI ,בנין לא נטענים באופן אוטומטי. בדוגמת יישום ה MDI "NotePad ",טופס הבן הוא אפשרות ברירת המחדל בזמן ההטענה, לכן שניהם נטענים ( הבן ו הMDI ) בזמן הרצת היישום. אם תשנה במאפייני הפרויקט את אפשרות הSTARTUP ל frmMDI ואז תריץ את היישום, רק טופס ה MDI יטען וטופס הבן בראשון יטען רק כאשר תבחר באפשרות NEW בתפריט File . אתה יכול לבחור במאפיין " AutoShowChildren " בכדי לטעון טופס בן מוסתר, ולהשאיר אותו מוסתר עד שתשתמש בשיטה "Show " .זה מאפשר לך לעדכן מספר מאפיינים כמו : captions, position, menus עוד לפני שרואים את טופס הבן. כאשר לטופס MDI בן יש גבול ניכר (BorderStyle = 2) מערכת ההפעלה מגבילה את הרוחב ובגובה שלו ומצבו בזמן שהוא נטען. מאפיינים אלו מושפעים מגודל טופס ה MDI ולא מטופס הבן שהוגדר בזמן התיכנון. כאשר סופס MDI בן הוא לא בעל גבול ניכר (BorderStyle = 0, 1, or 3) ,כאשר הוא נטען גובהו ורוחבו נקבעים לפי מה שניתן לו בזמן התיכנון. אם אתה נותן ערך שקר(FALS ) למאפיין AutoShowChildren אתה יכול לשנות את מצבו של טופס ה MDI בן לאחר טעינתו , אבל לפני שאתה מאפשר לראות אותו. כאשר המשתמש מחליט מיישום ה MDI אתה חייב לאפשר לו לשמור את עבודתו.בכדי לאפשר זאת, היישום צריך לדעת לקבוע כל זמן נתון אם הנתונים בטוםס הבן השתנו מאז הפעם האחרונה שהוא נשמר. אתה יכול לעשות זאת ע"י הצהרה על משתנה בוליאני ציבורי לכל טופס בן.לדוגמא:אתה יכול להצהיר על משתנה באיזור ההצהרות של טופס בן בצורה הבאה: Public boolDirty As Boolean בכל פעם שהטקסט ישתנה בתיבת הטקסט Text1 פרוצדורת האירוע שלה Change תיתן ערך אמת למשתנה boolDirty אתה יכול להוסיף את הקוד הבא בכדי לוודא האם הטקסט בתיבת הטקסט Text1 שונה מאז הפעם האחרונה שהוא נשמר או לא: Private Sub Text1_Change () מצד שני,בכל פעם שהמשתמש שומר את התוכן של טופס הבן, פרוצדורת Change של תיבת הטקט משנה את ערכו של המשתנה boolDirty ל שקר בכדי להראות שאין צורך כרגע לישמור את התוכו של Text1 בקוד הבא נניח שישנו פקד תפריט בשם Save (mnuFileSave) ופרוצדורה בשם FileSave אשר שומרת את התוכו של תיבת הטקסט:
הדגל boolDirty שימושי ביותר כאשר המשתמש רוצה לצאת מהיישום . זה יכול לקרות כאשר הוא בוחר באפשרות "סגור" .כאשר המשתמש יצא ע"י בחירת "סגור" מתוך תפריט Control של טופס ה MDI , VB ינסה להסיר את טופס ה MDI . כאשר טופס MDI מוסר, האירוע " QueryUnload" נקרא תחילה לטופס ה MDI ולאחר מכן לכל טפסי הבן שפתוחים.אם אף אחד מהקודים של הפרוצדורות QueryUnload לא מבטלת את פעולת הסרה , אז כל הבנים מוסרים ולאחר מכן מוסר טופס האב. מכיון שאירוע QueryUnload נקרא לפני שהטופס מוסר , אתה יכול לתת למשתמש אפשרות לשמור את הטופס לפני שמסירים אותו. הקוד הבא המשתמש בדגל boolDirty לקבוע האם צריך לשמור את הטופס לפני הסרתו. שים לב שאתה יכול לגשת לערך של משתנה ציבורי בכל מקום בפרויקט , קוד זה מניח שקימת פרוצדורה Save אשר שומרת את תוכן Text1 בקובץ.
Private Sub Form_QueryUnload(Cancel
As Integer, _UnloadMode As Integer)
|