w
ראשי >>יצירת ממשק למשתמש >> עבודה עם טפסי MDI וטפסי בן
מפת הפרק:

6.3 עבודה עם טפסי MDI וטפסי בן

6.3.1 בחירת הטופס, או הפקד הפעיל
6.3.2 טעינת טפסי MDI וטפסי בן
6.3.3 קביעת גודל ומצב של טופס בן
6.3.4 תיחזוק מידע על מצב טופס בן
6.3.4 הסרת טפסי MDI ע"י QueryUnload

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

בחירת הטופס, או הפקד הפעיל

לפעמים אתה רוצה ליצר פקד אשר יפעל על הטופס הפעיל כרגע . לדוגמא ,נניח שאתה רוצה להעתיק טקסט שבחרת מתיבת טקסט בטופס בן ל Clipboard .בדוגמא Mdinote.vbp ארוע ה Click של האפשרות "העתק" בתפריט Edit נקרא EditCopyProc ,פרוצדורה אשר מעתיקה טקסט נבחר ל Clipboard .

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

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

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

 

Clipboard מעתיק טקסק ל '

Private Sub EditCopyProc ()
  ClipBoard.SetText _ frmMDI.ActiveForm.ActiveControl.SelText
End Sub

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

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

טעינת טפסי MDI וטפסי בן

כאשר אתה טוען טופס בו,טופס האב שלו(טופס ה 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 ()
 boolDirty = True
End Sub

מצד שני,בכל פעם שהמשתמש שומר את התוכן של טופס הבן, פרוצדורת Change של תיבת הטקט משנה את ערכו של המשתנה boolDirty ל שקר בכדי להראות שאין צורך כרגע לישמור את התוכו של Text1 בקוד הבא נניח שישנו פקד תפריט בשם Save (mnuFileSave) ופרוצדורה בשם FileSave אשר שומרת את התוכו של תיבת הטקסט:

 

שומר את התוכן של תיבת ה טקסט '
משנה את ערך המשתנה '

Sub mnuFileSave_Click ()
 FileSave
 boolDirty = False
End Sub

 

הסרת טפסי MDI ע"י QueryUnload

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

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

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

 

כאשר המשתמש יוצא מהיישום '
לכל אחד מטפסי הבו נקרא האירוע QueryUnload '

Private Sub mnuFExit_Click()
    Unload frmMDI
     End
End Sub



Private Sub Form_QueryUnload(Cancel As Integer, _UnloadMode As Integer)
If boolDirty Then
FileSave
End If
End Sub

 

יצירת יישום MDI בזמן התכנון עבודה עם טפסי MDI וטפסי בן פרק - 7