Visual Basic 6.0 for Programmers
Transcription
Visual Basic 6.0 for Programmers
Visual Basic 6 לתוכניתנים מאת אילן אמויאל כתובת אימייל[email protected] : אתר אינטרנטwww.kita.co.il : © כל הזכויות שמורות למחבר כתיבה עריכה :אילן אמויאל כתובת אימייל[email protected] : אתר אינטרנטwww.kita.co.il : © כל הזכויות שמורות למחבר אין להעתיק או לשדר בכל אמצעי שהוא ספר זה או קטעים ממנו בכל צורה ובכל אמצעי אלקטרוני או מכני ,לרבות צילום והקלטה ,אמצעי אחסון והפצת מידע ללא צורך באישור מאת המחבר. מותר להפיץ את הספר חינם וללא ביצוע כל שינוי בתוכנו ,אך שלא למטרות מסחריות תוכן העניינים 11 הקדמה אודות שפת 11 ............................................................................................................................... VISUAL BASIC תוכן הספר 11 ...................................................................................................................................................... ידע מוקדם 11 ...................................................................................................................................................... קו התכניות 11 ..................................................................................................................................................... אי ננטילת אחריות11 ............................................................................................................................................ זכויות יוצרים וקניין רוחני 11 ................................................................................................................................ סוף דבר 11 .......................................................................................................................................................... 11 שיעור :1סקירה אודות 13 .......................................................................................................................................VISUAL BASIC יתרונות הפיתוח בVisual Basic- חסרונות הפיתוח בVisual Basic- 13 13 הכרת סביבת הפיתוח המשולבת (11 .................................................. )INTEGRATED DEVELOPMENT ENVIRONMENT תיבת הדו-שיח New Project שורת התפריטים סרגל הכלים הסטנדרטי של Visual Basic חלון הProject Explorer- חלון הProperties- חלון הForm Layout- ה( Toolbox-ארגז הכלים) ה( Code Editor-עורך הקוד) שיעור :2טפסים ותפריטים 11 11 11 11 11 11 11 11 11 פרוייקט 11 .......................................................................................................................................................... 11 11 12 יצירת פרוייקט חדש הרצת פרוייקט שמירת פרוייקט ה FORM-הסטנדרטי12 ......................................................................................................................................... 12 ( Propertiesמאפיינים)( Methods ,שיטות) ,ו( Events-אירועים) 11 Propertiesשל Form 11 Methodsשל Form 11 Eventsשל Form פונקציות ראשונות 11 ........................................................................................................................................... הפונקציה Print הפונקציה MsgBox דוגמה :1התוכנית HelloWorld 11 11 11 הוספת הערות לקוד 11 .......................................................................................................................................... 11 המשך דוגמה 1 ( MDI FORMטופס 11 ................................................................................................................................. )MDI Propertiesשל MDI Form Methodsשל MDI Form -3אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il 11 11 תוכן העניינים ( MENUSתפריטים) 11 .......................................................................................................................................... Propertiesשל Menu Eventsשל Menu 11 11 עבודה עם צבעים 11 .............................................................................................................................................. הפונקציה QBColor הפונקציה RGB אוסף הקבועים ColorConstants אוסף הקבועים SystemColorConstants דוגמה – 1התוכנית Colors 11 11 11 11 11 תרגילים31 .......................................................................................................................................................... שיעור :1הפקדים הסטנדרטיים I 13 ( LABELתווית) 31 ................................................................................................................................................. 31 31 Propertiesשל Label Eventsשל Label ( TEXTBOXתיבת טקסט) 31 .................................................................................................................................. 31 Propertiesשל TextBox 31 Eventsשל TextBox ( COMMANDBUTTONלחצן פקודה) 31 .................................................................................................................... 31 Propertiesשל CommandButton ( HSCROLLBARפס גלילה אופקי) ו( VSCROLLBAR-פס גלילה אנכי) 31 ........................................................................ 31 Propertiesשל פסי גלילה 31 Eventsשל פסי גלילה פונקציות לעבודה עם מחרוזות 31 ........................................................................................................................... 31 31 31 31 31 31 31 31 31 31 הפונקציה Len הפונקציה Val הפונקציה Str הפונקציה UCase הפונקציה LCase הפונקציות LTrim ,TrimוRtrim- הפונקציות Left ,MidוRight- האופרטור & הקבוע vbCrLf הפונקציה Asc התנאי 31 ...............................................................................................................................IF...THEN...END IF תרגילים12 .......................................................................................................................................................... שיעור :4מרכיבי השפה I 41 ( VARIABLESמשתנים) ו( CONSTANTS-קבועים) 13 ................................................................................................... 13 11 11 סוגי משתנים הצהרה על משתנים הצהרה על קבועים ( CONTROL STRUCTURESמבני בקרה) 11 ............................................................................................................... 11 המבנה If...Then...Else 11 המבנה While...Wend -1אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים 11 11 11 המבנה Do...Loop המבנה For...Next המבנה Select Case הפונקציות INPUTBOX ,BEEPו12 ................................................................................................................... IIF- 12 הפונקציה Beep 12 הפונקציה InputBox 12 הפונקציה IIf תרגילים11 .......................................................................................................................................................... שיעור :3הפקדים הסטנדרטיים II 31 ( CHECKBOXתיבת סימון) 13 ................................................................................................................................ 13 13 Propertiesשל CheckBox Eventsשל CheckBox ( OPTIONBUTTONלחצן אפשרות) 13 ...................................................................................................................... 13 Propertiesשל OptionButton ( FRAMEמסגרת) 11 .............................................................................................................................................. 11 Propertiesשל Frame 11 Methodsשל Property 11 דוגמה :1התוכנית CopyText ( LISTBOXתיבת רשימה) 11 ................................................................................................................................... 11 Propertiesשל ListBox 11 Methodsשל ListBox 11 Eventsשל ListBox ( COMBOBOXתיבה משולבת) 11 ............................................................................................................................ 11 Propertiesשל ComboBox ( LINEקו) ו( SHAPE-צורה) 11 ................................................................................................................................ 11 Propertiesשל LineוShape- ( TIMERפקד שעון) 11 ............................................................................................................................................ 11 Propertiesשל Timer 11 Eventsשל Timer 11 דוגמה StudentCourses – 1 תרגילים11 .......................................................................................................................................................... שיעור :6מרכיבי השפה II 63 המילה 11 ................................................................................................................................................... WITH ( ARRAYSמערכים) 11 ............................................................................................................................................ 11 11 11 11 ( One-Dimensional Arraysמערכים חד ממדיים) ( Multi-Dimensional Arraysמערכים רב ממדיים) ( Dynamic Arraysמערכים דינמיים) בדיקת גודל מערך בזמן ריצה באמצעות LBoundוUBound- ( CONTROL ARRAYמערכי פקדים) 11 ..................................................................................................................... 11 תרגיל – 1התוכנית CommandBoard פרוצדורות ב12 ............................................................................................................................. VISUAL BASIC- 11 רוטינות ופונקציות שלב I 11 קריאות לרוטינות ופרוצדורות -1אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il תוכן העניינים 11 רוטינות ופרוצדורות שלב II מודולי קוד סטנדרטיים 11 ........................................................................................................................... *.BAS הפעלת פונקציות מחלון ה11 ................................................................................................................IMMEDIATE 11 תרגיל – 1הפעלת קוד מחלון הImmediate- ( ENUMERATIONSאוספי קבועים) 11 ...................................................................................................................... 11 דוגמאות ( USER-DEFINED TYPESסוגי נתונים מוגדרים על ידי המשתמש) 11 ........................................................................... 11 דוגמאות שיעור :7הרצה וניפוי שגיאות 11 חלונות תצוגה שונים לאבחון 11 ............................................................................................................................. שלושת המצבים של תוכנית 11 ............................................................................................................................... התפריט ( RUNהרצה) 11 ....................................................................................................................................... 11 11 11 11 11 ( Startהתחל) ( Start With Full Compileהתחל לאחר קימפול מלא) ( Breakעבור ל)Break Mode- ( Endסיים) ( Restartהתחל מחדש) התפריט ( DEBUGניפוי שגיאות) 11 ......................................................................................................................... 11 ( Step Intoצעד לתוך) 11 ( Step Overצעד מעבר) 11 ( Step Outצא החוצה) 11 ( Run To Cursorהרץ עד הסמן) 13 ( Add Watchהוספת תצפית) 13 ( Edit Watchערוך תצפית) 13 ( Quick Watchתצפית מהירה) 11 ( Toggle Breakpointהפוך מצב של נקודת עצירה) 11 ( Clear All Breakpointsהסר את כל נקודות העצירה) 11 ( Set Next Statementקבע את המשפט הבא לביצוע) 11 ( Show Next Statementהצג את המשפט הבא לביצוע) האובייקט 11 ........................................................................................................................................... DEBUG טיפול בשגיאות בקוד התוכנית 11 ........................................................................................................................... האובייקט Err On Error... On Error GoTo line On Error Resume Next On Error GoTo 0 המשפט Resume הפונקציה Error 11 11 11 11 11 11 11 שיעור :1מבוא לתכנות מבוסס רכיבים 11 COMPONENTWARE DEVELOPMENT תכנות פרוצדורלי לעומת תכנות מונחה עצמים 11 ..................................................................................................... 11 11 Procedural Programming Object Oriented Programming ( EVENT ORIENTED PROGRAMMINGתכנות מונחה אירועים) 11 ............................................................................... -1אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים 11 ............................................................................................................ )COM( COMPONENT OBJECT MODEL התמיכה של VISUAL BASICב OOP-ו11 ...................................................................................................... COM- שיעור :1תכנות מונחה עצמים בVISUAL BASIC- 17 ( CLASSESמחלקות) 11 ......................................................................................................................................... 11 11 11 11 11 11 122 121 121 112 112 111 111 111 Propertiesשל Class Module Eventsשל Class Module הגדרת משתנים בClass- הוספת פרוצדורות לClass- הצהרה על אובייקטים מסוג המחלקה ( Reference Countingספירת התייחסויות) תרגיל – 1התוכנית ClassDemo תרגיל – 1התוכנית RectDemo תרגיל – 3התוכנית EventDemo מימוש Interface אבחון תכונות אובייקט בזמן ריצה תרגיל – 1התוכנית ImplementsDemo Early Bindingלעומת Late Binding תרגיל – 1התוכנית Analyzer הגדרת תכונות של פרוצדורות ב111...................................................................................................... INTREFCAE- 111 צפייה בתכונות באמצעות Object Browser 111 תרגיל – 1צפייה באובייקטים באמצעות הObject Browser- 111 צפייה באמצעות היישום OLE VIEW 111 תרגיל OLE View – 1לבעלי לב חזק בלבד 111 הגדרת תכונות ( COLLECTIONSאוספים) 112................................................................................................................................. 112 תחביר 111 הלולאה For each ..In .. Next 111 תרגיל – 1התוכנית ShapeColl1 111 מחלקות Collectionמותאמות אישית 111 תרגיל – 1התוכנית ShapeColl2 שיעור ACTIVEX DLL :11 113 מושגים 131.......................................................................................................................................................... יצירת 131..................................................................................................................................... ACTIVEX DLL יצירת אובייקטים הצגת ממשק משתמש ניהול קבוצת פרוייקטים במקביל תרגיל – 1ספריית הרכיבים SecurityLib ( Instancingיצירת מופעים) תרגיל – 1שינוי המאפיין Instancingבמחלקה CLogin הגדרת כתובות בסיס לרכיבי DLL תרגיל – 3שינוי כתובת הבסיס לספרייה SecurityLib טיפול בשגיאות ברכיב תרגיל :1ספריית הרכיבים DynamicArray -1אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il 131 131 131 131 111 111 111 113 113 111 תוכן העניינים שיעור :11כתיבת STORED PROCEDURESבSQL SERVER- 141 111.................................................................................................................................. STORED PROCEDURES 111 112 תהליך הביצוע של משפט SQLהנשלח על ידי לקוח תהליך הביצוע של בקשה להפעלת Stored Procedureמתוך תוכנית לקוח כתיבת STORED PROCEDURESב112................................................................................................ SQL SERVER- 112 פרוצדורה פשוטה ללא פרמטרים 111 פרוצדורה המקבלת פרמטרים 111 הגדרת ערך ברירת מחדל לפרמטרים 111 החזרת ערך מפרוצדורה באמצעות משתנה 113 שימוש במשתנים מקומיים 113 יציאה מפרוצדורה באמצעות RETURN שיעור ACTIVEX DATA OBJECTS :12 133 סקירה של טכנולוגיות הגישה לנתונים 111............................................................................................................... 111 111 111 111 111 111 111 111 111 111 111 )Open Database Connectivity( ODBC )Data Access Object( DAO )Data Control( DC )Remote Data Object( RDO )Remote Data Control( RDC ODBCDirect OLE DB )ActiveX Data Objects( ADO MSDASQL )ADO Data Control( ADODC תרגיל NwindDSN– 1 111.................................................................................................................... )ACTIVEX DATA OBJECTS( ADO 111 Data Link 111 תרגיל NWind.udl :1 112 תרגיל Pubs.udl :3 111 תרגיל NWindDSN.udl :1 111 האובייקט Connection 111 תרגיל – 1התוכנית SimpleConnection 111 -Eventים של אובייקט Connection 111 תרגיל – 1התוכנית ConnectWithEvents האובייקט 111...................................................................................................................................RECORDSET 111 תרגיל – 1התוכנית DisplayEmployees 111 המאפיין CursorType 111 תנועה בRecordset- ( CURSORSסמנים) 111.......................................................................................................................................... 111 המאפיין LockType 111 מאפיינים נוספים 111 תרגיל – 1התוכנית NevigateRecords 111................................................................................................................................... ADO DATA CONTROL 113 Propertiesשל ADODC -1אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים Methodsשל ADODC Eventsשל ADODC 113 111 עיצוב הנתונים 111................................................................................................................................................ StdDataFormats Objects הערות לגבי Data Bound Controls שיעור COM+ :11 111 111 113 תרגיל COM+Demo :1 111 יצירת רכיבים המותאמים לפעולה תחת 111................................................................................................. COM+ המאפיין MTSTransactionMode האובייקט ObjectContext תרגיל MTSSample.dll :1 תרגיל :3הוספת MTSSampleDLL.dllלCOM+- תרגיל :1בחינת פעולת MTSSample.dllתחת COM+ תרגיל :1הוספת Rolesלאפליקצית COM+ תרגיל :1בדיקת הרשאות מתוך רכיב תרגיל :1העברת ConstructStringלרכיב תרגיל :1קליטת ConstructStringמרכיב -1אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il 111 111 111 111 111 111 111 111 111 הקדמה (הקדמה זו שוכתבה בשנת )2112 אודות שפת VISUAL BASIC Visual Basic 6היא שפה וטכנולוגיה ותיקה מאוד בשוק מערכות המידע ,אשר עדיין נמצאת בשימוש בעיקר במערכות שנכתבו לפני הפצת טכנולוגית dot.NETלשוק ע"י ידי מייקרוסופט ,בסביבות שנת .1221על מערכות מידע אלה יש להוסיף מערכות תוכנה שונות שמאפשרות להרחיב את פעולתן על ידי כתיבת הרחבות באמצעות ,Visual Basic for Applications למשל ,תוכנות Microsoft Officeהשונות ,Autocad ,ועוד. אמנם ,מאז יציאתה לשוק של טכנולוגית dot.NETעל ידי מייקרוסופט ,ירד קרנה של Visual Basic 6לשם פיתוח מערכות מידע חדשות ,אך עדיין יש צורך במפתחים לצורך תחזוקת מערכות קיימות או לשם פיתוח הרחבות למערכות המאפשרות זאת על ידי .Visul Basic for Applicationsלכן ,כמתכנת תוכל להיעזר בספר זה כמשאב למידה בשעת הצורך ,ואם הנך מתכנת מתחיל המתעניין בשפה ובטכנולגית ,Visual Basic 6אין ספק שתוכל להפיק תועלת רבה מספר זה. תוכן הספר ספר זה נועד להדריך את המתכנת ברזי שפת ,Visul Basic 6והטכנולוגיות הנלוות אליה תוך שימוש יעיל בשפה וביכולות פיתוח מוכווני עצמים עד כמה שהם נתמכים ב.Visual Basic 6- בספר עצמו השתדלתי ,עד כמה שניתן ,להיות תמציתי ותכליתי ,ולתת דוגמאות ברורות אשר מתמקדות בנושא הנלמד ולא מתפזרות סביב .בכתיבת הדוגמאות השתדלתי שלא להלאות את הקורא בפרטים ,אלא להנחות אותו שלב שלב בצעדים שעליו להשלים על מנת לסיים את כתיבת הדוגמה .את ההסבר על אופן הפעולה של תוכניות הדוגמה הבאתי מיד לאחר כל דוגמה. בספר זה עשיתי שימוש יעיל בקורסים אותם העברתי בשעתו בחברות טכנולוגיה ,בעיקר לפני יציאתה לשוק של טכנולוגיית .dot.NETהספר לא הושלם עד תומו (ובעיקר שני הפרקים אחרונים שבספר) ,אך את עיקר החומר אפשר לקבל מן הפרקים שנכתבו ובוודאי שגם מחיפוש מידע באינטרנט. נושאים נוספים אותם רציתי למצות בספר זה אך לא עשיתי זאת הם: - XML סקירה ושימוש באמצעות Visual Basic Deployment and Maintanance גישה ל Win32 API-מתוך קוד VB סקירה של ASP ניתוח ועיצוב תוכנה יצירת ממשקים באמצעות IDL חשוב לשים לב כי חלק מהנושאים הללו חשובים ביותר לכל מתכנת Visual Basicמקצועי (בעיקר השלושה הראשונים שפרטתי) ,ולכן אם אתה מוצא את עצמך לומד מספר זה ,אני ממליץ לך לחפש חומר אודות הנושאים שלא מיציתי בספר באמצעות רשת האינטרנט. - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il הקדמה ידע מוקדם ספר זה מניח כי אתה מתכנת בעל ידע בסיסי בתכנות ,בעל יכולת לייצג מספרים בבסיסים בינארי ,אוקטאלי והקצאדצימלי, ובעל נסיון בכתיבת קוד בשפה כלשהי. קו התכניות קובץ ה Zip-המכיל את הספר הזה ,מכיל גם ספרייה בשם Codeהכולל את קוד המקור של התכניות המובאות כדוגמאות בפרקי הספר .כמו כן ,ספרייה זו כוללת הצעות פתרון לתרגילים המובאים בסופי חלק מהפרקים. אי ננטילת אחריות המחבר אינו מתחייב על שלמות המידע שבספר או הפרקים שבו ומידת דיוקם. הקריאה מספר זה והסתמכות על הכתוב בו בכל סוג של יישום היא על אחריותך בלבד .אין המחבר יהיה אחראי בכל צורה שהיא לכל סוג של נזק שעלול להיגרם כתוצאה משימוש בהוראות והנחיות הכתובות בספר זה. אם בכל זאת החלטת לעשות שימוש בספר זה ,שים לב כי עליך לקבל תנאי זה ללא כל סייג וכל נזק אם חלילה ייגרם ,הנו על אחריותך בלבד. זכויות יוצרים וקניין רוחני מחבר הספר שומר לעצמו את זכויות היוצרים של ספר זה. עם זאת כבר אמרו חזל "אין אדם יוצא מן העולם וחצי תאוותו בידו" .אם כן ,החליט המחבר לאפשר הפצה חופשית וחינמית של הספר ללא כל צורך בהרשאה מהמחבר .וזאת תחת התנאים הבאים: אין להעתיק או לשדר בכל אמצעי שהוא ספר זה או קטעים ממנו בכל צורה ובכל אמצעי אלקטרוני או מכני ,לרבות צילום והקלטה ,אמצעי אחסון והפצת מידע ללא צורך באישור מאת המחבר. מותר להפיץ את הספר חינם בשלמותו בלבד ,ללא הכנסת כל שינוי ,גריעת תוכן וכיוצה בזה. הפצת הספר לא תיעשה בשום אופן למטרות מסחריות. בספר זה ,ייתכן ומוזכרים מידי פעם סמלים מסחריים של גופים מסחריים שונים .יש לציין כי זכויות היוצרים ו/או הקניין הרוחני של המוצרים הללו ,כולל שמותיהם וסמליהם בכל מקום בו הם מוזכרים שמורה לבעליהם החוקיים בלבד. סוף דבר אני מקווה שספר זה אכן יהיה לך לעזר וישמש אותך היטב בעת הצורך .כפי ששימש בעבר את הלומדים ממנו. בברכה, אילן אמויאל - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1סקירה בשיעור זה: תכיר את יתרונות הפיתוח שבVisual Basic- תכיר רכיבים בסיסיים בסביבת הפיתוח המשולבת של Visual Basic אודות VISUAL BASIC Visual Basicהיא סביבת פיתוח מבית היוצר של Microsoft Visual Basicכוללת מרכיבי שפה ( )Basicומרכיבים גרפיים המאפשרים פיתוח אפליקציות משולב. יתרונות הפיתוח ב Visual Basic - קלות פיתוח חזותיות מהירות פיתוח כלי Debugהנם חלק אינטגרלי מסביבת הפיתוח ניתן להפעיל את כלי ה Debug-בשילוב עם סביבות פיתוח אחרות ניתן להכניס תוספות ( )Add-Insלסביבת הפיתוח ניתן לנהל מספר פרוייקטים במקביל ,תחת קבוצה ( )Groupאחת קיימת תמיכה לשימוש ויצריה של רכיבי ActiveX חסרו נות הפיתוח ב Visual Basic - פיתוח ב Visual Basic-פירושו פיתוח אפליקציות לסביבת Microsoft Windowsבלבד תוכניות הנכתבות ב Visual Basic-מהירות פחות מתוכניות הנכתבות בשפת ,Cואינן מתאימות ליישומים הדורשים ביצועים מהירים כמו Real Time תוכנית הנמצאת בשלבי פיתוח ומורצת מתוך Visual Basicרצה כ Thread-בתוך Visual Basicולא כProcess- נפרד .המשמעות היא שקריסה של ריצת התוכנית גורמת לקריסת ( Visual Basicהכוונה לקריסה קריטית ולא לשגיאה רגילה) פיתוח יישומים מרובי Threadsהיא משימה לא קלה בVisual Basic- - 13אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1סקירה הכרת סביבת הפיתוח המשולבת ( )ENVIRONMENT INTEGRATED DEVELOPMENT סביבת הפיתוח של Visual Basicכוללת רכיבים רבים ,נכיר את חלקם ,חלק אחר שלהם נכיר בהמשך הקורס. תיבת הדו -שיח New Project תיבה זו נפתחת אוטומטית בעת הפעלת ,Visual Basicאו בעת בחירת הפריט Newמהתפריט File תיבה זו מאפשרת לבחור פרוייקט חדש מסוגים שונים תיבה זו כוללת ( Templatesתבניות) ו( Wizards-אשפים) המאפשרים קיצור משך הפיתוח שורת התפריטים שורת התפריטים של Visual Basicכוללת מספר רב של פריטים ,נציג את החשובים שבהם: התפריט Fileמאפשר יצירת פרוייקטים חדשים ,שמירת פרוייקט פתוח ,סגירת פרוייקט ,קומפילציה (הידור) של תוכנית ,ועוד. התפריט Editמאפשר פעולות עריכה שונות כגון ,העתקה ,גזירה ,הדבקה ,חיפוש והחלפה אוטומטיים ,השלמה אוטומטית של מילים שמורות ושמות פונקציות ,ועוד. התפריט Viewשולט בעיקר על אופן התצוגה של Visual Basicועל רכיבי ה IDE-המוצגים. התפריט Projectכולל אפשרויות להוספת רכיבים לפרוייקט ,והסרה של רכיבים ,שליטה על סוג הפרוייקט ומאפייניו ,ועוד. התפריט Formatמאפשר לעצב את הפקדים על הטופס. התפריט Debugמאפשר להריץ ולנפות שגיאות מהתוכנית. התפריט Runמאפשר הרצה ,השהייה והפסקה של התוכנית. התפריט Toolsמאפשר הוספת שלדי פונקציות ,מתודות ומאפיינים לרכיבי קוד בפרוייקט ,הוספת תפריטים לפרוייקט ,כמו גם אפשרויות מתקדמות להגדרת אופן ההתנהגות של .Visual Basic התפריט Add-Insמאפשר לצרף תוספות של יצרן צד שלישי לממשק .Visual Basic התפריט Windowמאפשר שליטה על אופן פריסת החלונות בחלון ה.IDE- התפריט Helpמאפשר קבלת עזרה. - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים סרגל הכלים הסטנדרטי של Visual Basic סרגל הכלים הסטנדרטי כולל את אפשרויות התפריט השימושיות ביותר ניתן להוסיף סרגלי כלים נוספים לתצוגה ע"י בחירה מתאימה מתוך התפריט ,Viewאו ע"י לחיצה ימנית על איזור סרגלי הכלים ובחירה בתפריטים המתאימים. להלן הסבר כללי על פריטי סרגלי הכלים ,שחלק לא קטן מהם אתה מכיר: הפריט מוסיף פרוייקט נוסף הפריט מוסיף רכיבים לפרוייקט הפריט מוסיף תפריטים לתוכנית הפריטים הפריטים הפריטים הפריטים הפריט מציג מסתיר את הProject Explorer- הפריט מציג/מסתיר את הProperties Window - הפריט מציג/מסתיר את הForm Layout Window- הפריט מציג/מסתיר את הToolbox- מאפשרים פתיחה ושמירה של פרוייקט מאפשרים גזירה ,הדבקה ,העתקה ,חיפוש והחלפה של טקסט מאפשרים ביטול והפעלה מחדש מאפשרים הפעלה ,השהייה והפסקה של התוכנית חלון ה Project Explorer - בחלון זה רואים את רכיבי הפרוייקט כאשר מנהלים מספר פרוייקטים במקביל ,רואים אותם ב Project Explorer-תחת Groupאחד - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1סקירה חלון ה Properties - חלון ה Properties-מציג את מאפייני הרכיב או האובייקט הנבחר. האובייקט הנבחר יכול להיות ( Formטופס)( Control ,פקד) ,הפרוייקט עצמו ,או קבוצת רכיבים. ניתן לצפות במאפיינים בסדר אלפביתי או מסודרים לפי קטגוריות. חלון ה Form Layout - ב Form Layout-ניתן לראות ולקבוע כיצד ייפרסו הטפסים על המסך בעת פתיחתם ניתן לקבוע את אופו פריסת הטפסים מחלון זה או מתוך חלון מאפייני הטופס - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים ה ( Toolbox -ארג ז הכל ים) ( PictureBoxתיבת תמונה) ( TextBoxתיבת טקסט) ( CommandButtonלחצן פקודה) ( OptionBoxלחצן אפשרות) מצביע לבחירת אובייקט ( Labelתווית) ( Frameמסגרת) ( CheckBoxתיבת סימון) ( ListBoxתיבת רשימה) ( ComboBoxתיבה משולשבת) ( VscrollBarפס גלילה אנכי) ( HscrollBarפס גלילה אופקי) ( DriveListBoxתיבת רשימת הכוננים) ( FileListBoxתיבת רש ימת קבצים) ( Lineקו) ( Dataפקד )Data ( Timerשעון) ( DirListBoxתיבת רשימת ספריות) ( Shapeצורה) ( Imageפקד דמות /תמונה) ( OLEפקד קיצור והטבעה) ה ToolBox-של Visual Basicמציג במצב התחלתי את הפקדים הסטנדרטיים של Visual Basic ניתן להוסיף פקדים נוספים לToolBox- ניתן לארגן את הפקדים השונים לפי קבוצות - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1סקירה ה ( Code Editor -עורך הקוד) – Procedureרשימת פרוצדורות ()Events – Objectרשימת אובייקטים - Codeאזור הקוד במרכז המסך ממוקם חלון הקוד – כאן רושמים את שורות הקוד השונות התיבה המשולבת ( )ComboBoxמשמאל מציגה את רשימת האובייקטים הזמינים לעריכת קוד התיבה המשולבת ( )ComboBoxמימין מציגה את רשימת האירועים הזמינים עבור האובייקט - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור : 2טפסים ותפריטים בשיעור זה: תבין מהו פרוייקט בVisual Basic- תכיר את הפרוייקט מהסוג Standard EXE תכיר את מבנה החלון בסביבת Microsoft Windows תבין את המושגים Methods ,PropertiesוEvents- תכיר את המושגים Design TimeוRun Time- תכיר את שני סוגי ה( Forms-טפסים) העיקריים ב :Visual Basic-טופס רגיל וטופס MDI תלמד לעבוד עם ( Menusתפריטים) תכיר את הפונקציות PrintוMsgBox- תלמד להוסיף הערות לקוד תלמד כיצד ניתן לשלוט על מיקום ופריסת הטפסים ביחס למסך ,ביחס לחלון אב ,וביחס לחלון MDI תכיר את סוגי הקבצים המאחסנים את נתוני הפרוייקט ואת נתוני הForms- פרוייקט פרוייקט ב Visual Basic-הוא אוסף קבצים המאוגדים כקבוצה אחת לשם יצירת תוכנית מסוג כלשהו ב Visual Basic-ניתן ליצור פרוייקטים מסוגים שונים ולנהל מספר פרוייקטים פרוייקט ב Visual Basic-מאוחסן בקובץ שהסיומת שלו היא .*.vbpקובץ זה הוא קובץ טקסט המכיל מידע מגוון אודות הפרוייקט לעתים יש צורך לערוך ידנית את קובץ הפרוייקט .למשל ,כשמידע מסויים בקובץ שגוי וגורם לבעיות בטעינת הפרוייקט יצירת פרוייקט חדש בעת הפעלת Visual Basicנפתח באופן אוטומטי חלון New Project מתוך חלון ה New Project-ניתן לבחור את סוג הפרוייקט שרוצים לפתח לשם יצירת פרוייקט חלונות סטנדרטי יש לבחור את Standard EXE ניתן להפעיל את חלון ה New Project-גם מתוך התפריט File הפרוייקט ורכיביו מוצגים בחלון הProject Explorer- לאחר סימון הפרוייקט ב Project Explorer-ניתן לקבוע את שמו בProperties Window- ניתן לקבוע את שם הפרוייקט ומאפיינים נוספים של הפרוייקט ע"י בחירת [Project name] Properties...מתוך התפריט ,Projectכאשר ] [Project Nameהוא שם הפרוייקט שבפיתוח ,נכיר את המאפיינים השונים של הפרוייקט במהלך הקורס הרצת פרוייקט ניתן להריץ את התוכנית שבפיתוח ע"י לחיצה על הכפתור Startאו ע"י לחיצה על המקש F5 השלב שבו מפתחים את הפרוייקט ,נקרא Design Time השלב שבו הפרוייקט נמצא במצב ריצה נקרא Run Time כדי להפסיק (באופן לא מסודר) את ריצת התוכנית שבפיתוח יש ללחוץ על הלחצן Stop לחיצה על Stopעוצרת באופן מידי את התוכנית תוך דילוג על אירועי הסיום המובנים בתוכנית - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Start Stop שיעור :2טפסים ותפריטים שמירת פרוייקט Visual Basicשומרת את הפרוייקט במספר קבצי טקסט הנתונים אודות הפרוייקט עצמו ומאפייניו מאוחסנים בקובץ שהסיומת שלו היא *.vbp במקרה הצורך ,ניתן לערוך קובץ זה באמצעות הNotepad- ה FORM-הסטנדרטי בעת יצירת פרוייקט מסוג Standard EXEנוסף Formרגיל לפרוייקט ניתן להוסיף Formsנוספים ע"י בחירת Add Formמהתפריט Project טפסים נשמרים בקבצים בעלי הסיומת *.frm קובץ זה הוא קובץ טקסט הכולל את הקוד השייך לטופס (קוד זה מוצג בעת טעינת הטופס ב ,)Visual Basic-כמו גם ,נתונים נוספים הממוקמים בראש הקובץ ,כגון מאפיינים (שגם הם מוצגים בחלון המאפיינים) אם קיים צורך ,ניתן לערוך קובץ זה ידנית מתוך הNotepad- מרכיבי Form Maximize/Restore Button ( לחצן הגדלה /שחזור) Minimize Button ( לחצן הקטנה) ( Title Barשורת כותרת) ( Captionכותרת) ( Iconסמל החלון) וה Control Menu- ( תפריט הבקרה) Close Button ( לחצן סגירה) Form Grid ( רשת עיצוב –מוצגת בזמן הפיתוח בלבד) ( Client Areaאזור הלקוח) Window Area Border ( גבול אז ור החלון) ( Propertiesמאפיינים)( Methods ,שיטות) ,ו ( Events -אירועים) ( Propertyמאפיין) של אובייקט הוא ערך מסוג מסוים הקובע פן מסוים בהתנהגות האובייקט .למשל ,המאפיין Captionשל Formקובע את הטקסט המופיע בפס הכותרת של הטופס. ( Methodשיטה) של אובייקט היא שגרה המופעלת מתוך האובייקט ומשפיע על אופן תפקודו .למשל ,המתודה Moveשל טופס משנה את מיקומו על המסך. ( Eventאירוע) של אובייקט הוא שגרה המופעלת בעת התרחשות מסוימת הקשורה באותו אובייקט .למשל, האירוע Loadשל Formמופעל עם טעינת הטופס. לרוב האובייקטים (כולל טפסים ופקדים) קיימים Methods ,PropertiesוEvents- הכרה של Methods ,Propertiesו Events-של Formאו ,Controlחוסכת לימוד חוזר שלהם עבור אובייקטים שמכירים לאחר מכן ,כיוון שאופן ההתנהגות הוא בדרך שלל זהה. - 12אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים שים לב: בסעיפים הבאים אפרט את חלק ניכר מהמאפיינים ,השיטות והאירועים של טופס .לעתים קרובות המאפיינים ,השיטות והאירועים הללו זהים בין אובייקטים שונים ,ולכן לא אסביר אותם מחדש כאשר אסביר לך אודות אובייקטים נוספים ,כגון טופס CommandButton ,MDIוכו' ,אלא אם יש הבדל באופן פעולתם העקרוני. Propertiesשל Form :Nameהשם המוקצה לאובייקט ה ,Form-באמצעות שם זה פונים למאפייני ה Form-או למתודות שלו :BackColorקובע את צבע הרקע של הForm- :BorderStyleקובע את סגנון הגבול של הטופס :Captionקובע את הטקסט המוצג בפס הכוותרת :ControlBoxקובע האם יוצגו תפריטי הבקרה :Enabledקובע האם ה Form-יהיה פעיל או לא ( Enabledאו Form .)Disabledפעיל יכול להגיב לאירועים המתרחשים ,כגון לחיצת עכבר וכו' :FillColorצבע המילוי עבור צורות המצוירות באמצעות שגרות גרפיות על גבי הForm- :FillStyleסגנון המילוי (קיימים שמונה סגנונות מילוי שונים - Solid :מלא - Transparent ,שקוף, - HorizontalLineקווקו אנכי ,ועוד)... :Fontסגנון הגופן עבור פעולות גרפיות הכותבות טקסט על גבי הForm- :ForeColorקובע את צבע הקידמה ,כלומר ,את הצבע באמצעותו יצוירו גבולות הצורות הגרפיות והטקסט :Heightגובה הForm- :Iconסמל הטופס :KeyPreviewקובע האם ה Form-יקלוט את אירועי הפקדים שבתוכו לפני שהם מגיבים להם :Leftמיקום נקודת הקצה השמאלית של הForm- :MaxButtonקובע האם כפתור ההגדלה שבתפריט הבקרה יהיה פעיל או לא :MDIChildקובע האם הטופס יהיה טופס בן של טופס ה MDI-בתוכנית :MinButtonקובע האם כפתור המזעור בתפריט הבקרה יהיה פעיל :Moveableקובע האם ה Form-יהיה נייד במהלך ריצת התוכנית :NegotiateMenusקובע האם ה Form-ישתף תפריטים של האובייקטים שבתוכו בשורת התפריטים שלו :Pictureהוספת תמונה לרקע של הטופס :RightToLeftקובע את כיוון הצגת הטקסט :ScaleHeightגובה אזור הלקוח ב Form-לפי יחידות המדידה המצוינת בScaleMode- :ScaleLeftערך קצהו השמאלי של אזור הלקוח בForm- :ScaleModeיחידות המדידה לפיהן נמדד אזור הלקוח (ה( Client Area-ניתן ליצור יחידות מדידה מותאמות אישית – ואז לקבוע באופן חופשי את הערכים ScaleHeight ,ScaleTop ,ScaleLeftו –)ScaleWidth :ScaleTopערך קצהו העליון של אזור הלקוח בForm- :ScaleWidthרוחב אזור הלקוח של ה Form-לפי יחידות המדידה שנקבעה בScaleMode- :ShowInTaskbarקובע האם יוצג סמל התוכנית בשורת המשימות :StartUpPositionקובע את מיקום ה Form-ביחס למסך או לחלון האב :Topמיקום נקודת הקצה העליונה של הForm- :Visibleקובע האם ה Form-יהיה נראה ( )Visibleאו לא :Widthרוחב הForm- :WindowStateקובע את מצבו ההתחלתי של ה( Form-מוגדל/מוקטן/נורמלי) - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :2טפסים ותפריטים Methodsשל Form :Clsמנקה ציורים וטקסט שנוספו ל Form-בזמן הריצה :Hideמסתיר את הטופס אך לא פורק ( )Unloadingאותו :Moveמשנה את מיקומו ו/או את גודלו של הForm- :PopupMenuמציג תפריט מוקפץ :Refreshמרענן את תוכן ה Form-כך שיצטייר מחדש :SetFocusמעביר את ה( Focus-מיקוד) לForm- Eventsשל Form :Activateמתרחש כשה Form-הופך להיות פעיל :Clickמתרחש כשלחצן העכבר נלחץ ומשוחרר על גבי הForm- :DblClickמתרחש בעת לחיצה כפולה על הטופס :Deactivateמתרחש כשה Form-הופך ללא פעיל :GotFocusמתרחש כאשר ה Form-מקבל את ה( Focus-מיקוד) :Initializeמתרחש בעת אתחול הForm- :KeyDownמתרחש בעת לחיצת מקש :KeyPressמתרחש לאחר לחיצה ושחרור של מקש :KeyUpמתרחש לאחר שחרור מקש :Loadמתרחש בעת טעינת הForm- :LostFocusמתרחש בעת איבוד ה( Focus-מיקוד) :MouseDownמתרחש בעת לחיצה על אחד הלחצנים בעכבר :MouseMoveמתרחש בעת תזוזת עכבר :MouseUpמתרחש בעת שחרור אחד הלחצנים בעכבר :Paintמתרחש בעת ציור תוכן הטופס מחדש :QueryUnloadמתרחש לפני פירוק ( )Unloadingשל הטופס :Resizeמתרחש בעת שינוי גודל הForm- :Terminateמתרחש בעת סיום פעולת הטופס :Unloadמתרחש בעת פריקת הטופס האירועים GotFocus ,Deactivate ,Activate ,Unload ,Load ,Terminate ,Initializeו LostFocus-וQueryUnload- האירוע Initializeמתרחש בעת יצירת האובייקט בזכרון (תמיד מתרחש לפני ,)Loadלאחר InitializeהForm- קיים כאובייקט אך עדיין לא כחלון האירוע Terminateמתרחש בעת שחרור האובייקט מהזכרון (מתרחש תמיד אחרי ,Unloadאך אינו מתרחש אם התוכנית הסתיימה בצורה לא נורמלית) האירוע Loadמתרחש בעת טעינת האובייקט מהזכרון והפיכתו לחלון – כלומר בשלב זה ,לחלון יש ידית (,)hWnd והפקדים שבו נוצרו ונטענו האירוע Unloadמתרחש בעת פריקת החלון וכל הפקדים שבו ,עם זאת ,ה Form-עדיין קיים כאובייקט בזכרון האירוע QueryUnloadמתרחש לפני פריקת ( )Unloadingשל הForm- Activateמתרחש בעת מעבר ל Form-מטופס אחר באותה התוכנית Deactivateמתרחש בעת מעבר ל Form-אחר באותה התוכנית GetFocusו SetFocus-מתרחשים בעת קבלה ושחרור של המוקד ,בהתאמה - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים ארבעת המצבים ש Form-יכול להימצא בהם קיימים ארבעה מצבים שבהם יכול להימצא :Form :Created but not loaded הForm -נוצר כאובייקט בזכרון אך לא הוטען עדיין כחלון :Loaded but not shown ה Form-הוטען כחלון אך לא הוצג :Shown ה Form-הוצג :Memory and resources completely reclaimed הזכרון והמשאבים שהוקצו עבור ה Form-שוחררו במלואם הגרף הבא מתאר את סדר התרחשות האירועים הנ"ל בתגובה לפעילויות מסוימות של המשתמש או פונקציות שהמתכנת מפעיל. Initialize Load Activate GotFocus LostFocus Deactivate QueryUnload Unload Terminate יצירת Formחדש באמצעות המשפט Set...= New ... שחרור Formבאמצעות המשפט Set...= Nothing 1 1 בעת הפעלת הש גרה Load אירוע 1יתרחש אם הטופס אי נו בזיכר ון ,אירוע ים 3ו 4-יתרחשו אם המאפיי ן Visibleשווה ל True- 4 בעת הפעלת הש גרה Show אירוע 1יתרחש א ם הטופס אינ ו בזיכר ון ,אירוע 2יתרחש אם הטופס לא הוטע ן קודם 4 בעת מעבר ל Form-אחר באותה התוכנית ,או הפעלת SetFocusעל Formאחר באותה התוכנ ית 2 בעת מעבר ל Form-מ Form-אחר או ע" י הפעלת SetFocusעל ה Form- בעת הפעלת הפ ונקציה Unload אירוע 3יתרחש רק אם אין טפסים נוס פים והתוכנית 3 מסתיימת,או אם הטופס משוחרר בצ ורה מפורשת ע"י המשפט Set ... = Nothing 3 2 1 1 2 2 3 2 1 1 1 האירועים ClickוDblClick- האירוע Clickבאובייקט מתרחש לאחר הורדת לחצן עכבר ( )MouseDownושחרור אותו לחצן ( )MouseUpעל גבי אותו אובייקט האירוע DblClickבאובייקט מתרחש לאחר הורדת לחצן עכבר שבאה בעקבות האירוע Clickתוך פרק זמן הקצר או שווה לזה שמוגדר בלוח הבקרה ( )Control Panelשל המערכת - 13אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :2טפסים ותפריטים פונקציות ראשונות בסעיף זה נכיר שתי פונקציות ראשונות להצגת הודעה Print :וMsgBox- הפו נקציה Print הפונקציה Printמדפיסה טקסט על גבי הטופס לדוגמה: שורת קוד זו מדפיסה את המחרוזת ! Hello, worldעל גבי הForm- ”!Print “Hello, world הפו נקציה MsgBox הפונקציה MsgBoxמציגה תיבת הודעה למשתמש לדוגמה: שורת קוד זו מציגה תיבת הודעה עם הכיתוב !Hello, world ”!MsgBox “Hello, world דוגמה : 1התוכנית HelloWorld בדוגמה זו ניצור תוכנית המדפיסה את המחרוזת ! Hello, worldעל גבי הטופס ובאמצעות תיבת הודעה בהדרגה נוסיף פריטים לתוכנית זו ,תוך כדי למידה של נושאים נוספים שים לב: פעולות שחוזרות על עצמן ,כגון יצירת פרוייקט ,מתן שם לפרוייקט וכו' ,אפרט פעם אחת בדוגמה הראשונה שבה נדרשת פעולה זו .אם בדוגמאות מתקדמות שכחת כיצד לבצע פעולה זו ,חזור לדוגמאות הראשונות כדי לרענן את זיכרונך. .1צור תוכנית מסוג :Standard EXE הפעל את ( Visual Basicאם Visual Basicכבר פתוחה בחר באפשרות New Projectמתוך התפריט )File בחר בפרוייקט ,Standard EXEולאחר מכן לחץ על OK .1הקצה שם לפרוייקט: בחר באפשרות Project1 Properties...מתוך התפריט Project בשדה Project Nameרשום ( HelloWorldזהו שם הפרוייקט שבחרתי לפרוייקט זה ,כמובן שתוכל לבחור בשם אחר אם רצונך בכך) .3הקצה מאפיינים ל:Form- לחץ על ה Form-במקום כלשהו מאפייני ה Form-צריכים להופיע בחלון המאפיינים (אם אינך רואה את חלון המאפיינים ,בחר באפשרות Properties Windowבתפריט ,Viewאו לחץ על )F4 הגדר את המאפיינים הבאים: מאפיין Name Caption ערך FrmHello Hello World Program - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים .1שמור את הפרוייקט: בחר באפשרות Save Projectמתוך התפריט File הקפד ליצור ספרייה נפרדת עבור כל פרוייקט שים לב ש Visual Basic-מציעה שמות התואמים את שמות הפרוייקט והטופס כפי שהקצת להם בתוכנית .1הוסף קוד: לחץ לחיצה כפולה על הטופס או על הלחצן View Codeבחלון הProject Explorer- בחלון ה( Code Editor-עורך הקוד) בחר בClick- מתוך רשימת הפרוצדורות הזמינות והקלד את הקוד הבא: View Code ()Private Sub Form_Click !"Print "Hello, world End Sub .1הרץ את התוכנית ובדוק אותה: לחץ על F5 לחץ לחיצת עבר על ה Form-המוצג ,אתה צריך לראות את ההודעה Printמוצגת על הטופס כל לחיצה נוספת תוסיף שורה נוספת של ההודעה על הטופס מזער את החלון והגדל אותו בחזרה – ההודעות נעלמו לחץ לחיצה נוספת על הטופס ,שוב תיכתב ההודעה ! Hello, worldמיד לאחר השורה האחרונה שבה היא נרשמה קודם עצור את ריצת התוכנית ע"י סגירת החלון .1הנחה את הטופס לזכור את תוכנו כתמונת מפת סיביות: שנה את המאפיין AutoRedrawשל frmHelloלערך True הרץ ובדוק את התוכנית שוב ,שים לב שהפעם לאחר מזעור והגדלה של ה Form-תוכנו נשמר סיים את ריצת התוכנית .1הפעלת תיבת הודעה בתגובה ללחיצת מקש: בחלון הקוד בחר ב KeyPress -מתוך רשימת הפרוצדורות הזמינות ,והקלד את הקוד הבא: )Private Sub Form_KeyPress(KeyAscii As Integer !"MsgBox "Hello, world End Sub .1הרץ את התוכנית ובדוק אותה: לאחר הרצת התוכנית לחץ על מקש כלשהו (מבין מקשי האותיות והמספרים) צריכה להופיע תיבת הודעה עם המסר !Hello, world .12שמור את התוכנית: שמור את התוכנית ע"י בחירת Save Projectמתוך תפריט File בהמשך נשוב למספר שינויים בתוכנית זו אם תרצה תוכל לסגור את התוכנית ע"י בחירת Remove Projectמתוך התפריט Fileאו ע"י סגירת Visual Basic - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :2טפסים ותפריטים הוספת הערות לקוד מומלץ להוסיף הערות כדי לשפר את הבנת הקוד הערות ב Visual Basic-ניתן להוסיף לאחר הסימן ' (גרש בודד) המשך דוגמה 1 .11פתח את התוכנית :HelloWorld מצא את התוכנית בספרייה שבה שמרת אותה הקלק על הקובץ – HelloWold.vbpהתוכנית תיפתח אוטומטית באמצעות Visual Basic .11הוסף הערות לקוד: הוסף את ההערות הבאות לקוד (ההערות נצבעות אוטומטית בצבע ירוק) ()Private Sub Form_Click Print "Hello, world!" 'Print the message on the form End Sub )Private Sub Form_KeyPress(KeyAscii As Integer MsgBox "Hello, world!" 'Display a message box to the user End Sub .13מקם את ה Form-במרכז המסך: קבע את המאפיין StartUpPositionשל frmHelloלערך 2-CenterScreen .11קבע את גבול החלון כקבוע: שנה את המאפיין BorderStyleשל frmHelloלערך 2-FixedSingle .11הרץ ובדוק את התוכנית: כאשר תריץ את התוכנית ,תשים לב כי החלון מוקם במרכז המסך נסה לשנות את גודל ה – Form-שים לב שזה בלתי אפשרי ( MDI FORMטופס )MDI MDIהם ראשי התיבות של – Multiple Document Interfaceממשק מרובה מסמכים לפרוייקט ניתן להוסיף MDI Formאחד לכל היותר MDI Formהוא Formשיכול להכיל בתוכו מספר -Formים במקרה כזה ה MDI Form-ייקרא חלון האב של החלונות הכפופים לו כדי להפוך Formלטופס השייך לחלון ה MDI-יש לנות את המאפיין MDI Childשל אותו FormלTrue- Propertiesשל MDI Form רוב ה Properties-ה Methods-וה Events-של MDI Formזהים לאלה שבבסעיף ה Form-הסטנדרטי :AutoShowChildrenקובע האם חלונות בנים ( )MDI Childrenיוצגו באופן אוטומטי בזמן הטעינה Methodsשל MDI Form :Arrangeמסדר את החלונות הבנים הפתוחים בתוך הMDI Form- - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים ( MENUSתפריטים) ניתן להוסיף תפריטים לטפסים ע"י בחירת Menu Editor...מתפריט Tools תפריט הוא כמו אובייקט רגיל ב ,Visual Basic-ניתן לגשת אל מאפייניו באמצעות שמו ניתן להוסיף & לפני אות מסוימת בכותרת תפריט על מנת להפוך אותו למקש מהיר ()Accelerator כדי ליצור קו מפריד בתפריט ,יש ליצור פריט שה Caption-שלו הוא – (הסימן מינוס) Propertiesשל Menu :Checkedקובע האם יוצג הסימן Vליד פריט התפריט :NegotiatePositionקובע את האופן שבו יסודרו התפריטים על גבי החלון המכיל יחד עם תפריטים מאובייקטים שונים :Shortcutקובע מקשי קיצור עבור פריט התפריט :Tagמאפשר להצמיד מידע נוסף (מחרוזתי) לאובייקט התפריט :WindowListקובע אובייקט התפריט ינהל רשימת חלונות (מסוג )MDI Childהפתוחים בתוך MDI Form :Parentייחוס לחלון האב של התפריט Eventsשל Menu :Clickמתרחש בעת לחיצה על התפריט עבודה עם צבעים בסעיף זה נכיר מספר פונקציות וקבועים המחזירים ערכים המייצגים צבע. הפו נקציה QBColor פונקציה זו יודעת ליצור ערך המייצג צבע עבור 11צבעים שונים מוגדרים מראש פונקציה זו מקבלת אחד מהערכים 0-15ומחזירה ערך המייצג צבע לדוגמה: )Form1.BackColor = QBColor(8 בשורת קוד זו ,נקבע צבע הרקע של Form1לצבע ( Garyאפור) הפו נקציה RGB הפונקציה RGBיוצרת צבע מותאם אישית הפונקציה מקבלת שלושה ערכים ,כל ערך מייצג את רמת מרכיב הצבע – אדום ,ירוק או כחול – בצבע התוצאה כל מרכיב יכול לנוע החל מהערך 0עד לערך 255 יש להפעיל את הפונקציה באופן הבא: )RGB(red_value, green_value, blue_value דוגמה: בשורת קוד זו נקבע צבע הקדמה (צבע הטקס והגבולות של צורות המצויירים ע"י פונקציות גרפיות) לצבע כחול טיפים: oאם רמת כל צבעים מוגדרת כ 0-נוצר צבע שחור oאם רמת כל צבעים מוגדרת כ 255-נוצר צבע לבן oאם רמת כל צבעים מוגדרת לערך זהה נוצר גוון אפור oככל שהערכים גבוהים יותר הצבע בהיר יותר )Form1.ForeColor = RGB(0, 0, 255 - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :2טפסים ותפריטים אוסף הקבועים ColorConstants אוסף קבועים זה מכיל שמונה צבעים מוגדרים מראש אוסף הקבועים SystemColorConstants אוסף של 25קבועים שונים המגדירים צבעים כפי הוגדרו ע"י המשתמש בלוח הבקרה ( )Control Panelשל המערכת (למעשה קיימים 27אך שניים מהם זהים) דוגמה – 2התוכנית Colors .1 .1 .3 .1 .1 .1 בדוגמה זו ניצור תוכנית MDIעם שלושה חלונות ,ונבצע משחקי צבעים וגרפיקה פשוטים על הטפסים .כמו כן, נוסיף תפריטים לתוכנית צור תוכנית מסוג Standard EXE הוסף Formsלפרוייקט: בחר ב Add Form-מתוך התפריט Project מתוך תיבת הדו-שיח Add Formבחר ב( Form-הפריט הראשון ברשימה) חזור על פעולה זו כך שתוסיף טופס שלישי לתוכנית הוסף MDIFormלפרוייקט: בחר ב Add MDI Form-מהתפריט Project מתיבת הדו-שיח Add MDI Formבחר בMDI Form- הקצה שמות לפרוייקט ולטפסים: שנה את שמו של הפרוייקט לColors- שנה את שמות הטפסים לשמות frmRGB ,frmQBColorsוfrmSystemColors- שנה את שם טופס ה MDI-לmdiColors- שמור את הפרוייקט הגדר את המאפיינים הבאים: אובייקט FrmQBColors frmRGB FrmSystemColors מאפיין Caption MDIChild Caption MDIChild Caption MDIChild ערך QBColors True RGB True System Colors True .1שנה את ה:Startup Object- פתח את Colors Properties...מתוך התפריט Project שנה את האובייקט בשדה Startup Object:כך שיהיה MDIColors - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 :mdiColors הוסף תפריט לטופס.1 מתוך תפריטMenu Editor- בח ר ב Tools &Open רשוםCaption בשדה mnuOpen רשוםName ובשדה Next לחץ על השדות התרוקנו להזנת הפריט הבא רשוםCaption בשדה רשוםName ובשדה,QBColos Form mnuOpenQBColorsForm השתמש בחץ המופנה כלפי ימין כדי להזיח את הפריט הזה מקום אחד כך שיופיע כתת פריט של,ימינה mnuOpen הסימן – (מינוס) יוצר הפרדה: שים לב בתפריטים הוסף את הפריטים המופעים ברשימה הבאה כך שהחלון ייראה כמו זה )שמופיע כאן (בסוגריים רשומים השמות Caption Name &Open mnuOpen &QBColors Form &RGB Form &System Colors Form E&xit mnuOpenQBColorsForm mnuOpenRGBForm mnuOpenSystemColorsForm mnuOpenSeparator mnuOpenExit : באופן דומה הוסף את התפריטים הבאים.1 :frmQBColors לטופס Caption Name &Colors mnuColors &Red mnuColorsRed &Green mnuColorsGreen &Blue mnuColorsBlue mnuColorsSeparator1 B&lack mnuColorsBlack &White mnuColorsWhite mnuColorsSeparator2 &Quit mnuColorsQuit - 11 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il טפסים ותפריטים:2 שיעור :frmRGB לטופס :frmSystemColors לטופס Caption Name &Colors mnuColors &Red mnuColorsRed &Green mnuColorsGreen &Blue mnuColorsBlue mnuColorsSeparator1 &Cyan mnuColorsCyan &Magenta mnuColorsMagenta &Yellow mnuColorsYellow mnuColorsSeparator2 &Quit mnuColorsQuit Caption Name &Colors mnuColors &Button Face mnuColorsButtonFace &Tool Tip mnuColorsToolTip &Desktop mnuColorsDesktop mnuColorsSeparator &Quit mnuColorsQuit : הוסף קוד.12 :mdiColors לטופס Private Sub mnuOpenExit_Click)( Unload Me End Sub Private Sub mnuOpenQBColorsForm_Click)( ' Loads and displays frmQBColors Load frmQBColors frmQBColors.Show End Sub Private Sub mnuOpenRGBForm_Click)( ' Loads and displays frmRGB Load frmRGB frmRGB.Show End Sub Private Sub mnuOpenSystemColorsForm_Click)( ' Loads and displays frmSystemColors Load frmSystemColors frmSystemColors.Show End Sub - 32 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 Private Sub mnuWindowArrangeIcons_Click)( Arrange vbArrangeIcons End Sub Private Sub mnuWindowCascade_Click)( Arrange vbCascade End Sub Private Sub mnuWindowTileHorizontally_Click)( Arrange vbTileHorizontal End Sub Private Sub mnuWindowTileVertically_Click)( Arrange vbTileVertical End Sub :frmQBColors לטופס Private Sub mnuColorsBlack_Click)( BackColor = QBColor(0) ' Black End Sub Private Sub mnuColorsBlue_Click)( BackColor = QBColor(1) ' Blue End Sub Private Sub mnuColorsGreen_Click)( BackColor = QBColor(2) ' Green End Sub Private Sub mnuColorsQuit_Click)( Unload Me End Sub Private Sub mnuColorsRed_Click)( BackColor = QBColor(4) 'Red End Sub Private Sub mnuColorsWhite_Click)( BackColor = QBColor(15) 'white End Sub - 31 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il טפסים ותפריטים:2 שיעור :frmRGB לטופס Private Sub mnuColorMagenta_Click)( BackColor = RGB(255, 0, 255) 'Magenta End Sub Private Sub mnuColorsBlue_Click)( BackColor = RGB(0, 0, 255) ' Blue End Sub Private Sub mnuColorsCyan_Click)( BackColor = RGB(0, 255, 255) ' Cyan End Sub Private Sub mnuColorsGreen_Click)( BackColor = RGB(0, 255, 0) ' Green End Sub Private Sub mnuColorsQuit_Click)( Unload Me End Sub Private Sub mnuColorsRed_Click)( BackColor = RGB(255, 0, 0) ' Red End Sub Private Sub mnuColorsYellow_Click)( BackColor = RGB(255, 255, 0) ' Yellow End Sub - 31 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 :frmSystemColors לטופס Private Sub mnuColorsButtonFace_Click)( BackColor = SystemColorConstants.vbButtonFace End Sub Private Sub mnuColorsDesktop_Click)( BackColor = SystemColorConstants.vbDesktop End Sub Private Sub mnuColorsQuit_Click)( Unload Me End Sub Private Sub mnuColorsToolTip_Click)( BackColor = SystemColorConstants.vbInfoBackground ' ToolTip background End Sub הרץ ובדוק את התוכנית.11 - 33 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :2טפסים ותפריטים תרגילים .1כתוב תוכנית בשם SimpleColorsובה שלושה .Formsקבע צבע רקע שונה לכל Formוטען את ה Form-השני בעת לחיצה על ה Formהראשון ,ואת ה Form-השלישי בעת לחיצה כפולה על ה Formהשני. בעת לחיצת מקש על ה Form-השלישי ייסגרו של ה Forms-ותסתיים התוכנית. .1כתוב תוכנית בשם TraceEventsובה שלושה Form2 ,Form1 :FormsוForm3- ב Form1-הוסף תפריט המאפשר את טעינת Form2ו ,Form3-ניקוי ה( Form-בצע ניקוי באמצעות השגרה )Cls וכן ,אפשרות יציאה מהתוכנית (הסוגרת את כל ה .)Forms-כמו כן ,בטל את לחצן הסגירה ב Form1-כך שניתן יהיה לסגור את התוכנית רק באמצעות האופציה המתאימה בתפריט ,ולבסוף ,הגדר את AutoRedrawבForm1- כ True-ע"מ שתוכן החלון יישמר לאחר הסתרה של חלק ממנו. בכל אחד מה Forms-האחרים ( Form2ו ,)Form3-הוסף שורות קוד המדפיסות על גבי Form1את האירוע שהתרחש עבור כל אחד מהאירועים הבאים,GotFocus ,Unload ,QueryUnload ,Load ,Initialize : Activate ,LostFocusו .Deactivate-כך לדוגמה ,באירוע Activateשב Form3-תרשום: ()Private Sub Form_Activate "Form1.Print "Form3: Activate End Sub תוכל להיעזר בחלון ה Form Layout-כדי להגדיר בקלות את מיקומי הטפסים על גבי המסך בעת הרצת התוכנית. לאחר הפעלת התוכנית ,עקוב אחר סדר התרחשות ה Events-ב Form2-ו Form3-כפי שהם מודפסים על –.Form1 .3כתוב תוכנית בשם ArrangeFormsעם MDIFormושלושה Formsרגילים המוגדרים כ.MDIChild- הוסף ל MDIForm-תפריט לטעינת הטפסים הללו ,וכן תפריט בשם Windowהמאפשר לפרוס את החלונות שבו באופנים שונים ,Cascade ,Tile Vertically ,Tile Horizontally :ו( Arrange Icons-השתמש בשגרה Arrange של MDIFormלשם כך) .כמו כן הגדר את האפשרות WindowListעבור התפריט Windowכ True-על מנת שרשימת ה Forms-הפתוחים תוצג בתפריט זה( .אל תשכח לשנות את ה Startup Object-ל MDIForm-בהגדרות הפרוייקט). - 31אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור : 1הפקדים הסטנדרטיים I בשיעור זה: תכיר את ה Controlsהבאים: ( Label oתווית) ( TextBox oתיבת טקסט) ( CommandButton oלחצן פקודה) ( HScrollBar oפס גלילה אופקי) ( VScrollBar oפס גלילה אנכי) תכיר את הפונקציות הבאות לעבודה עם מחרוזות,Mid ,Left ,Right ,Trim ,LTrim ,RTrim ,Str ,Val ,Len : וAsc- תלמד לשרשר מחרוזות ולהוסיף מעברי שורה תכיר את התנאי If... Then... End If הערה בדרך כלל ,אני לא חוזר על Methods ,Propertiesו events-שהזכרתי בטפסים שפעולתם זהה לאופן הפעולה ב Controls-שבפרק זה .בכל Controlאני מציין את ה Methods ,Properties-ו Events-שלא צוינו קודם. ( LABELתווית) Labelנועד בעיקר להצגת טקסט ,בד"כ בצמוד לפקדים אחרים Propertiesשל Label :Alignmentקובע את סוג יישור הטקסט בתוך הLabel- :Appearanceקובע את אופן התצוגה של ה( Label-אפקטים תלת ממדיים או ללא אפקטים תלת ממדיים) :AutoSizeקובע האם גודל ה Label-ישתנה באופן אוטומטי בהתאם לתוכן :BackStyleקובע את סגנון הרקע ( – Transparentשקוף ,או – Opaqueאטום ,לא שקוף) :Captionטקסט התוכן המוצג בLabel- :Containerקובע את ה Container Controlשל ה Control Container( Labelהוא Controlמכולה ,כלומר Controlהמסוגל להכיל בתוכו פקדים אחרים .מהפקדים הסטנדרטיים PicutreBox ,ו Frame-הם ה Control Containersהיחידים) :Indexמספרו הסידורי של ה Label-אם הוא שייך למערך של Labels :RightToLeftקובע את כיוון קריאת הטקסט :TabIndexקובע את מיקומו הסידורי של ה Label-בסדר מעבר הטאב :Tagמאפשר להצמיד מידע נוסף לLabel- :ToolTipTextטקסט עזרה המוצג כאשר סמן העכבר ממוקם מעל הLabel- :UseMnemonicקובע האם להתייחס לתו & כתו המאפשר הגדרת מאיץ מקלדת או להציגו כמו שהוא :WordWrapקובע האם לאשר גלישת טקסט הארוך מרוחב הLabel- Eventsשל Label :Changeמתרחש כאשר משתנה תוכן הLabel- - 31אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1הפקדים הסטנדרטיים I ( TEXTBOXתיבת טקסט) השימוש הנפוץ ב TextBox-הוא לקבלת קלט מהמשתמש Propertiesשל TextBox :HideSelectionקובע האם טקסט מסומן יישאר מואר כאשר הפוקוס עובר ל Control-אחר :Lockedקובע האם ה TextBox-יכול לקבל פעולות עריכה :MaxLengthקובע את המספר המקסימלי של תווים בניתן להזין ל 0( TextBox-מציין אי הגבלה) :MultiLineקובע אם ה TextBox-יכול להיות מרובה שורות :PasswordCharקובע איזה תו יחליף את התו המוקלד (בתצוגה בלבד) במקרה שה TextBox-משמש לקבלת סיסמה :ScrollBarsקובע אילו פסי גלילה יופיעו בTextBox- :TabStopקובע אם סדר מעבר הטאב יפעל גם על הTextBox- :Textמכיל את הטקסט הנמצא בTextBox- Eventsשל TextBox :Changeמתרחש בכל פעם שהטקסט שונה (לאחר שהשינוי הוצג ב)TextBox- :KeyPressמתרחש בעת לחיצה על מקש ( ASCIIאות או מספר) לפני הצגת התו ב.TextBox- ( COMMANDBUTTONלחצן פקודה) שימושו הנפוץ של CommandButtonהוא לאפשר למשתמש פעולה מסוימת המשויכת ל.CommandButton- לפיכך ,בדרך כלל ,מגיבים לאירוע ClickבCommanButton- Propertiesשל CommandButton :Cancelקובע אם ה CommandButtonידמה לחיצה עליו בתגובה ללחיצה על המקש Escape :Defaultקובע אם ה CommandButton-ידמה לחיצה עליו בתגובה ללחיצה על המקש )Return( Enter :DisablePictureקובע איזה תמונה תוצג על גבי ה CommandButton-כאשר הוא במצד ,Disableכלומר ,כאשר המאפיין Enabledשווה ל( False-יש לוודא שהמאפיין Styleשל ה CommandButtonיהיה )Graphical :DownPictureקובע איזו תמונה תוצג על גבי הלחצן בזמן לחיצה עליו (שוב ,ה Style-של הCommandButton- צריך להיות Trueבכדי שמאפיין זה יפעל) :Enabledקובע האם הלחצן יאופשר או לא (זהו אחד המאפיינים השימושיים ביותר של )CommandButton :MaskColorמאפשר להגדיר איזה צבע בתמונה יהיה שקוף (יש להגדיר גם UseMaskColorכ True-כדי שמאפיין זה יפעל) :Picuteקובע איזו תמונה תוצג על גבי הלחצן במצב רגיל. :Styleקובע את סגנון הלחצן – Standard .מציג רק טקסט ו – Graphical-משתמש גם בתמונות המוגדרות. :UseMaskColorקובע האם ה CommandButton-ישתמש בצבע המוגדר במאפיין MaskColorכצבע שקוף. ( HSCROLLBARפס גלילה אופקי) ו( VSCROLLBAR-פס גלילה אנכי) פסי גלילה מאפשרים גלילת טקסט ,תמונות וכו' ,וזהו בדרך כלל שימושם העיקרי - 31אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים Propertiesשל פסי גל ילה :LargeChangeקובע את גודל הקפיצה כאשר לחצן העכבר לוחץ במקום כלשהו בין ה Bar-לבין אחד החצים ,או כאשר נלחץ אחד מהמקשים PageUpאו PageDown :Maxמגדיר את הערך המקסימלי (הקצה הימני בפס אופקי או הקצה התחתון בפס אנכי) של פס הגלילה :Minמגדיר את הערך המינימלי של פס הגלילה (אם Minגדול מ Max-פס הגלילה משנה את כיוון התקדמותו מימין לשמאל בפס אופקי ,ומלמטה כלפי מעלה בפס אנכי) :SmallChangeמגדיר את גודל הצעד הקטן עבור התקדמות הBar- Eventsשל פסי גלילה :Changeמתרחש בעת שינוי בערכו של פס הגלילה. :Scrollמתרחש בעת גרירת ה Bar-שעל פס הגלילה באמצעות העכבר. פונקציות לעבודה עם מחרוזות בסעיף זה תכיר מספר פונקציות לעבודה עם מחרוזות הפו נקציה Len הפונקציה Lenמאפשרת למצוא את אורכה של מחרוזת לדוגמה: בשורת קוד זו ,הפונקציה Lenאת המספר 13שהוא אורך המחרוזת !Hello,world )”!Len(“Hello ,world הפו נקציה Val הפונקציה Valמחזירה את הערך הנומרי של מחרוזת לדוגמה: בשורת קוד זו ,מוחזר הערך 12ע"י הפונקציה Val )”Val(“12abc הפו נקציה Str הפונקציה Strיוצרת מחרוזת הזהה לערך נומרי המועבר לה לדוגמה: פונקציה זו יוצרת את המחרוזת “”12.45 )Str(12.45 הפו נקציה UCase הפונקציה UCaseמקבלת מחרוזת ומחזירה את אותה המחרוזת לאחר הפיכת האותיות הקטנות במחרוזת לאותיות גדולות לדוגמה: )"something 4 u... שורת קוד זו מחזירה את המחרוזת ""I HAVE SOMTHING 4 U... - 31אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il UCase("I have שיעור :1הפקדים הסטנדרטיים I הפו נקציה LCase הפונקציה LCaseמקבלת מחרוזת ומחזירה את אותה המחרוזת לאחר הפיכת האותיות הגדולות במחרוזת לאותיות קטנות לדוגמה: )"?LCase("HOW R u 2 dayyYy... שורת קוד זו מחזירה את המחרוזת "?"how r u 2 dayyyy... הפו נקצ יות LTri m , Trimו Rtrim - הפונקציה RTrimמעתיקה מחרוזת חדשה ממחרוזת נתונה ,תוך הסרת כל הרווחים הנמצאים בקצה הימני של המחרוזת. הפונקציה LTrimמעתיקה מחרוזת חדשה ממחרוזת נתונה ,תוך הסרת כל הרווחים הנמצאים בקצה השמאלי של המחרוזת. הפונקציה Trimמעתיקה מחרוזת חדשה ממחרוזת נתונה ,תוך הסרת כל הרווחים שבקצות המחרוזת. דוגמה: )“ פונקציה זו תחזיר את המחרוזת “ How r u How r u Hello “( LTrim “Hello הפו נקצ יות Left , Midו Right - הפונקציה Leftיוצרת תת מחרוזת שמאלית באורך נתון ממחרוזת נתונה הפונקציה Rightיוצרת תת מחרוזת ימנית באורך נתון ממחרוזת נתונה הפונקציה Midיוצרת תת מחרוזת המתחילה במיקום נתון ,ובאורך נתון מתוך מחרוזת נתונה. דוגמאות: (Right("Hello ,world!",6 שורת קוד זו מחזירה את המחרוזת !world שורת קוד זו מחזירה את המחרוזת Hell שורת קוד זו מחזירה את המחרוזת wor (Left("Hello ,world!",4 (Mid("Hello ,world!",8,3 האופרטור & האופרטור & מאפשר לשרשר מחרוזות דוגמאות: שור זו הופכת למחרוזת “”Ilan Amoyal בשורת קוד זו ,לתוך ה txtOut-מוזנת המחרוזת המשורשרת מ txtInput1-וtxtInput2- ”“Ilan” & “ “ & “Amoyal txtOut.Text = txtInput1.Text & txtInput2.Text הקבוע vbCrLf הקבוע vbCrLfמייצג את תו מעבר השורה דוגמה: ”!Text1.Text = Text1.Text & vbCrLf & “Hello, world שורת קוד זו מוסיפה מעבר שורה ל Text1-ומיד לאחר מכן משרשרת את המחרוזת “”!Hello, world - 31אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים הפו נקציה Asc מחזירה את ערכו ה ASCII-של התו במחרוזת נתונה דוגמאות: )”Asc(“a בשורת קוד זו ,הפונקציה Ascמחזירה את הערך ,97שזהו ערכו של התו “ ”aלפי טבלת הASCII- )"Asc("Goal בשורת קוד זו הפונקציה Ascמחזריה את ,71שזהו ערכו ה ASCIIשל התו ( Gהתו הראשון במחרוזת) התנאי IF...THEN...END IF תחביר התנאי הוא כדלקמן: התנאי ( )conditionיכול להיות מורכב מהקשרים Andו/או Or If condition Then do_somthing End If - 31אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1הפקדים הסטנדרטיים I תרגילים .1כתוב תוכנית בשם Focusesובה ארבעה .CommandButtonsליצה על ה CommandButton-הראשון יעביר את ה Focus-ל CommandButton-השני .לחיצה על השני תעביר את ה Focus-לשילישי ,לחיצה על השלישי תעביר את ה Focus-לרביעי ,ולחיצה על הרביעי תעביר את ה ,Focus-חזרה ,ל CommandButtonהראשון. כל CommandButtonבעת קבלת ה ,Focus-ידפיס על גבי ה Form-את שמו (( )Nameלאחר ניקוי התוכן הקודם של ה ,)Form-וכמו כן ,יעדכן את כותרת ( )Captionהחלון כך שתהיה זהה לכותרתו (.)Caption .1כתוב תוכנית בשם ThreeColorsובה שלושה CommandButtonsעם הכיתובים Green ,Redו .Blue-לחיצה על אחד הפקדים תשנה את צבע הרקע של ה ,Form-ותעדכן את כותרת ה Form-בהתאם. .3כתוב תוכנית בשם Concatenateונח בה שלושה פקדי TextBoxו CommandButton-אחד. סמוך ל TextBox-הראשון מקם Labelעם הכיתוב “ .”Input1סמוך ל TextBox-השני מקם Labelעם הכיתוב “ ”Input2וליד השלישי מקם Labelעם הכיתוב “ .”Outputכמו כן ,נעל את ה TextBox-השלישי מפני עריכה. לחיצה על ה CommanButton-תשרשר את שתי המחרוזות שבשני פקדי ה.TextBoxes- .1כתוב תוכנית זהה לקודמת בשם Concatenate2עם השינויים הבאים: ה CommandButton-יהיה .Default יוכנס מעבר שורה בין שתי המחרוזות המשורשרות. לאחר השרשור ,ימחקו תכני תיבות הקלט וה Focus-יוחזר לתיבת הקלט הראשונה. .1כתוב תוכנית בשם .TextBoxCopyעל ה Form -הנח שני פקדי TextBoxהאחד לקלט ( )Inputוהשני לפלט ( .)Outputהתוכנית צריכה להעתיק את המחרוזת המוזנת כקלט ב TextBox-הראשון אל ה TextBox-של הפלט .כל העתקה תיכנס לשורה חדשה בפלט מבלי למחוק את השורות הקודמות. בתוכנית זו הוסף שלושה .CommandButtonsאחד להעתקה (זה יהיה פקד ה ,)Default-שני לניקוי תיבת הפלט, ושלישי לסגירת התוכנית (זה יהיה פקד ה.)Escape- לאחר העתקת הטקסט ,יש להחזיר את ה Focus-לתיבת הקלט תוך סימון הטקסט הרשום בה. .1כתוב תוכנית בשם ,DigitTextBoxשתכלול TextBoxשיאפשר קלט של ספרות ,מקש ,Backspaceומקש Enter למעבר שורה .בנוסף הנח שני ,CommandButtonsהאחד לניקוי ה TextBox-והשני ליציאה (שיהיה מקש ה- Escapeבתוכנית). .1כתוב תוכנית בשם :SlideColors ב Form-הנח שלושה ScrollBarsוהגדר את הטווח שלהם מ 2-עד .111כמו כן ,הנח Labelעל הטופס. בעת שינוי ערכו של אחד מה ScrollBars-יש לעדכן את צבע הרקע של ה Label-באמצעות הפונקציה ,RGBכך שה ScrollBar-הראשון יהווה את המרכיב Redבפונקציה ,ה ScrollBar-השני יהווה את מרכיב הGreen- בפונקציה ,וה ScrollBar-השלישי יהווה את מרכיב ה Blue-בפונקציה. צור ממשק נוח למשתמש תוך שימוש ב Labels-לפי הצורך. - 12אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים .1צור תוכנית זהה לתוכנית הקודמת בשם SlideColors2תוך הוספת השיפורים הבאים: דאג לכך שבזמן שהתוכנית עולה ,צבע ה Label-יהיה תואם לערכים שבScrollBars- בסמוך לכל ScrollBarתוצב תיבת טקסט שתשקף את הערך שבScrollBar- צבע הרקע של כל TextBoxיהיה צבע המרכי שאותו הוא מייצג. כמו כן ,נעל את תיבות טקסט אלו ה LargeChange-של ה ScrollBar-יהיה 10 - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור : 4מרכיבי השפה I בשיעור זה: תלמד להצהיר על משתנים ועל קבועים ותכיר את סוגם תבין את ההבדל בין משתנה מקומי בפרוצדורה או פונקציה לבין משתנה משותף במודול תבין את ההבדלים בין Public Dimו Private-בהקשר של הצהרות משתנים תכיר את מבני הבקרה הקיימים בVisual Basic- תכיר את הפונקציות Beep ,InputBoxוIIf- ( VARIABLESמשתנים) ו( CONSTANTS-קבועים) בסעיף זה נסקור את: סוגי המשתנים בVisual Basic- אופן ההצהרה על משתנים אזורי הצהרה שונים במודול הסתרה או חשיפה של משתנים באמצעות המילים Privateאו ( Publicהרשאות גישה) סוג י משתנים ב Visual Basic-קיימים סוגי משתנים לאחסון מספרים שלמים ,מספרים ממשיים (עם נקודה צפה) וכן מחרוזות וטיפוסים נוספים. למספר סוגים ישנם תווים מיוחדים להצהרה משתנים ( ,)Type-declaration characterתווים אלו הנם שריד של הגרסאות המוקדמות של .Visual Basicלסוגי הנתונים החדשים (למשל Byteו )Boolean-מעצבי Visual Basic לא הקצו תווים מיוחדים (כנראה כיוון שזה רעיון גרוע מלכתחילה) ,בכל אופן עדיף להשתמש בהצהרה ברורה ולא בתווי הצהרה הסוג Variantהוא סוג כללי המאפשר להכיל בתוכו את כל סוגי המשתנים (מלבד מחרוזות בגודל קבוע) הסוג Variantמאפשר טיפול גמיש מאוד בנתונים ,וכן פעילות אוטומציה בין יישומים שונים בטבלה הבאה מפורטים סוגי המשתנים השימושיים ביותר: סוג גודל אחסון בזכרון תחום ערכים תו הצהרה Byte Boolean Integer Long בית אחד 2בתים 2בתים 4 bytes Single (מספר ממשי ברמת דיוק בודדת) 4בתים 0עד 255 Trueאו False -32,768עד 32,767 -2,147,483,648 עד 1,111,113,111 בתחום השלילי: -3.402823E38 עד E-451.121111בתחום החיובי: 1.401298E-45 עד E383.121113 אין אין ( %אחוז) & (אמפרסנד) - 13אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il ! (סימן קריאה) שיעור :4מרכיבי השפה I סוג גודל אחסון בזכרון תחום ערכים תו הצהרה Double (מספר ממשי ברמת דיוק כפולה) 8בתים Date 8בתים Object ( Stringבגודל משתנה) ( Stringבגודל קבוע) 4בתים 10בתים +אורך המחרוזת כאורך המחרוזת בתחום השלילי: -1.79769313486231E308 עד E-3241.11211111111111בתחום החיובי: E-3241.11211111111111 עד E3081.11111313111131 1לינואר שנת 100 עד ה 31-לדצמבר שנת 1111 הפנייה כלשהי לאובייקט 0עד 2מיליארד (בערך) ( #סולמית) אין ( $דולר) 1עד ( 65,400בערך) ( $דולר) ( Variantעם מספרים) ( Variantעם תווים) 16בתים 11בתים +אורך המחרוזת אין כל ערך מספרי עד מקסימום לתחום המספרים מסוג Double אורך זהה כשל מחרוזת בגודל משתנה הצהרה על משתנים ניתן להצהיר על משתנים במקומות שונים בתוכנית: oברמת המודול (חלק ה)General- oבתוך פרוצדורה או פונקציה תחביר ההצהרה על משתנים הוא: Dimזוהי המילה המורה ל Visual Basic-להקצות מקום אחסון למשתנה בתוך פרוצדורה או פונקציה חייבים להשתמש במילה Dim ברמת המודול ניתן להשתמש במילים Publicאו Privateבמקום :Dim ( Public oציבורי) :מאפשר גישה למשתנה לקטעי קוד הנמצאים במודולים אחרים ( Private oפרטי) :מאפשר גישה למשתנה אך ורק לפרוצדורות והפונקציות הרשומות בתוך אותו מודול בו הוצהר המשתנה oאם משתמשים ב ,Dim-ההחלטה אם המשתנה יהיה Privateאו Publicבמודול תלויה בסוג שלו .למשל, עבור ( Formשהוא למעשה )Class Moduleברירת המחדל היא Private :varnameזהו שם המשתנה :Typeזהו סוג המשתנה ,אם לא מצוין הסוג המשתנה יהיה מסוג ( Variantאלא אם נעשה שימוש בDefType- במודול – נושא זה לא נדון בקורס) ניתן להצהיר על Stringsבאורך קבוע באמצעות שימוש בסימן * ]Dim varname [As type - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים דוגמאות - nGradeמשתנה Integer - strFirstNameמשתנה String - m_strLNameמשתנה Stringבאורך קבוע של 20תווים - lBillGatesSalaryמשתנה מסוג Long – nStageמשתנה מסוג Integer Dim nGrade As Integer Private strFirstName As String Private m_strLName As String * 20 Public lBillGatesSalary As Long Dim nStage% הצהרה על קבועים ניתן להצהיר על קבועים במקומות שונים בתוכנית: oברמת המודול (חלק ה)General- oבתוך פרוצדורה או פונקציה תחביר ההצהרה על קבועים הוא: [Private | Public] Const constname [As type] = expression המילה Constמשמשת להצהרת קבועים קבועים על פי ברירת המחדל הם מסוג Privateאלא אם נרשם Publicבמפורש ב Class Module-לסוגיו השונים ( Formהוא דוגמה ל)Class Module-לא ניתן להצהיר על קבועים כPublic- ( Class Modulesנלמד בהמשך הקורס) ניתן להצהיר על Constsגם בתוך פונקציות ופרוצדורות ,אך הם אינם קיימים מחוץ לפונקציות או פרוצדורות אלה דוגמאות קבוע Doubleהמאותחל לערך 17 קבוע Stringהמאותחל לערך “"Sales קבוע Longהמאותחל לערך 4405 cdTaxPercentage As Double = 17# "Private Const cstrDepartment = "Sales Public const clErrNumber as Long = 4405 - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :4מרכיבי השפה I ( CONTROL STRUCTURESמבני בקרה) בסעיף זה נכיר את מבני הבקרה השונים הקיימים ב Visual Basic-בכלל זה נכיר את צוות רישום התנאי השונות ,מבני לולאה ומבנה רב ברירות ()Case המבנה If...Then...Else צורה ראשונה ]If condition Then [statements] [Else elsestatements conditionהוא התנאי statementsהן המשפטים שיתבצעו אם התנאי מתקיים (אם יש מספר משפטים ,יש להפריד בניהם באמצעות נקודה-פסיק) :elsestatementsאלו הם המשפטים שיתבצעו אם התנאי לא מתקיים (אם יש מספר משפטים ,יש להפריד בניהם באמצעות נקודתיים) דוגמה :1 "If nGrade > 90 Then MsgBox "Very good!" Else MsgBox "OK דוגמה :1 "If nAge >= 18 And nAge <= 21 Then Print "Army": Print "You are Great צורה שניה If condition Then ][statements condition-n Then [ElseIf [else if statements]... [Else ]][else statements End If בצורה זו ניתן ליצור מספר הסתעפויות אפשריות ניתן לרשום בלוק משפטים לביצוע עבור כל תנאי אין חובה לכלול את חלקי ה ElseIf-או ה Else-אך יש להקפיד לרשום End Ifבסוף המבנה דוגמה: If nAge < 13 Then "Print "Child ElseIf nAge < 18 Then "Print "Teenager ElseIf nAge < 22 Then "Print "Soldier Else "Print "Big-Boy End If - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים המ בנה While...Wend תחביר המבנה הוא: conditionהוא התנאי הנבדק statementsהם המשפטים המבוצעים אם התנאי הוא True טיפ :עדיף להשתמש בלולאה Do...Loopכיוון שהיא גמישה יותר דוגמה: While condition ][statements Wend Dim nCounter As Integer nCounter = 1 While nCounter < 10 )Print "Now counter is equal to " & str(nCounter Wend המבנה Do...Loop צורה ראשונה ]Do [{While | Until} condition [[statements [[Exit Do [[statements Loop conditionהוא התנאי הנבדק Whileמשמעותו – "כל עוד התנאי מתקיים" Untilמשמעותו – "עד אשר יתקיים התנאי" המשפטים יבוצעו אם התנאי בכללותו יתקיים (כולל ה While-או ה)Until- בצורה זו התנאי נבדק לפני הכניסה ללולאה ,כך שאפשר שהלולאה לא תתבצע כלל ניתן לצאת בכל שלב מהלולאה ע"י ( Exit Doמה שלא ניתן לעשות בWhile...Wend- צורה שניה Do ][statements ][Exit Do ][statements ]Loop [{While | Until} condition השוני היחידי בין צורת רישום זו לקודמת ,הוא בכך שגוף הלולאה במקרה זה מתבצע פעם אחת לפחות (כיוון שהתנאי נבדק רק בסיום הלולאה) דוגמה: Dim strBoard As String Dim nColomns As Integer, nRows As Integer Const cnMaxColomns As Integer = 10, cnMaxRows As Integer = 10 - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :4מרכיבי השפה I nRows = 1 Do While nRows <= cnMaxRows nColomns = 1 Do While nColomns <= cnMaxColomns )" \strBoard = strBoard & Format(nRows * nColomns, "000 nColomns = nColomns + 1 Loop strBoard = strBoard & vbCrLf nRows = nRows + 1 Loop MsgBox strBoard קטע קוד זה יוצר מחרוזת הכוללת רווחים ומעברי שורות ,ואשר מאחסנת בתוכה את לוח הכפל שים לב לשימוש בפונקציה ( Formatתוכל לקבל עזרה אודות פונקציה זו במערכת העזרה של )Visual Basic קטע קוד זה משתמש בשתי לולאות Do...Loopמקוננות לשם ביצוע המשימה בסוף פירמוט המחרוזת ,מוצגת המחרוזת ע"י הפונקציה MsgBox המבנה For...Next תחביר המבנה: הלולאה Forמאפשרת ביצוע נוח של בלוק פקודות מספר קבוע של פעמים counter = startזוהי פעולת האתחול של מונה הלולאה endהוא הערך הסופי של מונה הלולאה stepזהו ערך הקפיצה של מונה הלולאה לאחר כל איטרציה (ניתן לקבוע ערך שלילי ל Step-כך שמונה הלולאה יקבל ערכים הולכים וקטנים) דוגמה: ]For counter = start To end [Step step ][statements ][Exit For ][statements ]Next [counter Dim i As Integer For i = 1 To 5 )Print "The number is: " & str(i Next - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים המבנ ה Select Case המבנה Select...Caseהוא מבנה רב ברירות המאפשר בחירת בלוק לביצוע ,ע"פ בדיקת ערכו של משתנה מסוים תחביר: Select Case testexpression [Case expressionlist-n [statements-n]] ... [Case Else ]][elsestatements End Select textexpressionהוא המשתנה שערכו נבחן expressionlistזוהי רשימת ערכים ,שאם המשתנה הנבחן שווה לאחד מהערכים שברשימה ,אותו בלוק השייך ל- Caseזה יתבצע – elsestatementsיתבע בכל מקרה אחר ,כלומר אם לא נמצא ערך מתאים ברשימות הערכים השונות ניתן להשתמש בביטוי val1 To val2כדי ליצור טווח ערכים ניתן להשתמש בביטוי Is comparisonכדי להפעיל בדיקת ערך בתוך Select דוגמה: Dim nAge As Integer ))"nAge = Val(InputBox("Enter an age Select Case nAge Case 1 "MsgBox "One year old Case 2 "MsgBox "Two years old Case 3, 4, 5, 6 "!MsgBox "Well, growing Case 7 To 13 "!MsgBox "Not a child anymore Case 14, 15, Is < 19 "?MsgBox "A stupid teenager Case Else "!MsgBox "Well, very big End Select בקטע קוד זה מוצג Messageשונה על-פי המספר שהזין המשתמש. תיאור הפונקציה InputBoxמובא בסעיף הבא - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :4מרכיבי השפה I הפונקציות ,BEEP INPUTBOXוIIF- הפו נקציה Beep הפונקציה Beepמשמיעה צפצוף מרמקול המחשב תחביר: Beep הפו נקציה InputBox הפונקציה InputBoxמציגה הודעה למשתמש ,ומאפשרת לו להזין נתונים בתיבה מתאימה תחביר הפקודה: InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, )]context Promptהוא ההודעה למשתמש Titleהוא כותרת ההודעה defaultהוא המחרוזת שתוצג עם הפעלת הInputBox- xposו ypos-מגדירים את מיקום ה InputBox-במסך helpfileו context-מאפשרים הפעלת מערכת עזרה בתגובה ללחיצה על F1 הפונקציה מחזירה Stringכך שיהיה צורך בהמרות במקרה של בקשרה להזנת מספר מצד המשתמש דוגמה: )"strGender = InputBox("Enter your gender", "Gender", "Male בהפעלת שורת קוד זו Visual Basic ,מציגה את החלון הבא: הפו נקציה IIf פונקציה זו מאפשר בדיקת תנאי ,והחזרת ערך אחד מתוך שניים נתונים בהתאם לבדיקה פונקציה זו דומה בפעולתה לאופרטו ? בשפת C תחביר: )IIf(expr, truepart, falsepart exprהוא הביטוי המוערך truepartיתבצע ,והערך שלו יוחזר ע"י הפונקציה אם התוצאה של exprהיא True falsepartיתבצע ,והערך שלו יוחזר ע"י הפונקציה אם התוצאה של exprהיא False הפונקציה מפעילה בכל מקרה את הפקודות הרשומות ב truepart-ובelsepart- - 12אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים דוגמה: קטע קוד זה מציג InputBoxלמשתמש וקולט ממשנו מספר הפונקציה IIfמכניסה למחרוזת strAgeאת הערך המתאים לפי בדיקת התנאי nAge = 5 לבסוף מוצגת הודעה למשתמש Dim nAge As Integer, strAge As String )"nAge = InputBox("Enter an age", "Age )"strAge = IIf(nAge = 5, "The age is five", "The age is not five MsgBox strAge - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :4מרכיבי השפה I תרגילים .1צור תוכנית בשם ControlStructuresהמציגה למשתמש בקשה להזנת מספר בין 0ל 2-באמצעות הפונקציה ,InputBoxובהתאם למספר שהוזן יוצג MsgBoxלמשתמש. מקם על ה Form-שלושה CommandButtonsוכתוב את הנדרש בשלוש צורות: תוך שימוש ב ,If...Then...Else-בתגובה ל Click-על ה CommandButton-הראשון א. תוך שימוש ב Select...Case-בתגובה ל Click-על ה CommandButton-השני ב. תוך שימוש בפונקציה IIfבתגובה ל Click-על ה CommandButton-השלישי ג. .1כתוב תוכנית בשם .PrintSequenceמקם על טופס TextBoxאחד ו .CommandButton-בעת לחיצה על ה CommandButton-יש להציג על Labelשיונח על הטופס את רצף המספרים המתחיל ב 0-עד המספר שהוזן ע"י המשתמש לתוך ה.TextBox- .3כתוב תוכנית בשם .MultipleBoardלחיצה על CommandButtonשימוקם על הטופס ,ידפיס על גבי Label שימוקם בטופס את לוח הכפל במימדים 10X10בתוספת כותרות. .1כתוב תוכנית בשם ProcessInputsהקולטת מהמשתמש מספים בעזרת InputBoxעד אשר המשתמש מזין 0או מחרוזת ריקה .התוכנית תציג על גבי הטופס את סכום המספרים ,מכפלתם (אין לכפול כמובן ב 0-האחרון) ,ואת ממוצע המספרים. - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור : 3הפקדים הסטנדרטיים II בשיעור זה: תכיר את ה Controls-הבאים: ( CheckBox oתיבת סימון) ( OptionButton oתיבת אפשרות) ( Frame oמסגרת) ( ListBox oתיבת רשימה) ( ComboBox oתיבה משולבת) ( Line oקו) ( Shape oצורה) ( Timer oשעון) תכיר שיטה לניהול ממשק המשתמש באמצעות Timer ( CHECKBOXתיבת סימון) CheckBoxשימושי כאשר יש צורך בבחירת אחת שתי אפשרויות "כן" או "לא"" ,אמת" או "שקר"" ,מלא" או "ריק" וכו' ישנה אפשרות שלישית הנקראת ,Grayedהיא משמשת בעיקר לתיאור מצב לא מוגדר או חלקי (תוכל לעיין למשל התוכנית ההוספה וההסרה של פריטי Windowsמתוך ה ,Control Panel-שם Grayedמסמל בחירה חלקית של התת קבוצה) המעבר בין שני המצבים הראשונים הוא אוטומטי .כדי להפוך את התיבה ל Grayed-יש לנהל זאת מתוך הקוד Propertiesשל CheckBox DownPicture ,DisablePictureו :Picture-מגדירים תמונות למצבים שונים של ה CheckBox-במקרה שה- Styleשל ה CheckBox-מוגדר כGraphical- :Valueמכיל את אחד משלושה ערכים שבאוסף הקבועים vbUnchecked ,vbChecked – CheckBoxConstants וvbGrayed- Eventsשל CheckBox :Clickמתרחש בעת לחיצת עכבר או מקש הרווח ,המשנה את ערך הCheckBox- ( OPTIONBUTTONלחצן אפשרות) תוכל להשתמש ב OptionButton-במסגרת קבוצת אפשרויות שרק אחת מהן יכולה להיות מסומנת בזמן נתון Propertiesשל OptionButton :Valueמכיל את ערך ה OptionButton-שהוא Trueאו False - 13אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :3הפקדים הסטנדרטיים II ( FRAMEמסגרת) באמצעות Frameתוכל לקבץ מספר Controlsתחת קבוצה אחת Frameהוא פקד מסוג Container שתי תכונות עיקריות מאפיינות :Containers oאם משנים את מיקומו של ה Frame-כל ה Child Controls-שבתוכו זזים יחד איתו oכאשר ה Frame-נמצא במצב Disabledכל ה Child Controls-שבו גם הם Disabled Propertiesשל Frame :Enabledהוא המאפיין היותר חשוב של ה ,Frame-אם ערכו שווה ל False-כל ה Controls-שבו הופכים ללא זמינים Methodsשל Property :Moveהוא Methodחשוב ב ,Frame-כיוון ששימוש נכון בו יכול לאפשר מיקום מהיר של קבוצת Controls דוגמה : 1התוכנית CopyText בתוכנית זו תיצור טופס עם שני .TextBoxesלחיצה על CommandButtonיעתיק את תוכני הTextBoxes- לתיבה שלישית .ליד כל תיבת טקסט יופיע CheckBoxשיקבע האם יש להעתיק את אותו הטקס לפלט .בנוסף, יוצבו על התיבה שני OptionButtonsהבוררים בין רווח ( )Spaceלבין מעבר שורה ( )New lineכמפריד בין תיבות הטקסט. בתוכנית זו נבצע אתחול של ערכי ה Controls-השונים בשלב ה Load-של הטופס. .1צור פרוייקט חדש מסוג ,Standard EXEושמור אותו: הקצה לפרוייקט את השם CopyTextולטופס frmCopyText שמור את הפרוייקט .1הוסף Controlsלטופס: הוסף את ה Controlsהבאים ומקם אותם ע"פ הציור שלפניך: oשני lblInput1:LabelsוlblInput2- oשני chkIncludeText1 :CheckBoxesוchkIncludeText2- oשני optSeparateBySpace :OptionButtonsוoptSeparateByNewLine- CommandButon oאחדcmdCopyTexts : oשלושה txtInput2 ,txtInput1 :TextBoxesוtxtOutput- מקם את ה Controls-כך שהטופס ייראה כמו בציור הבא הקצה להם שמות כפי שמוצג בציור הבא קבע את סדר מעבר הטאב כך שיהיה לפי סדר המספרים המוקפים במלבן בציור הבא - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 0 4 1 2 5 3 6 7 8 9 : הגדר את המאפיינים הבאים.3 ערך 1-Fixed Single CenterScreen–2 True מאפיין BorderStyle StartUpPosition Default אובייקט frmCopyText cmdCopyTexts : הוסף קוד לטופס.1 Load בתגובה לאירוע, השוניםControls- קוד זה מאתחל את הטקסט בכותרת הטופס ועל גבי ה Controls- קוד זה מאתחל את ערכי ה, בנוסף Private Sub Form_Load() ' Initialize the form caption frmCopyText.Caption = "Copy Text" ' Initialize the labels caption lblInput1.Caption = "Input &1" lblInput2.Caption = "Input &2" ' Clear the text boxes txtInput1.Text = "" txtInput2.Text = "" txtOutput.Text = "" ' Initialize the check boxes chkIncludeText1.Caption = "Copy to output" chkIncludeText1.Value = vbChecked chkIncludeText2.Caption = "Copy to output" chkIncludeText2.Value = vbChecked - 11 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il II הפקדים הסטנדרטיים:3 שיעור ' Initialize the option buttons optSeparateByNewLine.Caption = "Separate by a &new-line" optSeparateBySpace.Caption = "Separate by a &space" optSeparateBySpace = True ' Initialize the command button cmdCopyTexts.Caption = "&Copy texts to output" End Sub : הוסף קוד לטופס.1 cmdCopyTexts הקוד הבא פועל בתגובה ללחיצה על הלחצן Private Sub cmdCopyTexts_Click() ' Copy first input text only if chkInputText1 is checked If chkIncludeText1.Value = vbChecked Then txtOutput.Text = txtOutput.Text & txtInput1.Text End If ' Copy space or new-line only if txtOutput is not empty If txtOutput.Text <> "" Then ' Determines which option button is checked and copy new-line ' or space accordingly If optSeparateByNewLine.Value = True Then txtOutput.Text = txtOutput.Text & vbCrLf Else txtOutput.Text = txtOutput.Text & " " End If End If ' Copy second text only if chkInputText2 is checked If chkIncludeText2.Value = vbChecked Then txtOutput.Text = txtOutput.Text & txtInput2.Text End If ' Prepare the output text box to the next copy If txtOutput.Text <> "" Then txtOutput.Text = txtOutput.Text & vbCrLf End If ' Bring the focus back to input1 txtInput1.SelStart = 0 txtInput1.SelLength = Len(txtInput1.Text) txtInput1.SetFocus End Sub הרץ את התוכנית ובדוק את פעולתה.1 - 11 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים ( LISTBOXתיבת רשימה) תיבת רשימה מאפשרת להציג למשתמש רשימת מחרוזות המשתמש יכול לגלול את רשימת הערכים כלפי מטה או מעלה האינדקסים של פריט ה ListBoxנעים בין 0ל( n 1 -כשאר nהוא מספר הפריטים ברשימה) Propertiesש ל ListBox :Columnsקובע אם ה ListBoxיציג את התוכן בטור אחד ( ) Columns 0או במספר טורים ( ) Colums 1עם פס גלילה אופקי :IntegralHeightקובע אם ה ListBox-יתאים את גובהו כך שמחרוזות יוצגו בשלמות :ItemDateמערך שלמים מסוג Longהמאפשר לצרף מידע נוסף לפריטי ה ListBox-כך שלכל מחרוזת ניתן יהיה להצמיד ערך מספרי לשימוש פנימי כלשהו של התוכנית :Listמערך מחרוזות המכיל בתוכו את תוכן הListBox :ListCountמחזיר את מספר הפריטים בListBox :ListIndexמחזיר את האינדקס של הפריט הנבחר ( -במקרה של ListBoxללא ,MultiSelectאו את הפריט שנמצא בפוקוס (בין אם הוא נבחר או לא) כאשר MultiSelectשווה ל 1או 1 :MultiSelectקובע האם יהיה ניתן לבחור מספר פריטים ברשימה במקביל :NewIndexמחזיר את האינדקס של הפריט האחרון שנוסף לרשימה :SelCountמחזיר את מספר הפריטים הנבחרים ברשימה :Selectedמאפיין זה מקבל כפרמטר אינדקס של פריט ,ומחזיר ערך בוליאני הקובע האם הפריט נבחר או לא. מאפיין זה שימושי במקרה של .MultiSelectכמו כן ,ניתן לקבוע בעזרת מאפיין זה האם פריט ייבחר או לא. :Sortedקובע אם האלמנטים ברשימה ימוינו באופן אוטומטי :Styleקובע את סגנון ה( ListBox-רגיל או עם )CheckBoxes :TopMostמאפשר לקבוע איזה פריט יוצג בראש הרשימה Methodsשל ListBox :AddItemמאפר להוסיף פריטים לרשימה בזמן ריצה :Clearמנקה את התוכן של הListBox- :Refreshמרענן את תצוגת הListBox :RemoveItemמסיר פריט מהרשימה Eventsשל ListBox :ItemCheckמתרחש כאשר המשתמש מסמן Vב CheckBox-המוצמד לפריט רשימה (רלוונטי כאשר המאפיין Styleשווה ל)checkbox :Scrollמתרחש כאשר המשתמש גולל את הרשימה או כאשר המתכנת גולל את הרשימה ע"י שימוש במאפיין TopIndex - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :3הפקדים הסטנדרטיים II ( COMBOBOXתיבה משולבת) ComboBoxהוא שילוב של TextBoxוListBox- כל ה( Propertiesמלבד ,)Styleה Methodsוה Eventsשך ComboBox Controlזהים לאלו של TextBox וה ListBoxוהתנהגותם זהה גם כן. Styleהוא המאפיין היחיד ששונה בComboBox- Propertiesשל ComboBox :Styleקובע את סגנון ה:ComboBox :Dropdown Combo oכולל TextBoxורשימה נפתחת .המשתמש יכול לבחור ערך מהרשימה או להקליד את הערך בעצמו :Simple Combo oכולל TextBoxורשימה לא נפתחת .המשתמש יכול לבחור את הרשימה בעצמו או להקליד את הערך :Dropdown List oכולל רשימה נפתחת בלבד .המשתמש יכול לבחור ערך מהרשימה בלבד. ( LINEקו) ו( SHAPE-צורה) Lineו Shape-הם פקדים המאפשרים להוסיף קווים שונים וצורות לטופס ללא שימוש בפונקציות גרפיקה לשם כך ל Line-ול Shapeאין Events Propertiesשל Lineו Shape - Width ,Top ,Leftו( Height-ב :)Shapeמגדירים את גודל ומיקום המלבן החוסם את הצורה ( Y2 ,Y1 ,X2 ,X1ב :)Line-מגדירים את נקודות הקצה של הישר חשוב לשים לב למאפייני הצבע והרקע של Lineו Shape-כי מעבר לשימוש גרפי בצורות אלו ,אין להם שימושים רבים ( TIMERפקד שעון) Timerמשמש לשיגור אירוע כל זמן נתון. Timerהוא מסוג הפקדים שלא נראים ב( Run Time-זמן ריצה) Propertiesשל Timer :Enabledקובע האם השעון פעיל וכתוצאה מכך משגר אירוע כל זמן נתון :Intervalקובע את המרווח במילי שניות בין שיגור אירוע אחד לשני Eventsשל Timer :Timerמתרחש כל Intervalמילי שניות (בתנאי שה Timer-נמצא במצב )Enabled - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים דוגמ ה StudentCourses – 2 בתוכנית זו נאפשר למשתמש לשבץ תלמידים לקורסים ,ולהוסיף את השיבוצים לListBox- המשתמש יוכל גם להסיר שורות שהכניס או את כולן תוך שימוש ב CommandButton-שיוצב לשם כך בתוכנית זו נשתמש ב Timer-שינהל את ממשק .1צור פרוייקט חדש מסוג ,Standard EXEושמור אותו: הקצה לפרוייקט את השם StudentCoursesולטופס frmStudentCourses שמור את הפרוייקט .1הוסף Controlsלטופס: הוסף את ה Controlsהבאים ומקם אותם ע"פ הציור שלפניך: oשלושה lblCourse ,lblStudents :LabelsוlblStudentToCourse- oשני cboStudents :ComboBoxesוcboCourses- oשלושה cmdQuit ,cmdAdd :CommandButtonsוcmdDelete- ListBox oאחדlstStudentToCourse : CheckBox oאחדchkDeleteAll : Timer oאחדtmrUUUpdate : oשלושה txtInput2 ,txtInput1 :TextBoxesוtxtOutput- מקם את ה Controls-כך שהטופס ייראה כמו בציור הקצה להם שמות כפי שמוצג בציור קבע את סדר מעבר הטאב כך שיהיה לפי סדר המספרים המוקפים במלבן בציור תוכל להשתמש בקווים כדי להפריד חלקים בטופס באופן וויזואלי 0 5 6 1 2 3 4 7 8 9 .3הגדר את המאפיינים הבאים: אובייקט frmStudentCourses lblStudents cboStudents lblCourses cboCourses lblStudentToCourses lstStudentToCourse מאפיין BorderStyle StartUpPosition Autosize Style Autosize Style Autosize Sort ערך 1-Fixed Single 2 - CenterScreen True 1 - Dropdown combo True 2 - Dropdown List True True - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il II הפקדים הסטנדרטיים:3 שיעור 1 - Checkbox True True 20 Style Default Cancel Interval cmdAdd cmdQuit tmrUIUpdate :הוסף קוד לטופס : הקוד הבא מצהיר על משתנים וקבועים בדיקת משתנה זה.ListBox- נועד לספור את מספר הפריטים שיש להסיר מהm_nCheckCounter המשתנה ListBox- בתוך הCheck בתגובה לסימון או ביטול סימון שלchkDeleteAll מקילה על שינוי מראה הלחצן . מתעדכן בהתאםlstStudentToCourse- כל הסימונים בתוך הchkDeleteAll- במקרה של שינוי הסימון ב כדי לאפשרm_nCheckedSource בתוכנית זו נעשה שימוש במשתנה הגלובלי,כיוון שנוצרת תגובה מעגלית לבדוק האם מקור השינוי היה פעולת משתמש או פעולתlstStudentToCourse-בקוד התגובה לסימון שורה ב . שאז אין לבצע מאומה,השמה מתוך הקוד הקבועים הופכים את התוכנית לקריאה יותר Dim m_nCheckCount As Integer Dim m_nCheckedSource As Integer Const CHECK_SOURCE_USER As Integer = 0 Const CHECK_SOURCE_CODE As Integer = 1 : הוסף קוד לטופס.1 : הקוד הבא מאתחל את הפקדים השונים ואת המשתנים Private Sub Form_Load() ' Initializing lblStudets lblstudents.Caption = "&Students" ' Initializing cboStudents cboStudents.Clear cboStudents.AddItem "John Degweed" cboStudents.AddItem "Erick E" cboStudents.AddItem "Michel de Hey" cboStudents.AddItem "Paul Okenfold" cboStudents.AddItem "Dimmitri" cboStudents.AddItem "Tiesto" cboStudents.AddItem "Josh Wink" cboStudents.AddItem "Terry Francis" cboStudents.AddItem "Ferry Corsten" ' Initializing lblCourses lblCourses.Caption = "&Courses" ' Initializing cboCourses cboCourses.Clear cboCourses.AddItem "Advanced DJ Techniqs" cboCourses.AddItem "Using guitar loops in the Mix" cboCourses.AddItem "Synthisizer - Advance Topics" cboCourses.AddItem "Synthisizer - Fundamentals" cboCourses.AddItem "Extarcting Loops" ' Initializing cmdAdd cmdAdd.Caption = "&Add to list" - 12 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 ' Initializing cmdQuit cmdQuit.Caption = "&Quit" ' Initializing lblStudentsToCourses lblStudentToCourse.Caption = "Student to course" ' Initializing lstStudentToCourse lstStudentToCourse.Clear ' Initializing chkDeleteAll chkDeleteAll.Caption = "Delete &all rows" ' Initializing cmdDelete cmdDelete.Caption = "&Delete" ' Other initializations m_nCheckCount = 0 m_nCheckedSource = CHECK_SOURCE_USER End Sub : הוסף קוד לטופס.1 cmdQuit או לחיצה עלcmdAdd להלן קוד השגרות לתגובה בעת לחיצה על להזנת ערך חדשcboStudent- הפוקוס מוחזר ל, לאחר הוספת השורה לרשימה Private Sub cmdAdd_Click() Dim strRow As String strRow = cboStudents.Text & ": " & cboCourses.Text lstStudentToCourse.AddItem strRow cboStudents.SelStart = 0 cboStudents.SelLength = Len(cboStudents.Text) cboStudents.SetFocus End Sub Private Sub cmdQuit_Click() Unload Me End Sub : הוסף קוד לטופס.1 cmdDelete הקוד הבא מופעל בתגובה ללחיצה על היא מבצעת איטרציה על פריטי, אחרתClear- אם יש להסיר את כל הפריטים מהרשימה השגרה משתמשת ב הרשימה בכדי לבדוק אלו מהם מסומנים למחיקה chkDeleteAll ומבטלת את הסימון שלידm_nCheckCount השגרה מאפסת את המונה, בסיום Private Sub cmdDelete_Click() Dim i As Integer ' Check whether to remove all items If chkDeleteAll.Value = vbChecked Then lstStudentToCourse.Clear ' Use Clear to emove all items Else ' Remove only the checked items i = 0 Do While i <= (lstStudentToCourse.ListCount - 1) If lstStudentToCourse.Selected(i) = True Then - 11 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il II הפקדים הסטנדרטיים:3 שיעור lstStudentToCourse.RemoveItem (i) Else i = i + 1 End If Loop End If ' Reset the "Delete all" - CheckBox and the ' Checked-Items counter (m_nCheckCount) chkDeleteAll.Value = vbUnchecked m_nCheckCount = 0 End Sub : הוסף קוד לטופס.1 lstStudentToCourse הקוד הבא בתגובה לסימון שורה ברשימה אזי מתבצע דילוג על שאר הקוד כדי למנוע תגובה,chkDeleteAll אם האירוע התרחש בגלל לחיצה על מעגלית m_nCheckCount בהתאם לכך הוא מעדכן את. הקוד בודק אם נוסף סימון או הוסר chkDeleteAll- ובהתאם לערך זה מותאם הסימון בm_nCheckCount לאחר מכן נבדק ערכו של Private Sub lstStudentToCourse_ItemCheck(Item As Integer) Dim nCheckedCount As Integer, i As Integer ' Process this code only if the Checked or Unchecked operation ' was invoked by the user and not the code inside chkDeleteAll If m_nCheckedSource = CHECK_SOURCE_USER Then m_nCheckCount = m_nCheckCount + _ IIf(lstStudentToCourse.Selected(Item), 1, -1) If m_nCheckCount = 0 Then chkDeleteAll.Value = vbUnchecked ElseIf m_nCheckCount = lstStudentToCourse.ListCount Then chkDeleteAll.Value = vbChecked Else chkDeleteAll.Value = vbGrayed End If End If End Sub : הוסף קוד לטופס.1 מילי שניות12 מופעל כל, קטע הקוד הבא בקוד זה נבדק מצב מרכיבים שונים בטופס ובהתאם לכך מעודכן ממשק המשתמש cboCourses- וcboStudents- מאופשר רק אם קיים טקסט בcmdAdd הלחצן lstStudentToCourse- מאופשר רק אם ישנם פריטים בchkDeleteAll 2- גדול מm_nCheckCount מאפשר רק אםcmdDeleteAll הלחצן Private Sub tmrUIUpdate_Timer() ' Enable the "Add to list" command only if there is text in ' cboStudents as well as in cboCourses cmdAdd.Enabled = cboCourses.Text <> "" And cboStudents.Text <> "" - 11 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 ' Enable the "Delete All" - CheckBox only if there are ' items in the list chkDeleteAll.Enabled = lstStudentToCourse.ListCount > 0 ' Enable cmdDelete only if the number of the checked items ' is greater than 0 cmdDelete.Enabled = m_nCheckCount > 0 End Sub : הפעל את התוכנית ובדוק את פעולה.1 בתגובה לשינוי תכני הרשימות השונותUser Interface- שים לב לעדכון ה מאופשר רק אם יש סימון כלשהו ברשימהDelete- שים לב ש - 13 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :3הפקדים הסטנדרטיים II תרגילים .1כתוב תוכנית בשם .DayAndColorמקם על טופס Frameובתוכו שבעה OptionButtonsעם הכותרות ,Sunday Mondayוכו' .כמו כן מקם על הטופס שלושה CheckBoxesעם הכותרות Green ,Redו .Blue-במקום ריק בטופס מקם .Labelבעת בחירת אחד הימים ב OptionButtons-יש לשנות את הטקסט הכתוב ב .Label-בעת לחצה על CheckBoxשל צבע ,יש להוסיף המרכיב שלו לצבע הטופס או להסיר מרכיב זה מצבע הטופס בהתאם לערך ה .CheckBox-כך למשל ,אם צבע הטופס הוא אדום ) RGB(255, 0, 0לאחר לחיצה על הCheckBox- הירוק יתוסף המרכיב שלו לצבע וכתוצאה מכך תקבל צבע צהוב () ,RGB(255, 255, 0לחיצה נוספת על Green תסיר את המרכיב והרקע ישוב להיות אדום. .1כתוב תוכנית בשם .FulfilListBoxבתוכנית הוסף על טופס את ה Controls-הבאים: ( TextBoxעם Labelמתאים ככותרת) ListBox ,ושלושה .CommandButtons בעת לחיצה ( )Clickעל ה CommandButton-הראשון יתוסף הטקסט שהוזן לתוך ה TextBox-הListBox- (ה CommandButton-הזה יהי .)Defaultאם לא קיים טקסט בתוך ה ,TextBox-לא יתבצע מאומה .לאחר ההוספה יוחזר הפוקוס ל TextBox-ויסומן הקטע שבתוכו. בעת לחיצה על ה CommandButton-השני ימחק הפריט המסומן ברשימה. CommandButtonשלישי ישמש ליציאה ויקבל את המאפיין .Cancel כמו כן ,בעת לחיצה כפולה ( )Double Clickעל שורה בתוך ה ListBox-יוצג Message Boxטקסט פריט שנבחר. .3צור תוכנית בשם .SumListData בטופס מקם את ה Controls-הבאים: שני TextBoxesעם Labelsמתאימים שכותרת הראשון היא " "Nameוכותרת השני היא "."Additional Value שני CommandButtonsשכותרת הראשון היא Insertוכותרת השני היא .Sum ListBoxאחד. בעת לחיצה על Insertיוזן ל ListBox-המידע שני ה .TextBoxes-כאשר ה Additional Data-הוא מידע המוכנס ל .ItemData-אם המשתמש לא הזין דבר לשדה Nameאזי לא תתבצע ההכנסה .אם רק השדה Additional Data חסר ,ערך ברירת המחדל יהיה .1לאחר ההוספה יוחזר הפוקוס לתיבה Nameויסומן בה הטקסט לשם החלפה. בעת לחיצה על הלחצן Sumיחושב סכום כל מאפייני ה ItemData-הצמודיפ לפריטי הרשימה ,ותוצג למשתמש הודעה מתאימה. - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור : 6מרכיבי השפה II בשיעור זה: תכיר את המילה With תלמד איך ליצור מערכים חד ממדיים ,רב ממדיים ומערכים דינמיים תלמד ליצור ( Control Arraysמערכים של פקדים) תלמד לכתוב רוטינות ופונקציות תכיר צורות העברה שונות של פרמטרים לרוטינה ופונקציה תבין מהם משתנים מקומיים ,משתנים גלובליים ומשתנים סטטיים תבין מהי פרוצדורה סטטית תלמד ליצור פרוצדורה עם מספר פרמטרים משתנה תלמד לעבוד עם מודולי קוד (*)bas. תלמד כיצד להפעיל קוד מחלון הImmediate- תלמד ליצור רשימות קבועים באמצעות המשפט Enum...End Enum תלמד להגדיר סוגי משתנים חדשים ()User Defined Type המילה WITH לעתים יש צורך להגדיר מספר גדול של מאפיינים של אובייקט כדי לקצר את זמן הכתיבה וכדי להפוך את הקוד מובן יותר אפשר להשתמש בתבנית הכתיבה הבאה: With object .property1 = value1 .property2 = value2 ... End With ( ARRAYSמערכים) מערך הוא רצף של משתנים מאותו הסוג הממוקמים ברצף בזכרון ב Visual Basic-ניתן להצהיר על מערכים חד ממדיים ,רב ממדיים ,ומערכים דינמיים הפנייה לאיבר במערך ב Visual Basic-מתבצעת על-ידי רישום אינדקס האיבר בתוך סוגריים עגולים כאשר הפנייה היא לאיבר במערך רב ממדי ,יש להפריד בין אינדקסים ברמות שונות באמצעות פסיקים הצהרה תוך שימוש במילים Dim Private ,Publicאו ,Staticזהה באופן ובמשמעות שלה להצהרה על משתנים רגילים ( One-Dimensional Arraysמערכים חד ממדיים) הצהרה על מערך חד ממדי יכולה להתבצע בשתי צורות ,הצורה הראשונה היא: Dim arr_name(upper_index) As Type arr_nameהוא שם המערך upper_indexהוא האינדקס של האיבר האחרון במערך Typeהוא סוג האיברים במערך - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :6מרכיבי השפה II הצורה השניה היא: השוני בצורה זו ,הוא בכך שאתה מגדיר את האינדקס התחתון ואת האינדקס העליון שיהוו את גבולות המערך מותר להשתמש גם במספרים שליליים עבור האינדקסים Dim arr_name(lower_index To upper_index) As Type המשפט Option Base אם לא מצוין האינדקס התחתון של המערך ,ברירת המחדל היא 2 כדי לשנות זאת ניתן להשתמש במשפט Option Base 1בתחילת מודול הקוד ,במקרה זה ,האינדקס התחתון של מערכים שיוצהרו בצורה הראשונה יהיה 1 ניתן להשתמש גם במשפט ,Option Base 0אך זוהי ברירת המחדל ( Multi-Dimensional Arraysמערכים רב ממד יים) ההצהרה על מערכים רב ממדיים דומה למערכים חד ממדיים ,אלא שיש להפריד בפסיקים בין הגדרת טווחי האינדקסים של כל ממד ,באופן הבא: Dim arr_name(lower_index1 To upper_index1, lower_index2 To upper_index2,...) As Type טווחי האינדקסים של ממד במערך יכולים להיות מוצהרים כמו בצורה הראשונה שהוצגה עבור מערכים חד ממדיים .במקרה זה ,האינדקס התחתון יהיה 2אלא אם הוגדר Option Base 1בתחילת הקובץ ( Dynamic Arraysמערכים די נמיים) כדי להצהיר על מערך דינמי ,יש להצהיר עליו מלכתחילה ללא גודל מוגדר ,באופן הבא: Dim arr_name() As Type באמצעות המילה ReDimניתן לשנות את גודל המערך במהלך ריצת התוכנית ,באופן הבא: ]ReDim [Preserve] (lower_index1 To upper_index1, ...) [As Type ניתן לשנות את מספר הממדים במערך ,את גודל כל ממד את סוג האיברים במערך ניתן רק אם המערך מאוחסן בתוך משתנה מסוג Variant אם משתמשים במילה Preserveגודלו משתנה תוך שמירת תוכנו הקודם בעת שימוש במילה Preserveלא ניתן לשנות את סוג האיברים במערך ,כמו גם את גבולו התחתון של המערך בעת שימוש במילה Preserveבעת שינוי גודלו של מערך רב ממדי ,ניתן לשנות רק את אינדקסים של הממד האחרון במערך אזהרה :השימוש במילה ReDimיכול לשמש גם כהצהרה על משתנה .משמעות הדבר היא שגם אם כתוב בראש המודול המשפט ,Option Explicitוהשתמשת ב ReDim-יחד עם שם משתנה שלא הוצהר בראש המודול ,לא תקבל שגיאת קומפילציה ואותו מערך אכן ייוצר באופן מקומי. בדיקת גודל מע רך ב זמן ריצה באמצעות LBoundו UBound - מתעורר צורך לעתים קרובות לדעת מהו הגבול התחתון (האינדקס התחתון) של מערך ,כמו גם גבולו העליון .צורך זה הופך לקריטי כשעוסקים בכתיבת קוד גנרי ,כמו גם תוך עבודה עם מערכים דינמיים הפונקציה )Lower Bound( LBoundמחזירה את האינדקס התחתון של מערך הפונקציה )Upper Bound( UBoundמחזירה את האינדקס העליון של המערך דוגמה 1 Dim m_nArr(9) As Integer פקודה זו מצהירה על מערך שהאינדקס הראשון שלו הוא 0והאחרון הוא .9סה"כ 10איברים - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים דוגמה 2 Option Base 1 ... ... Dim m_nArr(9) As Integer שורות קוד אלו זו מצהירה על מערך שהאינדקס הראשון שלו הוא 1והאחרון הוא .9סה"כ 9איברים שים לב שהמשפט Option Baseיכול להופיע רק פעם אחת בתחילת המודול (לפני כל הפונקציות או ההצהרות על מערכים) משפט Option Baseמשפיע רק על מערכים שנוצרו בתוך המודול בו נרשם המשפט דוגמה 1 Dim TicTacToe(1 To 3, 1 To 3) As Boolean בשורת קוד זו מוצהר מערך דו ממדי בשם ,TicTacToeשהאינדקסים בשני הממדים שלו נעים בין 1ל( 3-כולל) דוגמה 4 בדוגמה זו הנח ששורות הקוד מתבצעות בסדר כרונולוגי מהמשפט הראשון לאחרון. Dim dyn_arr() As Integer בשורת קוד זו מוצהר מערך דינמי בשם dyn_arrמסוג Integer בשורת קוד זו קובעים מחדש את ממדי המערך ,dyn_arrכך שיכיל ממד אחד שהאינדקסים שלו נעים בין 5ל1- )ReDim dyn_arr(5 To 9 )ReDim dyn_arr(3 To 10 שורת קוד זו משנה שוב את ממדי המערך כך שיכיל ממד אחד שהאינדקסים שבו נעים בין 3ל12- )ReDim Preserve dyn_arr(3 To 12 שורת קוד זו מגדירה שוב את ממדי המערך תוך שמירה על הערכים המאוחסנים בו .בשורה שזו משתנה האינדקס ל11- ניסיון להריץ את שורת הקוד הבאה יגרום לשגיאה: )ReDim Preserve dyn_arr(-2 To 20 שורת קוד זו מנסה (אך לא יכולה) להשתמש במילה Preserveתוך שינוי האינדקס התחתון של המערך )ReDim dyn_arr(-2 To 7, 11 בשורת קוד זו משנים שוב את ממדי המערך כך שיכיל שני ממדים ,כאשר האינדקסים בממד הראשון נעים בין –2 ל ,1-והאינדקסים בממד השני נעים בין ( 2או 1אם הוגדר 1 Option Baseבראש המודול) ל11- ניסיון להריץ את שורת הקוד הבאה ייתקל בשגיאה: ReDim dyn_arr(-2 To 7, 13) As Long לא ניתן לשנות סוג של מערך דוגמה 3 בדוגמה זו תראה כיצד ניתן לשנות את סוג המערך תחילה יש להצהיר על משתנה רגיל מסוג :Variant שים לב שזהו משתנה רגיל (אין סוגריים ריקים בהצהרה) לאחר מכן תוכל לשנות את גודל המערך ואת סוגו כל אימת שתרצה בכך: Dim dyn_arr as Variant ReDim dyn_arr(3 To 5, 6 To 7) As Long לא תוכל לשנות את סוג המערך אם השתמשת במילה Preserve - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :6מרכיבי השפה II ( CONTROL ARRAYמערכי פקדים) כפי שניתן ליצור מערכי משתנים מסוגים בסיסיים וסוגים המוגדרים ע"י המשתמש ,כך ניתן ליצור Control ( Arraysמערכי פקדים) לכל סוגי הפקדים (בדוק זאת!!!) קיים מאפיין בשם Index ב Control Array-כל הפקדים חייבים להיות מאותו הסוג ובעלי אותו שם האינדקס של כל פקד במערך נקבע באמצעות המאפיין Index גישה לפקד בודד מתוך Control Array כדי לגשת לפקד מסוים במערך יש לציין את האינדקס שלו באופן הבא: ControlArrayName(desire_index).property = ... או ControlArrayName.Item(desire_index).property = ... בדיקת גודל המערך וגבולותיו ניתן לקבוע את גודל ה Control Array-באמצעות הפונקציה ,Countבאופן הבא: ControlArrayName.Count ניתן לקבוע את האינדקס התחתון ב Control Array-באמצעות הפונקציה ,LBoundבאופן הבא: ControlArrayName.LBound... ניתן לקבוע את גבולו העליון של ה Control Array-באמצעות הפונקציה ,UBoundבאופן הבא: ControlArrayName.UBound... אירועים של פקדים השייכים לControl Array- הפרמטר הראשון בשגרות אירוע של ,Control Arrayהוא האינדקס של הפקד במערך עבורו שוגרה ההודעה מבנה כללי של שגרת אירוע עבור ControlArrayהוא כדלקמן: Private Sub ControlArrayName_EventName(Index As Integer, .....all other )parameters in the event... שלבי יצירת Control Array ליצירת Control Arrayישנן כמה דרכים ,אתאר כאן שתיים: הדרך הראשונה והפשוטה היא ליצור פקד אחד ,להגדיר לו את השם והמאפיינים הנדרשים ולאחר מכן להעתיק אותו ( )Ctrl+Cולהדביק אותו ( Visual Basic .)Ctrl+Vתשאל אותך האם אתה מעוניין ליצור מערך פקדים אשר את הבקשה ,והמערך ייוצר. דרך שניה היא להגדיר באופן ידני את שמות הפקדים ואת האינדקס שלהם כך ששמות הפקדים יהיו זהים ,ולכל אחד מהם יוקצה אינדקס ייחודי יצירת פקדים בזמן ריצה כדי ליצור פקדים בזמן ריצה עליך ליצור Control Arrayשיש בו לפחות איבר אחד בזמן עיצוב התוכנית בזמן ריצת התוכנית תוכל להשתמש במתודה Loadכדי לטעון פקדים נוספים באופן הבא: )Load arr_name(new_index תקבל שגיאה אם תנסה ליצור פקד חדש עם אינדקס שכבר תפוס ע"י פקד אחר באותו המערך הקפד להגדיר את מאפייני הפקד מיד לאחר שנוצר כדי להסיר פקד בזמן ריצה ,השתמש במתודה Unloadבאופן הבא: )Unload arr_name(index_to_remove לא תוכל להסיר פקדים שנוצרו בזמן עיצוב ,אלא רק פקדים שנוצרו באמצעות קריאה קודמת לLoad- - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 Com mandBoard – התוכנ ית1 תרגיל בדוגמה זו אמחיש לך כיצד ניתן ליצור פקדים בזמן ריצה ונמקם אותם על גבי הטופס הראשי של התוכניתRuntime-בתוכנית זו נטען פקדים ב , ותסיר אותו מהטופס (אלא אם מדובר בפקד הראשון,לחיצה על אחד הפקדים תציג הודעה עם מספר הפקד )Design time-כלומר זה שמוקם על הטופס ב :Standard EXE צור תוכנית frmCommandBoard ולטופס את השם,CommandBoard הקצה לפרוייקט את השם שמור את התוכנית :הוסף פקד לטופס cmdBoard על גבי הטופס והקצה לו את השםCommandButton הצב פקד מסוג :הגדר את המאפיינים הבאים ערך מאפיין אובייקט 1-Fixed Single BorderStyle frmCommandBoard 2 - CenterScreen StartUpPosition 0 - User ScaleMode 0 ScaleLeft 0 ScaleTop 3 ScaleWidth 3 ScaleHeight 0 Index cmdBoard :הוסף קוד לטופס :Control Array- נוסיף פעולות אתחול ויצירה של ה, של הטופסLoad לאירוע Private Sub Form_Load() Dim i As Integer ' Initialize the caption Me.Caption = "Command Board" ' Reposition the first control With cmdBoard(0) .Caption = "&0" .Left = 0 .Top = 0 .Width = 1 .Height = 1 .Visible = True End With ' Load the controls from 2 to 9 (th first is already on the form) ' Then, reposition the loaded controls For i = 1 To 8 Load cmdBoard(i) - 11 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il .1 .1 .3 .1 שיעור :6מרכיבי השפה II )With cmdBoard(i )).Caption = "&" & Trim(Str(i .Left = i Mod 3 .Top = i \ 3 .Width = 1 .Height = 1 .Visible = True End With Next i End Sub שים לב ,לאחר טעינת כל פקד השתמשנו ב With-כדי להגדיר קבוצת מאפיינים שלו .צורת רישום כזו נוחה ומובנת יש להגדיר את המאפיין Visibleל True-כדי שהפקד הנטען יוצג על פני הטופס הכותרות של הפקדים הוגרו לפי האינדקס שלהם לצורך הנוחות כשרוצים להכניס קו תחתון מתחת למספר (מאיץ מקלדת באמצעות ,)ALTמשתמשים בתו המוכר & (אמפרסנד) הפונקציה Strהממירה מספר למחרוזת מוסיפה רווח בתחילת המחרוזת כאשר המספר הוא חיובי ,וסימן – (מינוס) כאשר המספר הוא שלילי .כדי להסיר רווח זה ניתן להשתמש בפונקציה Trim .1הוסף קוד לטופס: הקוד הבא פועל בתגובה לאירוע Clickשל הפקדים במערך אם הפקד שנלחץ אינו הראשון (אינדקס 0שאותו אסור להסיר באמצעות ,)Unloadמוסר הפקד באמצעות :Unload )Private Sub cmdBoard_Click(Index As Integer ' Remove the Command only if it isn't the first (index = 0) command )If Index <> 0 Then Unload cmdBoard(Index End Sub .1הרץ ובדוק את פעולת התוכנית פרוצדורות בVISUAL BASIC- כמו בכל שפת תכנות ,גם ב Visual Basic-ניתן לכתוב פרוצדורות קוד פרוצדורות ב Visual Basic-מגיעות אלינו בארבעה טעמים: – Sub Routines oרוטינות - Functions oפונקציות – Properties oמאפיינים - Events oאירועים את השניים הראשונים תכיר בשיעור זה .יצירת מאפיינים ואירועים תכיר בשיעור העוסק במחלקות - 12אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים רוטי נות ופו נקצ יות שלב I רוטינה ב Visual Basic-אינה מחזירה ערך ,לעומת פונקציה המחזירה ערך לרוטינות ופונקציות ניתן להעביר פרמטרים בשתי צורות: - By Value oעל ידי ערך – By Reference oעל ידיד ייחוס oקיימים היבטים נוספים הנוגעים להעברת פרמטרים ,נכיר אותם בהמשך העברת פרמטר By Valueיוצרת העתק למשתנה והעתק זה נמצא בידי הרוטינה או הפונקציה העברת פרמטר By Referenceגורמת למשתנה המקורי להיות נגיש על ידי הרוטינה או הפונקציה תחביר רוטינות ופונקציות תחביר רוטינה הוא: תחביר פונקציה הוא: SubNameהוא שם הרוטינה ו FunctionName-הוא שם הפונקציה parametersהוא רשימת הפרמטרים המועברים לרוטינה או לפונקציה .בהמשך נראה כיצד מעבירים פרמטרים. Publicהופך את הרוטינה או הפונקציה לציבורית ,כלומר נגישה על ידי קוד ממודולי קוד אחרים בפרוייקט ניתן להשתמש במילה Privateבמקום המילה ,Publicואז הרוטינה או הפונקציה הופכת לפרטית באותו מודול קוד ,ולא תהיה אליה גישה ממודולים אחרים Publicהיא הרשאת ברירת המחדל עבור פרוצדורות קוד Typeהוא סוג הערך המוחזר על ידי הפונקציה .אם לא צוין במפורש ,הסוג הוא Variant – ReturnValueכשרוצים להחזיר ערך מפונקציה יש לבצע השמה לשם הפונקציה )Public Sub SubName(parameters ... End Sub Public Function FunctionName(parameters) As Type ... FunctionName = ReturnValue End Function רשימת פרמטרים רישום הפרמטרים שהפרוצדורה מקבלת מתבצע באופן הבא: [ByVal | ByRef] parameter1 As Type, [ByVal | ByRef] parameter2 As Type... parameter1ו parameter2-הם שמות הפרמטרים Typeהוא סוג הערך של הפרמטר .אם לא צוין במפורש ,סוג הפרמטר הוא Variant ByValאו ByRefקובעים את האופן שבו יועבר הפרמטר לפונקציה .האפשרויות הן: – ByVal oעל ידי ערך – ByRef oעל ידי ייחוס oאם לא צויין במפורש ,ברירת המחדל היא ByRef מערכים ניתן להעביר ByRefבלבד יציאה מרוטינה או פונקציה ניתן לצאת בכל שלב מתוך רוטינה או פונקציה על ידי שימוש במשפטים: – Exit Sub oליציאה מרוטינה – Exit Function oליציאה מפונקציה - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :6מרכיבי השפה II משתנים מקומיים ,גלובליים וסטטיים ניתן להצהיר על משתנים בתוך פרוצדורות קוד באמצעות המילים Dimאו Staticבלבד הצהרה על משתנים בתוך פרוצדורה אינה יכולה להתבצע באמצעות המילים Publicאו Private משתנים המוצהרים בתוך פרוצדורת קוד נקראים משתנים מקומיים משתנים מקומיים זמינים אך ורק לקטע הקוד התחום בתוך הרוטינה או הפונקציה משתנים מקומיים מתחילים את חייהם עם תחילת הפרוצדורה ומשוחררים מהזיכרון עם סיום הפרוצדורה משתנים המוצהרים בראש מודול נקראים משתנים גלובליים משתנים גלובליים זמינים לכל הרוטינות והפרוצדורות באותו מודול משתנים גלובליים מתחילים את חייהם בתחילת חייו של מודול הקוד ומסיימים את חייהם בסיום חייו של מודול הקוד (במקרה של מודול * bas.מדובר בתחילת התוכנית ובסיומה .מודול *.basיילמד בהמשך) משתנים המוצהרים בפרוצדורה באמצעות המילה Staticנקראים משתנים סטטיים משתנים סטטיים נשמרים בזכרון גם לאחר שהפרוצדורה מסיימת את פעולתה ,וערכם נשמר עד להפעלה הבאה של הפרוצדורה .במילים אחרות ,משתנים סטטיים שומרים על ערכם בין שתי קריאות סמוכות לפרוצדורה. דוגמה 1 )(Public Sub Hello "!MsgBox "Hello, world End Sub פרוצדורה זו מציגה Message Boxעם ההודעה "!"Hello, world שים לב שהיה ניתן להימנע מהשימוש במילה Publicכיוון שזוהי ברירת המחדל דוגמה 2 )Public Sub DispSum(ByVal a As Integer, ByVal b As Integer )MsgBox Str(a + b End Sub רוטינה זו מציגה ב Message Box-את סכומם של שני מספרים המועברים אליה דוגמה 1 )Public Sub Swap(ByRef var1 As Variant, ByRef var2 As Variant Dim varTmp As Variant varTmp = var1 var1 = var2 var2 = varTmp End Sub הרוטינה Swapמחליפה בין התכנים של שני משתנים המועברים אליה כיוון שהפרמטרים מוצהרים כ ,Variant-ניתן להפעיל רוטינה זו על כל הסוגים הבסיסיים של Visual Basic שים לב שניתן היה להימנע מהשימוש במילה ByRefכיוון שזוהי ברירת המחדל דוגמה 4 Public Function GiveMe5() As Integer GiveMe5 = 5 End Function פונקציה זו מחזירה 5למי שקרא לה ()Caller - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים דוגמה 3 Public Function Factorial(ByVal n As Byte) As Long Dim lRes As Long lRes = 1 Do While n > 0 lRes = lRes * n n = n - 1 Loop Factorial = lRes End Function פונקציה זו מחשבת את העצרת של מספר המועבר אליה שים לב לשימוש בפרמטר ( nהפרמטר המועבר לפונקציה) .שינוי הפרמטר במהלך הפונקציה לא משפיע על המקור, כיוון שהפרמטר מועבר ,ByValכלומר בפונקציה נעשה שימוש בהעתק של המשתנה המועבר. דוגמה 6 Public Function FindBigger(ByRef arr() As Integer) As Integer Dim l As Integer, u As Integer Dim bigger As Integer )l = LBound(arr )u = UBound(arr bigger = l Do While l <= u If arr(l) > arr(bigger) Then bigger = l l = l + 1 Loop FindBigger = bigger End Function פונקציה זו מקבלת מערך של Integersומחזירה את האינדקס של האיבר הגדול במערך הפונקציה סורקת את המערך החל מאינדקס האיבר הראשון ( )LBoundעד לאינדקס האיבר האחרון ()UBound דוגמה 7 Public Function SumCalls() As Integer Static nCalls As Integer nCalls = nCalls + 1 SumCalls = nCalls End Function בדוגמה זו SumCallsהיא פונקציה המחזירה את מספר הקריאות שהתבצעו אליה עד כולל הקריאה האחרונה המשתנה nCallsמוצהר כסטטי ,לכן הוא מאותחל ל 2-פעם אחת (בקריאה הראשונה) ,ובכל קריאה נוספת הוא שומר על ערכו הקודם - 13אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :6מרכיבי השפה II קריאות לרוטינות ופרוצדורות ][Call] name [argumentlist ניתן לקרוא לרוטינות או פונקציות באמצעות המילה Call השימוש במילה Callהוא אופציונלי ,ולרוב לא משתמשים בו אם נעשה שימוש במילה ,Callיש לתחום בתוך סוגריים ארגומנטים המועברים לרוטינה או לפונקציה כאשר קוראים לרוטינה ללא שימוש במילה ,Callאין לתחום בסוגריים את הארגומנטים אם משתמשים בערך המוחזר של פונקציה ,יש לתחום בסוגריים את הארגומנטים המועברים לפונקציה דוגמאות לקריאה לפרוצדורת Call Hello בשורת קוד זו נקראת הרוטינה Hello בשורת קוד זו מתבצעת קריאה לרוטינה ,Swapומועברים אליה הפרמטרים aוb- באופן דומה ניתן היה לרשום: בשורת קוד זו ,המבצעת קריאה לפונקציה ,Factorialוהערך המוחזר ממנה מושם למשתנה res )Call Swap(a, b Swap a, b )res = Factorial(8 רוטי נות ופרוצדורות שלב II פרוצדורות סטטיות ניתן להפוך פרוצדורה לסטטית על ידי הוספת המילה Staticלאחר המילה Publicאו Privateולפני שם הפרוצדורה ,כלומר: ][Public | Private] Static ProcedureName(arglist) [As Type פרוצדורה סטטית היא פרוצדורה שכל המשתנים שבה שומרים על ערכם בין הקריאות השונות לפרוצדורה named-arguments בעת קריאה לפונקציה ניתן לציין לאיזה פרמטר פורמלי מיועד כל ארגומנט אקטואלי שמעבירים ,תוך שימוש באופרטור ( =:נקודתיים ושווה) כך לדוגמה ,אם מוצהרת הפונקציה הבאה: Public Function Div(ByVal Num1 As Double, ByVal Num2 As Double) As Double ונרצה לחשב את הביטוי , 3.12 8 2נוכל לקרוא לפונקציה בשתי צורות: )res = Div(8, 2 או )res = Div(Num2 = 2, Num1 = 8 ParamArray ParamArrayדומה לאופרטור ( ...שלוש נקודות) בשפת ,Cבהקשר של פרמטרים לפונקציות ParamArrayמאפשר להעביר מספר משתנה של פרמטרים לפרוצדורה ParamArrayחייב להופיע בסוף רשימת הפרמטרים לפרוצדורה שהפרמטר האחרון שלה הוא מסוג ,ParamArrayניתן לקרוא עם מספר משתנה של פרמטרים (חוץ מהפרמטרים שהם חובה כמובן) בתוך הפרוצדורה ,הגישה לפרמטרים המועברים נעשית בצורה שבה ניגשים לאיברי מערך - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים אי אפשר להשתמש במילים ByValאו ByRefיחד עם ParamArray ברשימת הפרמטרים לא יכולים להיות יחד ParamArrayופרמטרים אופציונליים (נלמד בסעיף הבא) תחביר השימוש ב ParamArray-הוא כדלקמן: ......(arg1 As Type, arg2 As Type, ..., ParamArray other_pamaters()).... מילת המפתח היא ParamArray )( other_paramatersזהו שם המערך (במקרה זה) כפי שיוכר בפרוצדורה בהמשך תראה דוגמה לשימוש בParamArray- פרמטרים אופציונליים ניתן להגדיר פרמטרים מסוימים של פרוצדורה כאופציונליים ,כלומר פרמטרים שאין חובה להעביר לפרוצדורה ניתן להשתמש בפונקציה IsMissingכדי לבחון אם פרמטר (מסוג Variantבלבד) הועבר לפונקציה ניתן להגדיר ערכי ברירת מחדל עבור פרמטרים אופציונליים כאשר משתמשים בפרמטר אופציונלי כל הפרמטרים שאחריו חייבים גם הם להיות אופציונליים התחביר לפרמטרים אופציונליים הוא כדלקמן: ...(...,Optional [ByVal | ByRef] arg As Type [= DefaultValue],... מילת המפתח היא Optional ניתן להמשיך ולהשתמש ב ByRef-או ByVal Typeהוא סוג הפרמטר שלו מצפה הפרוצדורה DefaultValueהוא חלק רשות המגדיר את ערך הפרמטר במקרה שלא הועבר לפרוצדורה יצירת שלד פרוצדורה באמצעות Add Procedureמהתפריט Tools ניתן ליצור תבנית פרוצדורות מכל הטעמים (רוטינות ,פונקציות ,מאפיינים ואירועים) באמצעות הAdd Procedure... :Wizard- לשם פתיחת ה Wizardעליך להיות בחלון הקוד של אחד מהמודולים בתוכנית .ואז מתוך התפריט Toolsבחר ב...Add Procedure- אפשרויות הבחירה הן Property ,P Function ,Sub :וProcedure- אפשרויות הגישה הן Publicאו Private אם תסמן את האפשרות All Local variables as Staticה Wizard-ייצור עבורך פרוצדורה סטטית דוגמה 1 _ Public Function Mult(ByVal Num1 As Double, _ ByVal Num2 As Double, ParamArray AdditionalNums()) As Double Dim res As Double Dim l As Integer, u As Integer )l = LBound(AdditionalNums )u = UBound(AdditionalNums res = Num1 * Num2 Do While l <= u )res = res * AdditionalNums(l l = l + 1 Loop Mult = res End Function לפונקציה זו ישנם שני פרמטרים שהם חובה Num1 :וNum2- - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :6מרכיבי השפה II ניתן להעביר פרמטרים נוספים לפונקציה ואז תחושב המכפלה של כל המספרים דוגמה 1 _ Public Function Div(Optional ByVal Num1 As Double = 1#, Optional ByVal Num2 As Double = 1#) As Double If Num2 = 0# Then Exit Function ' Num2 must be non-zero Div = Num1 / Num2 End Function פונקציה זו מחזירה את מנת החלוקה של Num1בNum2- אם לא מועבר אחד מהמספרים ,ערך ברירת המחדל שלו יהיה 1.0 מודולי קוד סטנדרטיים מודולי הקוד ב Visual Basic-מתחלקים לשתי קבוצות עיקריות: Class Modules o Standard Modules o מודולי מחלקה ( )Class Modulesיילמדו בהמשך ,טפסים לדוגמה הם סוג של מודול מחלקה מודול סטנדרטי יכול להכיל פונקציות ומשתנים גלובליים שיהיו זמינים לכל האובייקטים ביישום ניתן לכלול משתנים ופונקציות שיהיו זמינים לפונקציות שבמודול בלבד על ידי שימוש במילה Private כדי להוסיף מודול יש לבחור Add Moduleמתוך התפריט Project הפעלת פונקציות מחלון *.BAS הIMMEDIATE חלון ה Immediate-הוא אחד ממרכיבי מערכת ניפוי השגיאות ( )Debuggerשל ( Visual Basicנושא יילמד בשיעור הבא) חלון ה ,Immediate-כשמו ,מאפשר לבצע פעולות באופן מידי ניתן להריץ פונקציות ורוטינות באמצעות חלון ה Immediate-מבלי להריץ את התוכנית כולה כמובן שגם במהלך התוכנית ניתן לבחון ערכי משתנים ופונקציות בתוכנית ,אך נושא זה יידון בפירוט בפרק הבא כדי להציג ערך המוחזר על ידי פונקציה בחלון ה ,Immediateיש להקדים את הסימן? (סימן שאלה) – כמובן שיש לתחום בסוגריים את הארגומנטים המועברים לפונקציה כדי להציג את חלון ה Immediate-ניתן לבחור Immediate windowמהתפריט ,Viewאו לחילופין להפעיל את צירוף המקשים Ctrl+G תרגיל – 2הפעלת קוד מחלון ה Immediate - בתרגיל זה תכתוב במודול סטנדרטי קוד המוצג בדוגמאות הקודמות ,ותריץ אותו דרך חלון הImmediate- .1צור תוכנית :Standard EXE הסר מהתוכנית את הטופס: oלחץ לחיצה ימנית על שם הטופס ב( Project Explorer-אם אינך רואה את ה Project Explorer-בחר אותו מהתפריט )View oמהתפריט המוקפץ בחר בRemove Form1- הוסף מודול לפרוייקט: oבחר באפשרות Add Moduleמהתפריט Project oבחר ב Module-ולחץ על Open הקצה לפרוייקט את השם ModuleAndImmediateו-למודול הקצה את השם modProcedures שמור את הפרוייקט - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים .1הצג את חלון ה:Immediate- וודא שחלון ה Immediate-מוצג אם אינך רואה אותו לחץ על Ctrl+G .3בחן את הרוטינה MsgBoxמתוך חלון ה:Immediate- הקלד בחלון ה Immediate-את הקוד הבא: "!MsgBox "Hello, world ברגע שתלחץ על Enterחלון ה Message Box-יופיע נסה לשנות את הפרמטרים האחרים ברוטינה ובחן את השפעתם על אופן הצגת הMessage Box- .1בחן את הפונקציה Leftשל :Visual Basic הקלד את שורת הקוד הבאה בחלון ה:Immediate- )?Left ("Hello, world!",4 שים לב לסימן השאלה בתחילת השורה ,ולסוגריים המקיים את הארגומנטים הארגומנטים מטרתם להנחות את Visual Basicשברצוננו להשתמש בערך המוחזר מהפונקציה סימן השאלה מטרתו להנחות את Visual Basicלהציג את הערך המוחזר בחלון הImmediate- .1הוסף פונקציה ל:Module- כתוב את הפונקציה Sumהמוצגת להלן ,בחלון ה:Module- _ Public Function Divide(ByVal a As Double, Optional ByVal b As Double = 2#) As Double Divide = a / b End Function .1בחן את הפונקציה מחלון ה:Immediate- הקלד את שורת הקוד הבאה בחלון ה:Immediate )?Divide(3,6 אתה צריך לקבל את התוצאה ( 2.1האפס לא מוצג) הקלד את שורת הקוד הבאה בחלון ה:Immediate- בשורת קוד זו השתמשת בnamed arguments- אתה צריך לקבל 2 הקלד את שורת הקוד הבאה בחלון ה:Immediate- במקרה זה ,חסר הארגומנט השני ,לפיכך הפונקציה משתמשת בערך ברירת המחדל שקבעת לה אתה צריך לקבל 4 הקלד את שורת הקוד הבאה בחלון ה:Immediate- )?Divide(b:=3, a:=6 )?Divide(8 )?Divide(7, 0 אתה אמור לקבל ששגיאת חלוקה ב 2-על ידי סביבת הפיתוח - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :6מרכיבי השפה II ( ENUMERATIONSאוספי קבועים) בדומה למילת המפתח enumבשפת ,Cקיימת המילה EnumבVisual Basic- Enumמאפשרת ליצור אוסף קבועים המאוגדים תחת שם אחד באופן הבא: [Public | Private] Enum name ]membername [= constantexpression ]membername [= constantexpression ... End Enum Publicאו Privateקובעים לאילו חלקי קוד בתוכנית ה Enum-יהיה מוכר nameהנו השם שבחרת לEnum- membernameהנו שם קבוע בתוך הEnum- constantexpressionהנו ערך קבוע שמוקצה עבור הmembername- אם לא מגדירים ערך קבוע עבור פריט בתוך Enumאז ערכו נקבע לפי הכלל הבא: oאם זהו הפריט הראשון ב Enum-ערכו יהיה 0 oעבור של פריט (שאינו הפריט הראשון) ערכו יהיה גדול ב 1-מערך נפריט הקודם לא ניתן לשנות את ערכו של פריט ב Enum-במהלך התוכנית לאחר שהוגדר ,Enumניתן להשתמש בו לשם הצהרת משתנים ,פרמטרים של פרוצדורות וערכים מוחזרים של פונקציות דוגמאות Public Enum AgeCategoriesConstants acChild acYoung acAdult acOld End Enum ב Enum-זה מוצהרים ארבעה קבועים ערכו של acChildהוא ,0של acYoungהוא 1וכן הלאה בהנחה שרוצים להשים את הקבוע acChildלמשתנה ,nAgeאפשר לבצע זאת בשתי צורות: nAge = acChild או nAge = AgeCategoriesConstants.acChild הצורה השניה נוחה כאשר יש התנגשות שמות עם קבוע אחר - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים ( USER-DEFINED TYPESסוגי נתונים מוגדרים על ידי המשתמש) ניתן ליצור סוגי נתונים מורכבים (כמו Structבשפת )Cבאמצעות המילה Type התחביר הוא כדלקמן: [Public | Private] Type varname elementname [(subscript)] As type elementname [(subscript)] As type ... End Type Publicאו Privateמגדירים את טווח ההכרה ( )Scopeשל הסוג החדש varnameהוא שם הסוג החדש שמוגדר על ידי Type elementnameהוא שם אלמנט בתוך הסוג החדש אלמנט יכול להיות גם מערך חד ממדי או רב ממדי ,ואז יש להשתמש ב subscript-כדי להגדיר את ממדיו כל אחד מהאנלמטים בתוך הסוג החדש צריך להיות מסוג ( )typeמוכר באותו שלב כדי לגשת לאלמט בתוך משתנה מהסוג החדש ,יש להשתמש בסימן ( .נקודה) דוגמאות Public Type Point x As Integer y As Integer End Type בשורות קוד אלו הוגדר סוג חדש בשם Pointשיש לו שני שדות x :וy- בשורות קוד אלו הוגדר סוג חדש בשם ,Rectangleובו שני שדות ptTopLeft :ו ptBottomRight-מסוג Point שהוגדר קודם Public Type Rectangle ptTopLeft As Point ptBottomRight As Point End Type Public Type Scribble ptArr(100) As Point End Type בדוגמה זו הוגדר סוג חדש בשם ( Scribbleשרבוט) המכיל מערך מסוג Pointבגודל 100 - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור : 7הרצה וניפוי שגיאות בשיעור זה: תכיר את אפשרויות ההרצה השונות תכיר את מרכיבי סביבת הפיתוח המאפשרים ניפוי שגיאות בVisual Basic- תבין מהם שלושת המצבים Run Time ,Design Tine :וBreak Mode- תכיר את האובייקט Debug תכיר את המשפט On Error...המיועד לטיפול בשגיאות חלונות תצוגה שונים לאבחון מתוך התפריט Viewישנן ארבע תצוגות מעניינות ,העשויות לסייע באבחון שגיאות בתוכנית: :Immediate Window oבנוסף לאפשרויות שהוזכרו בשיעור הקודם ,ניתן להעביר לחלון הImmediate- פלט מהאובייקט ( Debugנדון בהמשך שיעור זה) :Locals Window oמאפשר לצפות במשתנים מקומיים בפרוצדורה :Watch Window oמאפשר לצפות במשתנים שנוספו לחלון ה( Watch-נדון בהמשך) :Call Stack oמציג את מצב הקריאות לפרוצדורות במחסנית .חלון זה מציג את שרשרת הקריאות לפרוצדורות עד לנקודה מסוימת בתוכנית. שלושת המצבים של תוכנית :Design Timeשהו השלב שבו התוכנית נמצאת בעיצוב ,המילים אחרות ,השלב שבו אתה מניח פקדים על טפסים ,כותב קוד אך עדיין לא מבצע אותו קרוי Design Time :Run Timeזהו המצב שבו שורות הקוד שבתוכנית שלך מתחילות להתבצע :Break Modeשהו מצב שבו מושהית התוכנית (לא מפסקת כי אם מושהית) התפריט ( RUNהרצה) ב Visual Basic-קיימות מספר אפשרויות להרצה האפשרויות השונות כלולות בתפריט Run הפעלת אפשרות להרצה מעבירה את התוכנית למצב Run Time ( Startהתחל) Startהיא צורת ההרצה השכיחה ניתן להפעיל את Startבשלושה אופנים: oלבחור Startמהתפריט Run oללחוץ על הכפתור המתאים בסרגל הכלים oלהפעיל את צירוף המקשים Ctrl+F5 בעת הרצה עם Startלא מבוצע קימפול של התוכנית ( Start With Full Compileהתחל לאחר קימפול מלא) Start With Full Compileמבצע קימפול לפני ההרצה הרצה כזו מומלצת לשם גילוי שגיאות כבר בזמן הקימפול ,למשל משתנים שלא מוצהרים ניתן להפעיל אפשרות זו מתפריט Runאו על ידי צירוף המקשים Ctrl+F5 - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :7הרצה וניפוי שגיאות ( Breakעבור ל ) Break Mode - Breakמאפשר לבצע מעבר ממצב ריצה למצב Break אפשרות זו שימושית כשרוצים לעבור במצב מסוים לשלב Debug אפשר להפעיל את Breakבשלוש צורות: oבחירת Breakמהתפריט Run oבחירת הכפתור המתאים בסרגל הכלים oהפעלת צירוף המקשים Ctrl+Break האפשרות האחרונה (צירוף המקשים )Ctrl+Breakשימושית המיוחד כשנכנסים למצב שסרגלי הכלים והתפריטים לא נגישים :למשל בלולאות אינסופיות ,או כשאר מופיע Message Boxמודאלי ( Endסיים) Endמסיים את פעולת התוכנית ניתן להפעיל את Endמהתפריט Runאו מסרגל הכלים ( Restartהתחל מחדש) Restartמאפשר להפעיל מחדש את התוכנית ניתן לבחור ב Restartמהתפריט Runאו להפעיל את צירף המקשים Shift+F5 התפריט ( DEBUGניפוי שגיאות) התפריט Debugמאפשר לבצע כמעט כל דבר אפשרי בזמן ריצת התוכנית לשם ביצוע אבחון של התוכנית אפשרויות ה Debug-כלולות תחת תפריט Debug ( Step Intoצעד לתוך) אפשרות זו יכולה לפעול במספר צורות: oאם התוכנית נמצאת ב ,Design Time-התוכנית תתחיל לרוץ ותעבור מיד למצב של Break Modeכאשר יש שליטה על כל צעד וצעד בתוכנית oאם התוכנית עומדת להפעיל פרוצדורה הכתובה בתוכנית ,תתבצע כניסה לתוך הפרוצדורה ניתן להפעיל אפשרות זו מהתפריט Debugאו באמצעות [F8 ( Step Overצעד מעבר) אפשרות זו פועלת כמו Step Intoאלה שבמקרה שהתוכנית קוראת לפרוצדורה ,לא תתבצע כניסה לתוך לפרוצדורה ניתן להפעיל אפשרות זו מתוך התפריט Debugאו על ידי הצירוף Shift+F8 ( Step Outצא החוצה) מצבע יציאה מפרוצדורה פנימית לחיצונית ניתן להפעיל אפשרות זו מתוך התפריט Debugאו על ידי Ctrl+Shift+F8 ( Run To Cursorהרץ עד הסמן) אפשרות זו מריצה את התוכנית עד אשר שורת הביצוע מגיעה למיקומו של הסמן ואז התוכנית עוברת לBreak - Mode ניתן להפעיל אפשרות זו מתוך התפריט Debugאו באמצעות הצירוף Ctrl+F8 - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים ( Add Watchהוספת תצפית) באמצעות Watchאפשר לעקוב אחר ערכו של משתנה במהלך ריצת התוכנית ניתן להוסיף Watchמהתפריט Debug הבחירה ב Add Watch-פותחת את התיבה Add Watchהמוצגת להלן: ב Expression-רושמים את הביטוי שאחריו רוצים לעקוב Module ,Procedureו Project-מגדירים את מיקומו של הביטוי מבין כל הפרוייקטים המודולים והפרוצדורות שנמצאים בעריכה Watch Typeמגדיר את הפעולה שברצוננו לבצע: :Watch Expression oמציג את ערכו של הביטוי בכל נקודת זמן בתוכנית (אם הביטוי אינו קיים באותו שלב ,תוצג לידו ההודעה )Out Of Context :Break When Value Is True oמעביר את התוכנית ל Break Mode-ברגע שהביטוי הוא True :Break When Value Changes oמעביר את התוכנית ל Break Mode-כאשר ערך הביטוי משתנה ( Edit Watchערוך תצפ ית) מאפשר לשנות הגדרות Watch תיבת הדו שיח הנפתחת דומה מאוד לזו של ,Add Watchאלא שגם קיימת האפשרות למחוק Watch כדי להפעיל אפשרות זו יש לבחור אותה מהתפריט Debugאו להפעיל את צירוף המקשים Ctrl+W ( Quick Watchתצפית מהירה) אפשרות זו מאפשרת לבצע תצפית מיידית על ערכו של משתנה כדי להפעיל אפשרות זו יש: oלבחור ביטוי בחלון הקוד oלהפעיל את האפשרות מהתפריט Debugאו על ידי צירוף המקשים Shift+F9 - 13אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :7הרצה וניפוי שגיאות החלון הנפתח בתגובה הוא: :Contextמתאר את מיקום הביטוי בתוך מרחב העבודה של ,Visual Basicכלומר את הנתיב לפרוצדורה שבא ממוקם הביטוי הנבחן (שם פרוייקט ,שם מודול ,שם פרוצדורה וכו') :Expressionזהו הביטוי הנצפה :Valueזהו ערכו של המשתנה .אם המשתנה לא קיים באותו רגע ,תוצג ההודעה Out of context ( Toggle Breakpointהפוך מצב של נקודת עצירה) Breakpointהיא נקודת עצירה הממוקמת במשפט מסוים בתוכנית תוכנית רצה עוברת ל Break Mode-בעת הגיעה לBreakpoint- לחצן זה הוא דו מצבי ,כלומר מוסיף או מנקה Breakpoint Breakpointמוצג באמצעות נקודה אדומה בחלון הקוד כדי להוסיף או להסיר Breakpointיש לבחור את האפשרות מהתפריט ,Debugאו מסרגל הכלים או על ידי המקש ,F9או לחיצה על העיגול האדום במסמל Breakpointבחלון הקוד ( Clear All Breakpoi ntsהסר את כל נקודות העצירה) אפשרות זו מסירה את כל נקודת העצירה שמוקמו בקוד ניתן להפעיל אפשרות זו מהתפריט Debugאו על ידי הצירוף Ctrl+Shift+F9 ( Set Next Statementקבע את המשפט הבא לביצוע) Next Statementהנו הביטוי הבא שאמור להתבצע לאחר הביטוי הנוכחי במצב ,Break Modeהביטוי הבא לביצוע מוצג באמצעות חץ צהוב בעת הרצה ב Break Mode-ניתן לשנות את הביטוי הבא שיבוצע בשתי צורות: oיש להציב את הסמן במשט שאליו נרצה שהתוכנית תעבור בשלב הבא ,ואז יש לבחור באפשרות Set Next Statementמתוך התפריט Debugאו להפעיל את הצירוף Ctrl + F9 oניתן לגרור את החץ הצהוב את השורה שרוצים שתהפוך למשפט הבא לביצוע יש לשים לב כי המשפט הבא לביצוע חייב להיות באותה הפרוצדורה ( Show Next St atementהצג את המשפט הבא לביצוע) אפשרות זו מעבירה את סמן הטקסט אל המשפט הבא לביצוע ניתן לבחור באפשרות זו מתוך התפריט Debug - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים האובייקט DEBUG האובייקט Debugהוא אובייקט של סביבת Visual Basic לאובייקט Debugיש שתי מתודות: oהמתודה Printמוציאה פלט לחלון הImmediate- oהמתודה Assertבוחנת ביטוי בוליאני ,ואם הוא Falseעוצרת את מהלך התוכנית באותה הנקודה כל הפעולות המבוצעות בעזרת האובייקט Debugמתקמפלות רק בשלב הפיתוח ,כאשר יוצרים את קובץ הריצה באמצעות הפריט Makeמהתפריט ,Fileקטעי הקוד הקוראים לאובייקט Debugלא מתקמפלים דוגמה 1 נניח כי אנו רוצים לכתוב פונקציה בשם SumUpToהמקבלת מספר אי שלילי שלם ומחשבת את סכום כל המספרים מ 0-עד לאותו מספר (כולל) נוכל לוודא שהמספר שהועבר הוא אי שלילי באמצעות Debug.Assert נוכל להדפיס נתונים לחלון ה Immediate-באמצעות Debug.Print Public Function SumUpTo(ByVal n As Integer) As Integer Dim res As Integer _ & " Debug.Print "The input for SumUpTo is : Trim(Str(n)) ' Print to the immediate Debug.Assert n >= 0 ' Allow only non-negative arguments res = 0 Do While n > 0 res = res + n n = n - 1 Loop SumUpTo = res End Function הרצת קוד זה גורמת להדפסת הערך המועבר לפונקציה לחלון הImmediate- אם מועבר ערך שלילי ,ההרצה מושהית על ידי המשפט ,Debug.Assertבמקרה כזה נוכל להיעזר בCall Stack- כדי לדעת מאיזו פרוצדורה התבצעה קריאה לפונקציה זו כאמור ,קטעי הקוד הללו מקומפלים ורצים רק בשלב הפיתוח ולא במוצר המוגמר טיפול בשגיאות בקוד התוכנית אובייקטים של Visual Basicמטפלים בשגיאות בסגנון הException Handling- פונקציות המיובאות מ DLL-רגילים מחזירים ערך המצביע בדרך כלל על הצלחה או כשלון של הקיאה כשאר מפעילים פונקציות מ DLL-רגילים (שים לב שהכוונה ל DLL-שונים מאלו שתלמד לבנות בשיעורים אודות )ActiveXבודקים את הערך המוחזר כדי לזהות שגיאה כאשר מפעילים קוד סטנדרטי של Visual Basicיש ללכוד חריגים באמצעות המשפט On Error שים לב ,חריג שלא טופל יגרום לקריסת התוכנית אצל המשתמש ,לפיכך יש לטפל בכל בחריגים האפשריים - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :7הרצה וניפוי שגיאות האובייקט Err בזמן התרחשות שגיאה ,הנתונים אודות השגיאה מאוחסנים באובייקט Err בזמן לכידת שגיאה יש לבחון את האובייקט Err האובייקט Debugמאפשר להעביר שגיאה החוצה לקוד הקורה לפונקציה המאפיינים והמתודות של האובייקט Errהם: :Number oמספר השגיאה שהתרחשה :Description oתיאור מילולי של השגיאה :Source oזוהי מחרוזת המכילה את המקור לשגיאה שהתרחשה ,למשל שם המחלקה שיצרה את השגיאה (הנושא מחלקות נלמד בהמשך הקורס) :LastDLLError oמחזיר את קוד השגיאה האחרון שנוצר ב( DLL-רגיל) שהתבצעה אליו קריאה .ערך זה המצוי ב LastDLLError-שקול לקריאה GetLastErrorמתוך Windows API :HelpFile oמכיל את הנתיב לקובץ עזרה הקשור לשגיאה שהתאלשה :HelpContext oמכיל את זיהוי הנושא בקובץ העזרה :Clear oמתודה זו מנקה את האובייקט .Errמומלץ לבצע זאת לאחר ששגיאה טופלה :Raise oמתודה זו מאפשרת לעורר שגיאה .משתמשים במתודה זו בעיקר בתכנות רכיבים חדשים (הנושא נדון בשיעורים אודות )ActiveX On Error... המשפט On Errorבא בשלושה טעמים: On Error GoTo line o On Error Resume Next o On Error GoTo 0 o On Error GoTo line משפט זה מעביר את הביצוע לשורה המצוינת במילה lineכאשר שגיאה מתרחשת כדי לציין שורה יש להשתמש ב Labels-או במספרי שורות oכדי לציין Labelיש לרשום שם חוקי עם נקודתיים בתחילת שורה oניתן להשתמש במספרי שורות בקוד ,Visual Basicאך זוהי שיטה ישנה המתאימה לימי הביניים .בכל אופן ,מספר חייב להופיע בתחילת השורה חשוב למקם משפט יציאה מהפרוצדורה Exit Sub :או Exit Functionלפני קוד הטיפול בשגיאות ,על מנת שהוא לא יתבצע כאשר הקוד בוצע בהצלחה דוגמה 2 Public Function Div(ByVal Num1 As Double, ByVal Num2 As Double) As Double On Error GoTo Err_Handler Div = Num1 / Num2 Exit Function Err_Handler: MsgBox "The following error occured: " & Err.Description End Function פונקציה זו מחלקת שני מספרים אם תתרחש שגיאה (למשל שגיאת חלוקה ב )0-תועבר השליטה לקוד שאחרי התווית Err_Handler קוד הטיפול פשוט מציג הודעה עם תיאור השגיאה שהתרחשה - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים שים לב שלפני התווית יש יציאה מפונקציה ,כדי למנוע את ביצוע הקוד אם לא התרחשה שגיאה אין צורך לקרוא למתודה ,Err.Clearכיוון שהאובייקט Errמתנקה אוטומטית בעת יציאה מפונקציה On Error Resume Next משפט זה מעביר את הקוד לביצוע לשורה הבאה שלאחר השגיאה On Error GoTo 0 משפט זה מכבה ( )Turn Offטיפול בשגיאות שהוגדר ,כלומר אם התבצעה קריאה ל On Error GoTo line-או ל On Error Resume Next-הם יבוטלו טוב להשתמש במשפט זה אם רוצים לטפל באופן שונה בשגיאות המתרחשות במקומות שונים בקוד המשפט Resume המשפט Resumeמאפשר להמשיך את ביצוע התוכנית בשורה מסוימת לאחר טיפול בשגיאה שהתרחשה קיימות שלוש אפשרויות: :Resume oמחזיר את הביצוע לשורה ממנה התרחשה השגיאה Resume Next oמעביר את הביצוע לשורה שאחרי השורה שבה התרחשה השגיאה :Resume line oמעביר את הביצוע לשורה המצוינת על ידי תווית או מספר שורה (כמובן שהשורה חייבת להיות באותה פרוצדורה) לאחר קריאה ל Resume-האובייקט Errמתנקה אוטומטית דוגמה 1 _ Public Function Div(ByVal Num1 As Double, ByVal Num2 As Double) As Double On Error GoTo Err_Handler Div = Num1 / Num2 Debug.Print Err.Number, Err.Description Exit Function Err_Handler: Num2 = 1# Resume End Function דוגמה זו זהה לקודמת ,אלא שכאן בקוד הטיפול משנים את ערכו של Num2ל 1-ומחזירים את הביצוע לשורה שיצרה את השגיאה ,כך נמנעים מחלוקה ב0- הפו נקציה Error הפונקציה Errorמאפשרת לקבל תיאור של שגיאה לפי המספר שלה - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור : 1מבוא לתכנות מבוסס רכיבים Componentware Development בשיעור זה: תבין את ההבדלים בין ( Procedural Programmingתכנות פרוצדורלי) לבין Object Oriented Programming (תכנות מונחה עצמים )OOP תבין מהו ( Event Oriented Programmingתכנות מונחה אירועים) תבין את עקרונות COM תבין מהם ( COM Interfacesממשקי ,)COMואת הצורך בהם תלמד אודות התמיכה של Visual Basicבתכנות מונחה עצמים ,תכנות מונחה אירועים ותכנות רכיבים תהיה מוכן להרטיב את הרגליים בשיעור הבא העוסק בתכנות מונחה עצמים בVisual Basic- תכנות פרוצדורלי לעומת תכנות מונחה עצמים מבדילים בין שני סוגים עיקריים של שפות תכנות: Procedural Languages Object Oriented Programming Languages Procedural Prog ramming מרכז העצבים בתכנות פרוצדורלי הנם הפונקציות והרוטינות הגדרה של סוגי נתונים חדשים בתכנות פרוצדורלי אפשרית ,אך במקביל יש לכתוב פרוצדורות המסוגלות לטפל בסוגים החדשים סוג נתונים מוגדרים על ידי המשתמש יכולים להכיל בתוכם משתנים מכל הסוגים המוכרים עד לנקודה בה הם הוגדרו סוגי נתונים מוגדרים על ידי המשתמש אינם יכולים להכיל בתוכם פונקציות בתכנות פרוצדורלי ,המשתנים והפרוצדורות חיים בנפרד בדרך כלל משתמשים ב( Modular Programming-תכנות מודולרי) כדי ליצור איזושהי רמה של הסתרת מידע. Modular Programmingמשמעותו היא שהקוד מרוכז במודולי קוד (המקבילים למודולים סטנדרטיים בVisual - ,)Basicובאופן זה ניתן להסתיר משתנים מסוימים שאין צורך שייראו מחוץ למודול .מודול הנו קובץ בודד של קוד. דוגמה נמחיש את ההיבטים הללו של תכנות פרוצדורלי באמצעות יישום פשוט בשפת Cוב Visual Basic-תוך שימוש במגבלות התכנות הפרוצדורלי נכתוב תוכנית המנהלת רשימה של 20עובדים ומאפשרת את הפונקציונליות הבאה: oהוספת רשומת עובד (עד 20עובדים ,כאמור) oהדפסת פרטי העובדים הגדרת סוג הנתונים: בשלב הראשון נגדיר סוג נתונים חדש בשם Workerשיכיל את השדות Address ,Name ,IDוPhone- בשפת Cהיינו מגדירים זאת כך: >#include <stddef.h >#include <tchar.h 20 100 #define SIZE_NAME #define SIZE_ADDRESS - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Componentware Development מבוא לתכנות מבוסס רכיבים:1 שיעור #define SIZE_PHONE 20 typedef struct tagWorker { long ID; TCHAR Name[SIZE_NAME]; TCHAR Address[SIZE_ADDRESS]; TCHAR Phone[SIZE_PHONE]; } Worker; : נוכל להשתמש בהגדרה הבאהVisual Basic-ב Public Const SIZE_NAME As Integer = 20 Public Const SIZE_ADDRESS As Integer = 100 Public Const SIZE_PHONE As Integer = 20 Public Type Worker ID As Long Name As String * SIZE_NAME Address As String * SIZE_ADDRESS Phone As String * SIZE_PHONE End Type : כתיבת פרוצדורות.1 Worker בשלב השני נרצה לכתוב פונקציה המזינה נתונים לרשומה מסוג : היינו כותבים זאת כךC בשפת void SetWorkerData(Worker *pWorker, long id, _TCHAR *name, _TCHAR *address, _TCHAR *phone) { pWorker->ID = id; _tcsncpy(pWorker->Name, name, sizeof(pWorker->Name)); _tcsncpy(pWorker->Address, address, sizeof(pWorker->Address)); _tcsncpy(pWorker->Phone, phone, sizeof(pWorker->Phone)); } : ניתן לרשום רוטינה דומה באופן הבאVisual Basic-ב Public Sub SetWorkerData(ByRef pWorker As Worker, _ ByVal nID As Long, _ ByRef strName As String, _ ByRef strAddress As String, _ ByRef strPhone As String) pWorker.ID = nID pWorker.Name = strName pWorker.Address = strAddress pWorker.Phone = strPhone End Sub - 12 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים לבסוף נכתוב פונקציה המדפיסה את מערך העובדים בשפת Cאפשר לכתוב אותה באופן הבא: void PrintWorkerData(FILE *out, Worker *pWorker, )size_t nWorkers { ;size_t i )for(i = 0; i < nWorkers; i++ { _ftprintf(out, "_T("ID: %ld\n ""Name: %s\n ""Address: %s\n "Phone: %s\n\n"), (pWorker + i)->ID, (pWorker + i)->Name, (pWorker + i)->Address, ;)(pWorker + i)->Phone } } וב Visual Basic-הרוטינה הבאה תהיה טובה מספיק: _ Public Sub PrintWorkerData(ByRef out As TextBox, _ ByRef pWorker() As Worker, )ByVal nWorkers As Integer Dim i As Integer For i = 0 To nWorkers - 1 _ & out.Text = out.Text _ & "ID: " & Str(pWorker(i).ID) & vbCrLf _ & "Name: " & pWorker(i).Name & vbCrLf _ & "Address: " & pWorker(i).Address & vbCrLf "Phone: " & pWorker(i).Phone & vbCrLf & vbCrLf Next End Sub .1כתיבת תוכנית דוגמה: ניתן להמשיך ולכתוב תוכנית המדגימה את השימוש בסוג הנתונים החדש ,אך את זאת אני משאיר לך כתרגיל .בכל מקרה תוכל למצוא את תוכניות הדוגמה (ב C-וב )Visual Basic-בדיסק. מסקנה מעיון בקוד הדוגמה ,קל להבחין שישנה הפרדה בין הפרוצדורות לבין הנתונים כדי להפעיל פונקציה על משתנה מסוג Workerיש להעביר אותו כפרמטר לפונקציה היה יותר נוח לו יכולנו לרשום: )pWorker(i).SetData(.... בדיוק כפי שאנו רושמים כשאנחנו קוראים למשל למתודה Showשל ,Formאך זה כבר עניין לOOP- - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1מבוא לתכנות מבוסס רכיבים Componentware Development Object Oriented Programming בתכנות מונחה עצמים מגדירים סוגי נתונים חדשים באמצעות ( Classמחלקה) ולא באמצעות ( Typeאו Struct בשפת )C במחלקות אורזים יחד משתנים ופרוצדורות .באופן כזה יוצרים יחידה לוגית אחת הכוללת משתנים ומתודות הפועלות על המשתנים הללו משתנים של מחלקה קרויים ,member variablesומתודות של מחלקה קרויות member methods אובייקטים הם מופעים ( )Instancesשל מחלקות .כלומר משתנים המוצהרים בתוכנית מסוג מחלקה מסוימת הנם אובייקטים של המחלקה כאשר יש להפעיל מתודה של אובייקט ,אין צורך להעביר את האובייקט למתודה (כפי שראינו בדוגמה הקודמת). המתודה היא חלק פנימי של האובייקט כך שהפעלת המתודה נעשית באמצעות האובייקט עצמו בתכנות מונחה עצמים קיימים שלושה רעיונות מרכזיים: ( Encapsulation oכמיסה) ( Inheritance oהורשה) ( Polymorphism oרב צורתיות) ( Encapsulationכמיסה) כמיסה היא היכולת של מחלקה להסתיר membersמסוימים ,ולחשוף אחרים ה members-החשופים של מחלקה קרויים ה( Interface-ממשק) של המחלקה רעיון הכמיסה הנו רעיון מרכזי ב OOP-כיוון שבעזרת כמיסה ניתן למנוע מקוד לא מורשה לגשת לmembers- פרטיים באובייקט .כך לדוגמה ,לא תרצה שיוזן מספר זיהוי שאינו חוקי ל member-של אובייקט המאחסן מספר תעודת זיהוי .כיוון שכך ,מומלץ להפוך את כל ה member variables-של מחלקה לפרטיים (עד כמה שהדבר ניתן), ובמקביל ,לאפשר גישה אליהם באמצעות member methodsשייכתבו כך שלא יפרו את כללי הארגון (אלא אם אתה חתרן בלתי נלאה) מחלקה המעונינת להסתיר membersאך במקביל לאפשר גישה ל members-הללו למחלקות ספציפיות תוכלנה לעשות זאת על ידי הגדרת המחלקות הללו כ( Friends-כך נעשה הדבר בשפת )C++ ב Visual Basic-הרעיון בבסיסו דומה ,אך קיים שוני מסוים :ב Visual Basic-הגדרת membersכFiends- הופכת אותם לציבוריים עבור כל הקוד שבפרוייקט (מחלקות ומודולים רגילים) ,אך לא נגישים לקוד מפרוייקטים אחרים Friendsפוגעים ברעיון הכמיסה ,ולפיכך מומלץ שלא להשתמש בהם אלא במקרים מיוחדים מאוד ( Inheritanceהורשה) הורשה היא היכולת של מחלקה לרשת תכונות ממחלקה אחרת המחלקה היורשת קרויה מחלקה נגזרת ( ,)Subclassוהמחלקה המורישה קרויה מחלקת בסיס ()Superclass הורשה מתבטאת בשני היבטים: oהורשת ממשק oהורשת מימוש הורשת ממשק מתבטאת בהורשת שמות המאפיינים והמתודות ממחלקת הבסיס למחלקה הנגזרת הורשת מימוש מתבטאת שהורשת מימוש המתודות והמאפיינים ממחלקת הבסיס למחלקה הנגזרת הורשה הנה המפתח לשימוש חוזר בקוד – שפות מונחות עצמים מחויבות לתמוך שהורשה (ממשק ומימוש) השימוש בהורשה צריך להתבצע בעת זיהוי יחסי אב-בן בין מחלקות .ניתן להיעזר בתבנית ClassXהוא סוג של ClassYכדי לזהות יחסי הורשה ,כאשר ClassXהיא המחלקה הנגזרת ו ClassY-היא מחלקת הבסיס .לדוגמה: oדוגמה נכונה :מלבן הוא צורה oדוגמה נכונה :מנהל הוא סוג של עובד oדוגמה לא נכונה :מכונית היא ארבע דלתות ,מנוע ,שלדה... נכון להגיד :מכונית מכילה ארבע דלתות ,מנוע ,שלדה... - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים צריך להיזהר שלא ליפול למלכודת הטמונה בבלבול שבין יחסי הורשה ( )Inheritanceלבין יחסי הכלה ()Containment ( Multiple Inheritanceהורשה מרובה) היא היכולת לרשת ממספר מחלקות בו זמנית שפות מונחות עצמים תומכות בהורשה מרובה במידה כזו או אחרת C++ .למשל מאפשר הורשה מרובה מלאה, Javaמאפשרת הורשה מלאה ממחלקה אחת והורשה של ממשקים נוספים Visual Basic .מאפשרת מימוש ממשקים בלבד (חיה מוזרה שדומה להורשת ממשקים) דוגמאות להורשה מרובה: oדוגמה נכונה :רכב אמפיבי הוא רכב יבשתי וגם רכב ימי oדוגמה לא נכונה ComboBox :הוא גם TextBoxוהוא גם ListBox נכון יהיה להגיד ComboBox :מכיל בתוכו TextBoxוListBox- ( Ploymorphismרב צורתיות) Polymorphismהוא היכולת של אובייקט ללבוש צורות שונות ,או במילים אחרות לתפעל את אותו member באופנים שונים Polymorphismנובע מהשימוש בהורשה קל יותר להבין מהו Polymorphismבאמצעות דוגמה: נניח שברצוננו ליצור תוכנית גרפית פשוטה המאפשרת ציור של שלוש צורות( Line :קו)( Rectangle ,מלבן) ו( Ellipse-אליפסה) .ברור שנרצה לאחסן את הצורות באמצעות מבנה נתונים מסוים .הבעיה הראשונה שתתעורר היא שלא נוכל להשתמש במבנה נתונים הכולל מצביעים מסוג -Lineים ,למשל ,לאחסון -Rectangleים או -Ellipseות .כדי לפתור בעיה זו נגדיר את כל המחלקות הללו כנגזרות של מחלקה מופשטת בשם .Shapeהיררכית המחלקות תיראה ,אם כן ,כמו בציור הבא (כאשר החץ משמעותו "יורש מ:)"... Shape Ellipse Rectangle Line את הבעיה הראשונה פתרנו ,כיוון שבשפות מונחות עצמים מצביע למחלקת בסיס (במקרה זה )Shapeיכול להצביע לסוגים נגזרים (במקרה זה Rectangle ,Lineו .)Ellipse-כלומר סוג המצביע במבנה הנתונים יהיה מסוג .Shape הבעיה השניה שמתעוררת היא ,כיצד נבצע סריקה על כל האובייקטים במבנה הנתונים לצורך ביצוע פעולה כלשהי (למשל ציור על המסך) ,הבעיה נובעת מכך שבפועל כל תא במבנה מצביע לסוג נתונים לא ידוע (Rectangle ,Line או .)Ellipseבעיה זו אינה בעיה כלל ועיקר ,כיוון שנוכל להשתמש במצביע מחלקת בסיס כדי לבצע סריקה במבנה הנתונים ובאמצעות מצביע זה נפעיל את המתודה הרצויה .השאלה הנשאלת כעת היא איזו מתודה בדיוק תופעל, האם זו של המחלקה Shapeממנה מוגדרים המצביעים במבנה הנתונים ,או אולי המתודה של האובייקט המוצבע בפועל ,כאשר זה יכול להיות שונה בין תא לתא במבנה הנתונים .התשובה היא שתופעל המתודה של סוג הנתונים המוצבע בפועל ולא המתודה של סוג המצביע .זהו Polymorphismבמיטבו. כדי להשלים את התמונה ,ובכדי להפוך את העניין למוחשי יותר ,נגדיר מתודות המשותפות לכל הצורות כחלק מהממשק של .Shapeמתודות לדוגמה יהיו .Move ,Paintמתודות אלו עוברות בירושה לכל אחת מהמחלקות הנגזרות (כלומר Rectangle ,Lineו )Ellipse-ומקבלות בכל מחלקה משמעות שונה .כך למשל Paint ,עבור Line פירושו שימוש בפונקציות מערכת היודעות לצייר קווים על גבי המסך Paint .עבור Rectangleימומש באמצעות קריאה לפונקציה מערכת המתמחה בציור מלבנים .היררכית המחלקות אם כן תיראה כך: - 13אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1מבוא לתכנות מבוסס רכיבים Componentware Development Shape )(Paint )(Move ... Rectangle Ellipse )(Paint { )(Paint { מימוש המתאים לציור מלבן מימוש המתאים לציור אליפסה } )(Move { מימוש המתאים להזזת אליפסה Line )(Paint { מימוש המתאים לציור קו } )(Move { מימוש המתאים להזזת מלבן { ... } )(Move { מימוש המתאים להזזת לקו { ... { ... כעת נניח שברשותנו מערך של -Shapeים שכל תא בו מצביע על צורה מסוג כלשהו: Shape Line ][0 Rectangle ][1 Line ][2 Ellipse ][3 Rectangle ][4 Ellipse ][5 כעת נוכל להצהיר על משתנה מסוג Shapeולבצע סריקה על המערך .מתוך המצביע הזה נפיל את המתודה .Print מה שיופעל למעשה אלו הן המתודות של האובייקטים המוצבעים ,ובאופן יותר ספציפי עבור האיבר עם האינדקס ] ,[0תופעל המתודה Paintשל ,Lineעבור האיבר עם האינדקס ] [1תופעל המתודה Printשל ,Rectangleוכן הלאה. ( EVENT ORIENTED PROGRAMMINGתכנות מונחה אירועים) בתוכנות מונחה אירועים זרימת התוכנית מונחית על פי האירועים המתרחשים ב Visual Basic-למשל ,מוכרים לך האירועים Click,MouseDownוכו' .קוד הנכתב הפרוצדורות האירועים הללו יופעל בתגובה לאירועי המשתמש. לכל אירוע יש שני צדדים :הצד המעורר את האירוע והצד המגיב לאירוע .לדוגמה האירוע MouseMoveצדו האחד היא מערכת ההפעלה היוזמת את האירוע בתגובה לתזוזת כבר מצד המשתמש ,והצד השני היא התוכנית שלך המגיבה לאירוע. אירועים אינם קשורים בהכרח לפעולות משתמש ,למשל האירוע DataArrivalשל פקד Winsockמתרחש בכל פעם שמידע מגיע למחשב המקומי ממחשב אחר ברשת - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים )COM( COMPONENT OBJECT MODEL COMמאפשר להתמודד טוב יותר עם הבעיות והאתגרים הבאים: oפיתוח תוכניות מודולריות ברמה הבינרית: כתיבת רכיבי קוד בשפות שונות מעלה בעיות של תאימות בינרית בין רכיבי הקוד לעתים יש רצון וצורך לשפר פונקציונליות של תוכנה מסוימת .פעולה מהסוג הזה כרוכה בדרך כלל בהחלפת התוכנה כולה .לצורך ההדגמה ,נניח שברשותך מעבד תמלילים מדהים שבדיקת האיות שלו זוועתית .היה נחמד לו יכולת לרכוש רכיב בדיקת איות מחברה צד ג' ולשלב אותו כחלק אינטגרלי של מעבד התמלילים. oשימוש חוזר ברכיבים ותאימות גרסאות רכיבים: יישומי תוכנה בסדר גודל בינוני ומעלה הופכים קשים לפיתוח ולתחזוק .לעתים תכופות מוצאים עצמם מתכנתים משתמשים בפונקציונליות שפותחה זה מכבר עבור תוכנה אחרת .הבעיה העיקרית היא ,שמאוד מסוכן לשנות מחלקות ,או להוסיף פונקציונליות למחלקות בשל פגיעה לא צפויה במחלקות אחרות הנגזרות או משתמשות במחלקה הספציפית. oשקיפות בהפעלת רכיב שרת ללא קשר למיקומו ביחס לרכיב הלקוח: רכיבים הפועלים מול רכיבים אחרים ,מושפעים ממיקום הרכיב ביחס אליהם ,כלומר ,האם הרכיב מצוי באותו מרחב כתובות (אותו ,)Processאו במרחב כתובות שונה באותו מחשב ( Processשונה באותו מחשב) ,או אולי במחשב אחר ברחבי הרשת .ברור שפניה לרכיב המצוי במחשב אחר ברחבי הרשת שונה בתכלית מפניה לרכיב המצוי תחת אותו מרחב כתובות ,שכן פניה לרכיב ברשת כרוכה בהעברת מסרים בפרוטוקולים שונים ומשונים וכו' .היית מאושר לו יכולת להפעיל רכיב מרוחק בדיוק באותו האופן בו אתה מפעיל רכיב מקומי וכל משימת ההתקשרות דרך הרשת ,או חציית מרחבי כתובות הייתה נופלת על כתפי מישהו אחר (ביל גייטס ,למשל). COMמגדיר תקנים לפיתוח רכיבים :באמצעות ממשקים סטנדרטיים שרכיבי COMאמורים לתמוך בהם .אפשר להגיד ש COM-הוא הדבק שבין רכיבים כתיבת רכיבים בהתאם ל ספציפיקצית COMמאפשרת שימוש חוזר ברמה בינרית ,ללא תלות בשפות שבהם נכתבו הרכיבים .היתרון הנובע מכך הוא שניתן לפתח רכיב בשפה מסוימת המתאימה ביותר לפיתוח אותו רכיב ואז אפשר יהיה להשתמש בו בשפות שונות התמיכה הקיימת במערכת ההפעלה עבור COMמאפשרת לבצע את ההתחברות בין רכיבים .כדי להבהיר את העניין המעורפל הזה אשתמש באנלוגיה ובסוגריים ארשום את ההקבלה: נניח שישנם שלושה אנשים איש א' (רכיב א) ,איש קשר (מערכת COMהבנויה כחלק אינטגרלי ממערכת ההפעלה) ואיש ב' (רכיב ב) .בין איש א'(רכיב א') לאיש ב' (רכיב ב') נמצא קיר ,כך שאף אחד מהם לא יודע האם השני קיים או לא .כדי לברר זאת שואל איש א' (רכיב א') את איש הקשר (מערכת )COMהאם איש ב' (רכיב ב') נמצא והאם הוא יודע לדבר בשפה שלנו ( )COMהתשובה תהיה חיובית (נניח שהיא חיובית) ובשלב זה יקשר איש הקשר (מערכת )COMבין איש א' (רכיב א') לאיש ב' (רכיב ב') ויעזוב אותם לנפשם .מכאן והלאה איש א' (רכיב א') ואיש ב' (רכיב ב') ידברו בניהם – ימצאו או לא ימצאו עניין משותף ( )Interfaceזהו עניינם. רכיב מאפר גישה אליו על ידי חשיפת ממשק ( )Interfaceשדרכו יוכלו לקוחות להתחבר אליו .נניח למשל שאתה מעוניין לפתח רכיב לביצוע חישובים מתמטיים מסובכים ,וודאי תחשוף ממשק המאפשר ביצוע חישובים סטטיסטיים (יתכן שתקרה לו )IStatistics לקוחות של רכיבים מפרסמים בדרך כלל את הממשק לו הם מצפים בבואם להתקשר עם רכיב ,COMפרסום זה מטרתו היא לאפשר פיתוח רכיבים מתמחים על-ידי חברות שונות ובכך לאפשר תחרות "הרכיב הטוב ביותר" - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1מבוא לתכנות מבוסס רכיבים Componentware Development COMאוסר על מפתחי רכיבים לשנות ממשק שכבר פורסם והופץ למשתמשים .שינוי מסוג עלול לגרום לקריסתם של תוכניות לקוח שהשתמשו ברכיב בגרסאותיו הקודמות .אם הממשק שיצרת דורש שינוי ושיפור ,פשוט צור ממשק חדש שיכיל את הפונקציונליות הנדרשת ,והשאר את הממשק הקודם ללא שינוי .שים לב שלא אמרתי שאינך יכול לשנות את המימוש הפנימי של הרכיבים ,תוכל לעשות זאת כל אימת שתחפוץ בכך ,על כל פנים זכור שהרכיבים שלך מתקשרים באמצעות הממשקים שיצרת עבורם לכן היזהר לפני ביצוע שינויים כלשהם. רכבי COMיש משלושה סוגים עיקריים: ( In Process oתוך תהליכי) – רכיב COMהפועל החלק מתוכנית הלקוח (בתוך מרחב כתובות הזכרון של תוכנית הלקוח) ( Out of Process oחוץ תהליכי) – רכיב המופעל כתוכנית נפרדת ,וכתוצאה מכך מוקצים עבורו מרחב כתובות נפרד. ( Remote oמרוחק) – זהו רכיב COMהממוקם במחשב אחר ברחבי הרשת COMמשתדל להסתיר ממך את פרטי ההתקשרות עם הרכיב ,כך שפנייה לרכיב ברחבי הרשת תהיה זהה לפנייה לרכיב תוך תהליכי )DCOM( Distributed COMהיא טכנולוגיה המאפשרת הפעלת רכיבים מרוחקים ברחבי הרשת ,תוך הסתרת פרטי ActiveXזהי טכנולוגיה המבוססת על COM התמיכה של VISUAL BASICב OOP-וCOM- Visual Basicתומכת ב Encapsulation-ובPolymorphism- ,Visual Basicלמרבה הצער ,איננה תומכת בהורשה Visual Basicתומכת בהורשת ממשקים (יותר מדויק להגיד :מימוש ממשקים ,אך נושא זה יידון בפירוט בשיעור הבא) כיוון ש Visual Basic-אינה תומכת בהורשה ,לא יהיה נכון לקרוא לה שפה מונחית עצמים טהורה Visual Basicתומכת בתכנות מונחה אירועים .כלומר תוכל להגיב לאירועים ,כמו גם לכתוב אירועים משלך לרכיבים חדשים שאתה מפתח רכיבי ActiveXשל Visual Basic ב Visual Basic-תוכל ליצור רכיבי ActiveXמהסוגים הבאים: – ActiveX DLL oרכיב קוד היכול להכיל גם אלמנטים של ממשק – ActiveX EXE oתוכניות המאפשרות התקשרות אליהם באמצעות COM – ActiveX Controls oפקדים חדשים הנוצרים ומותאמים על-ידי המשתמש ב Visual Basic-יצירת הממשקים בהם תומך הרכיב נעשית באופן אוטומטי .עם זאת ,תוכל ליצור ממשקים ריקים (ללא מימוש) באמצעות )Interface Definition Language( IDLולממש אותם בשפות שונות Visual Basicמקילה באופן דרמטי את קלות פיתוח הרכיבים .בשפות אחרות ( C++למשל ,שלא לדבר על Cששם לא תמצא את הידיים ואת הרגליים) תמצא את עצמך מתעסק עם ממשקים לסידור נתונים לפני שליחה ,IMarshal רישום רכיבים לקבלת הודעות ( ,)IConnectionPointContaintersשלא לדבר על MTA Model ,STA Model Single Apartment Modelששם הבלבול הופך לצל שלך. תשמח לשמוע שרכיבים שאתה מפתח ב Visual Basic-נגישים מסביבות אחרות התומכות ב( ActiveX-למשל )MFC - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור : 1תכנות מונחה עצמים ב Visual Basic- בשיעור זה: תלמד כיצד ליצור מחלקות בVisual Basic- תלמד להוסיף ,פרוצדורות מכל הסוגים ( Properties ,Functions ,Subו )Events-למחלקות תלמד מהו ( Interfaceממשק) וכיצד ניתן לממש -Interfaceים בVisual Basic- תלמד את הצורות השונות בהן ניתן להשתמש באובייקטים בתוכנית תבין מהו Reference Counting תבין את ההבדל בין Early BindingלLate Binding- תלמד מהו ( Collectionאוסף) ,כיצד תוכל ליצור -Collectionים משלך וכיצד לסרוק Collection ( CLASSESמחלקות) ליצירת מחלקות ב Visual Basic-יש להשתמש בClass Module- Propertiesשל Class Modul e :Nameמגדיר את שם המחלקה :DataBindingBehaviorקובע האם האובייקט יכול להיכרך סביב נתונים (נושא זה נדון בהמשך הקורס) :DataSourceBehaviorקובע האם האובייקט יכול לשמש כמקור נתונים (גם נושא זה נדון בהמשך הקורס) Eventsשל Class Module :Initializeמתעורר בכל פעם שנוצר אובייקט חדש מסוג ה Class-שלך :Terminateמתעורר בכל פעם באובייקט מסוג ה Class-שלך משתחרר מהזיכרון הגדרת משתנים ב Class - ניתן להגדיר משתנים בתוך Class Moduleבדיוק כפי שמצהירים עליהם במודול רגיל הרשאות הגישה האפשריות עבור הצהרת משתנים: :Private oמשתנה פרטי :Public oמתשתנה ציבורי ברירת המחדל היא ,Privateכלומר הצהרה באמצעות Dimזהה להצהרה באמצעות Private מומלץ להסתיר את המשתנים באמצעות המילה Privateולאפשר גישה אליהם באמצעות Propertiesמתאימים בלבד .באופן כזה אתה שומר על עקרון ה Encapsulation-בתכנות מונחה עצמים הוספת פרוצדורות ל Class - הרשאות הגישה האפשריות עבור פרוצדורות של Classהן: :Private oהפרוצדורה היא לשימוש פנימי בלבד של הClass- :Public oהפרוצדורה נגישה מקוד חיצוני :Friend oהפרוצדורה נגישה מקוד חיצוני בתנאי שמדובר באותו פרוייקט .עבור תוכניות לקוח מפרויקטים אחרים ,פרוצדורת Friendתהיה בדיוק כמו Private בשיעור הבא תיצור ספריות רכיבים הניתנות לשימוש מתוכניות חיצוניות - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- ( Propertiesמאפיינים) Propertiesשל Classהם פרוצדורות שמטרתן לאתחל משתנים בתוך הClass- היתרון בשימוש במאפיינים Propertiesהוא בכך שניתן לאתחל משתנים באמצעות הסימן = (שווה) ולהפוך בכך את הקוד לקראי יותר Propertiesבאים בשלוש צורות: :Property Let oמאפשר העברת ערכים ל Class-לשם ביצוע פעולות אתחול למשתנים מסוגים בסיסיים :Property Set oמאפשר העברת אובייקטים ל Class-לשם ביצוע פעולות אתחול לאובייקטים פנימיים :Property Get oמאפשר לאחזר ערך מהמחלקה (כלומר לבצע השמה מהמחלקה למשתנה הנמצא בחוץ) בדוגמאות שבהמשך תראה את השימוש בProperties- ( Subרוטינות) ו( Functions-פונקציות) ניתן להוסיף ל Class-רוטינות ופונקציות בדיוק כפי שהיית מוסיף למודולי הקוד שהכרת עד כה ( Eventsאירועים) בדיוק כפי שקיימים Eventsל Labels ,CommandButton-ואובייקטים וויזואליים (וגם לא וויזואליים) ,תוכל גם אתה להוסיף Eventsל Class-שאתה יוצר כדי להוסיף Eventיש להצהיר עליו בחלק ב General-של הקוד ,כולל הפרמטרים שה Event-מקבל כדי לעורר ( Event )To Fireיש להשתמש במילה RaiseEvent תוכל להעביר פרמטרים ByRefולהשתמש בערך שלהם לאחר שהמשתמש ב Class-שלך סיים את הטיפול בהם, ובכך לאפשר למשתמש במחלקה להעביר מידע ל Classשלך אודות האופן שבו הוא רוצה שה Class-שלך יתנהג (בדוגמאות שבהמשך עניין זה יובהר) הצהרה על אובי יקטים מסוג המחלקה כדי להבחין בין משתנים מסוגים בסיסיים לבין משתנים מסוגים של מחלקות משתמשים במילה אובייקט כדי לתאר מופע ( )Instanceשל מחלקה כדי ליצור אובייקטים יש להשתמש במילה New כדי לשחרר אובייקט מהזיכרון (יותר מדויק יהיה להגיד להפחית את ה Reference Countingשלו ,אך נדון בכך בהמשך) משתמשים במילה Nothing ביצוע פעולות של השמת אובייקט מתבצעות באמצעות המילה Set עליך להבחין בין האובייקט עצמו (הנמצא בזיכרון) לבין המשתנה באמצעותו אתה ניגש לאובייקט .משתנה זה מאפשר לך להתייחס ( )Referenceלאובייקט אם לאובייקט מסוים יש אירועים ניתן להצהיר עליו תוך שימוש במילה WithEventsכדי להפוך את האירועים שלו לזמינים עבור הלקוח (עניין זה יובהר בדוגמאות שבהמשך) דוגמה 1 Dim prs As New CPerson בדוגמה זו הוצהר משתנה ייחוס בשם prsמהמחלקה CPersonואותחל באובייקט חדש בזכרות באמצעות המילה New דוגמה 2 Dim prs As CPerson Set prs = New CPerson שתי שורות קוד אלו זהות להצהרה בדוגמה הקודמת - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים קיימים הבדלים מהותיים באופן ההתנהגות של אובייקט המוצהר כמו בדוגמה 1לבין אובייקט המוצהר כמו בדוגמה ,1כפי שמפורט להלן: oאובייקט המוצהר כמו בדוגמה ,1אינו נוצר בפועל אלא רק כאשר אתה ניגש למאפיין או פונקציה שלו. אובייקט המוצהר כמו בדוגמה 2נוצר בעת הקריאה לNew- oאובייקט המוצהר כמו בדוגמה 1הוא אובייקט בטוח יותר ,כיוון שמובטח לך שאם תשחרר את האובייקט מהזיכרון באמצעות ( Nothingכפי שתראה בהמשך) ותנסה לגשת אליו שוב מבלי לקרוא ל- Newשוב Visual Basic ,תיצור את האובייקט עבורך .כך אתה נמנע משגיאות .לעומת זאת ,אם המהרת על אובייקט כמו בדוגמה 2ולא יצרת אותו בפועל באמצעות המילה Newאו ששחררת אותו ,ותנסה לגשת אליו תקבל Runtime Error oמההבדל הקודם נובע כי אובייקט המוצהר כמו בדוגמה 1ירוץ לאט יותר כיוון ש Visual Basic-מוודאת עבורך שהאובייקט קיים בכל פעם שאתה מנסה לגשת לפרוצדורה של האובייקט דוגמה 1 Dim WithEvents obj as CCalendar בדוגמה זו מוצהר אובייקט מסוג .CCalendarהאירועים שהמחלקה CCalendarחושפת יהיו זמינים עבור יישום הלקוח לא ניתן להשתמש במילה WithEventsיחד עם המילה Newבהצהרה .כלומר ,המילה WithEventsזמינה רק עבור הצהרות כמו בדוגמה 1 דוגמה 4 Dim rc1 As CRect, rc2 As CRect Set rc1 = New CRect Set rc2 = rc1 בדוגמה זו הוצהרו שני משתני ייחוס מסוג .CRectהראשון שבהם אותחל לאובייקט חדש מסוג ,CRectואילו השני אותחל כך שיתייחס לאותו אובייקט CRectש rc1-מתייחס אליו דוגמה 3 Set prs = Nothing פעולה זו מטרתה לשחרר את האובייקט ש prs-מתייחס אליו מהזיכרון (בסעיף הבא תראה שאין זה מדויק) ( Reference Countingספירת התיי חסו יות) כל ה-Class-ים של Visual Basicהם למעשי אובייקטים של COM לכל אובייקט COMיש משתנה פנימי הסופר את מספר ההתייחסויות ( )Reference Countאליו .בכל עת שמשתנה ייחוס נוסף מצביע לאובייקט ,מונה זה גדל ב ,1-ואילו כאשר משתנה מפסיק להתייחס לאובייקט (על ידי קריאה ל )Set...Nothing-מונה ההתייחסויות קטן ב1- אובייקט משתחרר מהזיכרון ברגע שה Reference Count-שלו מגיע ל0- ב COM-כל אובייקט ממש את ה Interface-ששמו .IUnknownזהו הממשק הבסיסי ביותר בCOM- IUnknownכולל שלוש מתודות: – QueryInterface oמתודה זו מאפשרת קבלת מצביע ל Interface-שהאובייקט ממש – AddRef oמתודה זו גורמת ל Reference Count-לגדול ב( 1-מתודה זו נקראת אוטומטית עבורך כאשר אתה מבצע השמה למשתנה ייחוס) – Release oמתודה זו מפחיתה את ה Reference Count-ב( 1-מתודה זו נקראת עבורך אוטומטית כאשר אתה מבטל התייחסות של משתנה לאובייקט מסוים) - 11אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- דוגמה 6 Dim rc1 As CRect, rc2 As CRect בשורה זו הצהרנו על שני משתני ייחוס לאובייקט מסוג CRect בשורה זו יוצרים אובייקט מסוג CRectבזיכרון וגורמים ל rc1-להתייחס אליו ה Reference Count-של האובייקט יהיה בשלב זה 1 בשורה זו גם משתנה הייחוס rc2מצביע לאותו אובייקט בזיכרון שנוצר בשורת הקוד הקודמת .לפיכך ה Reference Count-של האובייקט יגדל ב1- Set rc1 = New CRect Set rc2 = rc1 Set rc1 = Nothing בשורת קוד זו מבטלים את התייחסות המשתנה rc1לאובייקט בזיכרון ,לפיכך ה Reference Count-יקטן ב1- ויהיה שוב .1כיוון שה Reference Count-עדיין אינו 0האובייקט לא ישתחרר מהזיכרון Set rc2 = Nothing בשורת קוד זו מבטלים את התייחסות המשתנה rc1לאובייקט בזכרון ,לפיכך קטן ה Reference Count-ב.1- בשלב זה ה reference Count-מגיע ל 0-והאובייקט CRectשנותר בשורת הקוד השניה משוחרר מהזיכרון ומסיים את חייו. תרגיל – 1התוכנ ית ClassDemo בדוגמה זו ניצור מחלקה פשוטה באמצעותה נוכל לעקוב אחר אופן יצירת האובייקטים ושחרורם .1צור פרוייקט חדש מסוג Standard EXEושמור אותו: הקצה לפרוייקט את השם ClassDemoולטופס את השם frmClassDemo שמור את הפרוייקט .1הוסף Class Moduleלפרוייקט ושמור אותו: הוסף לפרוייקט Class Moduleתוך שימוש בתפריט Project הקצה ל Class-את השם CDemoעל ידי שינוי המאפיין Nameשל הClass- .3הוסף קוד ל:CDemo- Public val As Integer בחלון הקוד של CDemoבחר ב Class-מתוך התיבה ( Objectה Combo Box-השמאלי המופיע בראש חלון הקוד) ומתוך התיבה הימנית בחר בInitialize- הוסף את הקוד הבא: )(Private Sub Class_Initialize val = 0 "MsgBox "Object is now loaded into the memory End Sub קטע קוד זה מאתחל את המשתנה valברגע שנוצר אובייקט חדש ,וכמו כן מציג הודעה באמצעות Message Box בחר ב Terminate-והוסף את הקוד הבא: )(Private Sub Class_Terminate _ & "!MsgBox "Object is now unloaded from the memory _ & vbCrLf )"val = " & Str(val End Sub - 122אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 קטע קוד זה מציג הודעה בעת שהאובייקט נהרס :ים לטופס והגדר את המאפיינים הבאים-CommandButton הוסף אחד עשר.1 ערך Class Demo 3- Fixed Dialog 2-CenterScreen cmdSetValOfD1 Set val of d1 cmdGetValOfD1 Get val of d1 cmdReleaseD1 Release d1 cmdInitializeD2 Initialize d2 cmdSetValOfD2 Set val of d2 cmdGetValOfD2 Get val of d2 cmdReleaseD2 Release d2 cmdInitializeD3 Initialize d3 cmdSetValOfD3 Set val of d3 cmdGetValOfD3 Get val of d3 cmdReleaseD3 Release d3 מאפיין Caption BorderStyle StartUpPosition Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption אובייקט frmClassDemo Command1 Command2 Command3 Command4 Command5 Command6 Command7 Command8 Command9 Command10 Command11 :הטופס צריך להיראות כמו זה שבציור הבא - 121 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic- תכנות מונחה עצמים ב:1 שיעור : הוסף את קוד לטופס.1 Option Explicit Dim d1 As New CDemo Dim d2 As CDemo Dim d3 As CDemo CDemo בשורות הקוד הללו מוצהרים שלושה משתני ייחוס לאובייקטים מסוג ההצהרות מתבצעות בשתי הצורות שהוסברו קודם בהמשך (לאחר שנפעיל את התוכנית) תבין כיצד צורת ההצהרה משפיעה על אופן הפעולה של האובייקט Private Sub cmdGetValOfD1_Click() MsgBox "d1.val = " & Str(d1.val) End Sub Private Sub cmdGetValOfD2_Click() MsgBox "d2.val = " & Str(d2.val) End Sub Private Sub cmdGetValOfD3_Click() MsgBox "d3.val = " & Str(d3.val) End Sub Private Sub cmdInitializeD2_Click() Set d2 = New CDemo End Sub Private Sub cmdInitializeD3_Click() Set d3 = d2 End Sub Private Sub cmdReleaseD1_Click() Set d1 = Nothing End Sub Private Sub cmdReleaseD2_Click() Set d2 = Nothing End Sub Private Sub cmdReleaseD3_Click() Set d3 = Nothing End Sub Private Sub cmdSetValOfD1_Click() d1.val = 100 End Sub - 121 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים )(Private Sub cmdSetValOfD2_Click d2.val = 200 End Sub )(Private Sub cmdSetValOfD3_Click d3.val = 300 End Sub .1בחינת התוכנית: כעת לאחר שהתוכנית מוכנה נריץ אותה יחד שלב אחר שלב ונבחן את מה שמתרחש וגם את מה שלא מתרחש לחץ על הכפתור Startאו F5 שים לב ,הצהרנו על d1באמצעות ,Newולמרות זאת ,האירוע Initializeשל CDemoלא התרחש עדיין לחץ על Set val of d1או ,Get val of d1שים לב שהאירוע Initializeהתרחש כעת כיוון שניסית לגשת לאובייקט כעת לחץ על Release d1פעם אחת שים לב כי האובייקט התפרק ואתה מקבל Message Boxמהאירוע Terminateשל CDemo נסה ללחוץ שוב על ,Release d1שום דבר לא מתרחש כעת לחץ שוב על Set val of d1או ,Get val of d1שוב Visual Basicיוצרת עבורך אובייקט והאירוע Initializeמתעורר שוב מסקנה :הקוד הניגש ל d1-בטוח כיוון שמובטח שאם לא קיים אובייקט בזיכרון ,ייווצר אחד כזה .אך בתמורה לכך משלמים בביצועים מהירים פחות כעת נסה ללחוץ על .Set val of d2אתה אמור לקבל שגיאה כיוון שאין אובייקט שעליו מצביע d2 עצור את התוכנית והפעל אותה שוב לחץ על Initialize d2כעת נוצר אובייקט עבור d2והאירוע Initializeשלו מתרחש שים לב :למרות שעדיין לא ניגשת למאפייני האובייקט הוא נוצר הפעל את Set val of d2ולאחר מכן את ,Get val of d2אתה אמור לקבל את הערך 200 הפעל את .Initialize d3אם תעיין בקוד תבחין ש d3-מושווה ל ,d2-כלומר שניהם מצביעים כעת על אותו אובייקט לחץ על Get val of d3אתה אמור לקבל .200אכן זהו אותו אובייקט לחץ על Set val of d3ולאחר מכן ,Get val of d2תבחין בוודאי שהשתנה הערך ל ,300-וניתן לקבל אותו הן מ d2-והן מd3- כעת לחץ על ,Release d2שים לב שאירוע Terminateעדיין לא התרחש ,לראייה תוכל ללחוץ על Get val of d3ותראה כי האובייקט עדיין קיים בזיכרון .כלומר כעת ה Reference Count-של האובייקט הוא 1 לחץ על .Release d3ה Reference Count-של האובייקט יורד ל 0-וכתוצאה מכך האובייקט משתחרר מהזיכרון והאירוע Terminateשאתה מבחין בו מתרחש אם תנסה כעת לגשת לערך של האובייקט באמצעות d2או d3תקבל שגיאה כיוון שאן אובייקט בזיכרון כעת נבצע בדיקה אחרונה ,הפסק את פעולת התוכנית והרץ אותה שוב לחץ על ,Initialize d2הודעה בדבר האירוע Initializeצריכה להופיע .לחץ OK אנו יודעים כי כעת קיים בזכרון אובייקט ש d2-מתייחס אליו כעת לחץ שוב על ,Initialize d2שים לב ששוב ייוצר אובייקט אשר d2יהיה אמור להצביע עליו .לראיה אתה מקבל הודעה מאירוע Initializeשל CDemoאך השאלה היא מה קורה עם האובייקט ש d2-התייחס אליו קודם .לאובייקט זה הרי כבר אין מי שמתייחס ,כלומר ה Reference Count-שלו יורד ל ,0-לפיכך אתה מקבל הודעה בדבר פירוקו של האובייקט מהזיכרון - 123אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- אני ממליץ בפניך לבצע עוד מספר ניסויים כדי להבין כיצד נוצרים אובייקטים וכיצד הם מתפרקים .תוכל להשתמש גם בהרצה במצב Break Modeכדי לבחון את התוכנית Step By Step מסקנה :הקוד הניגש ל d2-ו d3-מהיר יותר ,כיוון שאין בדיקה לגבי קיומו של אובייקט בזכרון ,אך קוד זה פחות בטוח תרגיל – 2התוכנ ית Rect Demo בדוגמה זו ניצור Classבשם CRect Class זה יאחסן נתונים אודות אורך ורוחב של מלבן נוסיף ל Class-שגרות מאפיינים ומתודות לאתחול נתוני המלבן ,חישוב היקף המלבן ושטחו .1צור פרוייקט חדש מסוג Standard EXEושמור אותו: הקצה לפרוייקט את השם RectDemoולטופס את השם frmRectDemo שמור את הפרוייקט .1הוסף Class Moduleלפרוייקט ושמור אותו: הוסף לפרוייקט Class Moduleתוך שימוש בתפריט Project הקצה ל Class-את השם CRectעל ידי שינוי המאפיין Nameשל הClass- .3הוסף קוד ל:CRect- Option Explicit Private m_dLength As Double Private m_dWidth As Double בשורות הקוד הללו אנו מצהירים על שני משתנים ,האחד לאחסון אורך המלבן והשני לאחסון רוחב המלבן משתנים אלו מוצהרים כ Privateולפיכך לא תוכל להתבצע גישה ישירה אליהם )(Private Sub Class_Initialize m_dLength = 0# m_dWidth = 0# End Sub באירוע Initializeנהוג לבצע אתחולים של משתנים ואובייקטים השייכים לClass- )Public Property Let Length(ByVal dLength As Double "Debug.Print "Inside Property Let Length If dLength >= 0# Then m_dLength = dLength End If End Property המאפיין Lengthמאפשר הכנסת ערך למשתנה m_dLength נעשית בדיקה כדי לוודא שלא מוכנס ערך לא חוקי (מספר שלילי) במקרה שמוכנס ערך חוקי ,מעודכן ערכו של m_dLengthבהתאם כמו כן הוספתי שורת קוד המדפיסה לחלון ה Immediateכאשר הביצוע של התוכנית עובר לפרוצדורה זו Public Property Get Length() As Double "Debug.Print "Inside Property Get Length Length = m_dLength End Property Property Getמאפשר ללקוח לקרוא את הערך שבLength- גם באירוע זה נכתוב לחלון ה Immediate-כדי לבחון את התרחשות התוכנית - 121אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 Public Property Let Width(dWidth As Double) Debug.Print "Inside Property Let Width" If dWidth >= 0# Then m_dWidth = dWidth End If End Property Public Property Get Width() As Double Debug.Print "Inside Property Get Width" Width = m_dWidth End Property Width באופן דומה יוצרים מאפיינים עבור Public Function Perimeter() As Double Perimeter = 2# * (m_dLength + m_dWidth) End Function Public Function Surface() As Double Surface = m_dLength * m_dWidth End Function (שטח) מחשבות את היקף ושטח המלבן בהתאמהSurface- (היקף) וPerimeter שתי הפונקציות :ים לטופס והגדר את המאפיינים הבאים-CommandButton הוסף חמישה ערך Rectangle Demo 3- Fixed Dialog 2-CenterScreen cmdSetNew Set New cmdSetLength Set length cmdGetLength Get length cmdSetWidth Set width cmdGetWidth Get width מאפיין Caption BorderStyle StartUpPosition Name Caption Name Caption Name Caption Name Caption Name Caption - 121 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il אובייקט fmRectDemo Command1 Command2 Command3 Command4 Command5 שיעור :1תכנות מונחה עצמים בVisual Basic- הטופס צריך להיראות כמו בציור הבא: .1הוסף קוד לטופס: Option Explicit Dim rc As CRect )(Private Sub cmdSetNew_Click Set rc = New CRect End Sub בשורת קוד זו יוצרים את האובייקט בזיכרון )(Private Sub cmdGetLength_Click )MsgBox "Length = " & Str(rc.Length End Sub )(Private Sub cmdGetWidth_Click )MsgBox "Width = " & Str(rc.Width End Sub )(Private Sub cmdSetLength_Click ))"rc.Length = Val(InputBox("Enter the length: End Sub )(Private Sub cmdSetWidth_Click ))"rc.Width = Val(InputBox("Enter the width: End Sub ארבעה הפרוצדורות הנ"ל מאתחלות את האובייקט rcומציגות את הערכים שים לב לנוחות שבשימוש במאפיינים ,אתה יכול להשתמש בסימן = כדי לבצע השמה ,ופרוצדורת המאפיין תופעל עבורך ,כך שאפשר לרשום rc.Length = 90במקום לרשום )rc.Length(90 .1בחינת התוכנית: התוכנית הנ"ל מציגה מידע בחלון ה Immediate-כך שאם חלון זה איו מוצג ,בצג אותו על ידי בחירתו מהתפריט View הרץ את התוכנית לחץ על Set Newכדי ליצור אובייקט מסוג CRect - 121אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים לחץ על Set lengthוהכנס ערך כלשהו .שים לב שבחלון ה Immediate-מוצגת הודעה מתוך הפרוצדורהProperty Let Length באותו אופן נסה את שאר הלחצנים והבחן בפלט שבחלון הImmediate- אני ממליץ בפניך להריץ את התוכנית Step By Stepבמצב ( Break Modeהשתמש ב F8-לשם כך) ,ולעקוב אחר ביצוע התוכנית תרגיל – 1התוכנ ית EventDemo בדוגמה זו ניצור Classשיכלול גם Eventsונשתמש ב Events-הללו מתוך תוכנית הלקוח תוכנית זו אינה קשה ,אם כי ייתכן שזרימת התוכנית תהיה מוזרה לך מעט .אני ממליץ בפנינך להריץ את התוכנית Step By Stepכדי לעקוב מקרוב אחר אופן ההתנהלות שלה .1צור פרוייקט חדש מסוג Standard EXEושמור אותו: הקצה לפרוייקט את השם EventDemoולטופס את השם frmEventDemo .1הוסף Class Moduleלפרוייקט ושמור אותו: הוסף לפרוייקט Class Moduleתוך שימוש בתפריט Project הקצה ל Class-את השם CPersonעל ידי שינוי המאפיין Nameשל הClass- .3הוסף קוד ל:CPerson- Option Explicit Private m_strName As String Private m_nAge As Integer בשורות קוד אלו מוצהרים שני משתנים שאובייקט מסוג CPersonיכיל בתוכו )(Public Event Changed )Public Event WillReset(ByRef bCancel As Boolean שתי השורות הנ"ל מצהירות על שני Eventsשאובייקט מסוג CPersonיכול לעורר את האירוע Changedנעורר בכל פעם שערכו של אחד מהמשתנים הפנימיים ( m_strNameאו )m_nAge ישונה האירוע WillResetיתעורר בכל פעם שנקראת השגרה ( Resetרשמה בהמשך) תפקיד השגרה Resetהוא לאפס את המשתנים m_strNameוm_nAge- באירוע WillResetאנו מעבירים משתנה bCancelבאמצעות ייחוס ( )ByRefלפיכך אם המשתמש באובייקט החליט לבטל את פעולת ה Reset-הוא יוכל פשוט לשנות את ערכו של bCancelל( True-בהמשך כשנכתוב תוכנית המשתמשת ב CPerson-דבר זה יובהר) )(Private Sub Class_Initialize "" = m_strName m_nAge = 0 End Sub באירוע Initializeאנו מאפסים את m_nAgeומאתחלים את m_strNameלמחרוזת ריקה )Public Property Let Name(strName As String m_strName = strName RaiseEvent Changed End Property - 121אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic- תכנות מונחה עצמים ב:1 שיעור על ידי שימוש במילת המפתחChange ומיד מעורר את האירועm_strName מאפיין זה משנה את תוכן RaiseEvent Public Property Get Name() As String Name = m_strName End Property Public Property Let Age(ByVal nAge As Integer) If nAge >= 0 Then m_nAge = nAge RaiseEvent Changed End If End Property שלילי- בתנאי שהמספר המועבר הוא איm_nAge מאפיין זה משנה את ערכו של Changed מעוררים את האירוע,לאחר שינוי הערך Public Property Get Age() As Integer Age = m_nAge End Property Public Sub Reset() Dim bCnl As Boolean bCnl = False RaiseEvent WillReset(bCnl) If bCnl = False Then m_strName = "" m_nAge = 0 RaiseEvent Changed End If End Sub m_nAge- וm_strName הוא לאפס את המשתניםReset תפקיד המתודה )False- (המאותחל לbCnl ומעבירה את הפרמטרWillReset מעוררת את האירועReset תחילה המתודה כל שעליו לעשות הוא לשנות את ערכו של,Reset- אם המשתמש שלוכד את האירוע החליט לבטל את פעולת ה True- לbCnl אזי מאפסים את,False אם הוא עדיין.bCnl נבחן ערכו של, לאחר שלוכד האירוע סיים את הטיפול באירוע לאTrue- אם ערכו שונה ל.Changed ומעוררים את האירועm_nAge- וm_strName ערכי המשתנים מבצעים מאומה :ים לטופס והגדר את המאפיינים הבאים-CommandButton הוסף שלושה.1 ערך Event Demo 3- Fixed Dialog 2-CenterScreen cmdSetAge Set Age cmdSetName מאפיין Caption BorderStyle StartUpPosition Name Caption Name אובייקט fmEventDemo - 121 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Command1 Command2 לתוכניתניםVisual Basic 6 Set Name cmdReset Reset cmdSetWidth Set width Caption Name Caption Name Caption Command3 Command4 :הטופס צריך להיראות כמו בציור שלפניך : הוסף קוד לטופס.1 Option Explicit Dim WithEvents prs As CPerson CPerson שורת קוד זו מצהירה על משתנה ייחוס לאובייקט מסוג כדי שהאירועים של האובייקט יילכדו בתוך הטופסWithEvents נעשה שימוש במילה Private Sub Form_Load() Set prs = New CPerson End Sub ברגע שהטופס נוצר יוצרים את האובייקט משחררים את האובייקט מהזיכרוןUnload באירוע prs שלReset קוראים למתודהReset בעת לחיצה על Private Sub Form_Unload(Cancel As Integer) Set prs = Nothing End Sub Private Sub cmdReset_Click() prs.Reset End Sub Private Sub cmdSetAge_Click() prs.Age = Val(InputBox("Enter the age")) End Sub InputBox- לפי הערך המוזן על ידי המשתמש בAge מאתחלים אתSet Age בתגובה ללחיצה על Private Sub cmdSetName_Click() prs.Name = InputBox("Enter the name") End Sub InputBox- לפי המחרוזת המוזנת על ידי המשתמש בName מאתחלים אתSetName בתגובה ללחיצה על Private Sub prs_Changed() MsgBox "prs has changed. The new values are:" & vbCrLf & _ "Name = " & prs.Name & vbCrLf & _ "Age = " & Trim(Str(prs.Age)) End Sub - 121 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- אירוע זה מתעורר ( )Firedעל-ידי prsבכל פעם שערך מסוים בתוך האובייקט שונה .בנקודה זו אנו מציגים באמצעות Message Boxאת הערכים העדכניים את prs )Private Sub prs_WillReset(bCancel As Boolean If MsgBox("Do you want to cancel the reset?", vbYesNo) = vbYes Then bCancel = True End If End Sub אירוע זה מתעורר על ידי prsבכל פעם שמנסים לאפס את .prsבנקודה זו אנו מציגים הודעה המאפשרת למשתמש להחליט האם לבטל את פעולת האיפוס או לא .1בחינת התוכנית: הרץ את התוכנית ובחן את פעולתה כאמור ,אני ממליץ בפניך להריץ את התוכנית Step By Stepבאמצעות F8כדי לבצע מעקב מדויק אחר זרימת התוכנית מימוש Interface Interfaceהוא החלק הציבורי ( )Publicשל Classמסוים – כלומר החלק הנגיש של המחלקה ב COM-נהוג לכתוב ממשקים באמצעות שפת )Interface Definition Language( IDLולקמפל את הקוד באמצעות הקומפיילר MIDL אם אתה מכיר את שפת IDLתוכל להשתמש בה כדי ליצור ממשקים ולממש אותם בכל שפה שתרצה (בתנאי ששפה זו תומכת COMכמובן) ב Visual Basic-נוכל ליצור -Interfaceים פשוט על ידי יצירת Classללא משתנים וללא מימושים כלשהם לפונקציות .למעשה לכל Classב Visual Basic-יש ממשק משלו Classהמעונין לממש Interfaceצריך להשתמש במילה Implements מימוש Classים הנו מימוש ה-Interface-ים של אותם -Classים Classהמממש Interfaceחייב לממש את כל המתודות והמאפיינים שלו אם לא תממש פרוצדורה מסוימת של Interfaceתקבל שגיאת קומפילציה אם הצהרת על משתנים Publicב Class-שאת ה Interface-שלו אתה מממש ב Class-אחר ,תקבל עבור כל משתנה כזה פרוצדורות Property GetוProperty Let- באמצעות מימוש -Interfaceים ניתן ליצור היררכיה של -Classים וכן ליצור רכיבי תוכנה שיתאימו לתוכנה מוכנה מצד שלישי כאשר אובייקט מממש מספר -Interfaceים ,ניתן להשתמש במשתני ייחוס מכל סוגי ה-Interface-ים הממומשים כדי להתייחס לאובייקט בשיעור הבא תלמד כיצד ליצור Add-Inל Visual Basic-על ידי מימוש ממשק מתאים אבחון תכו נות אובייקט בזמן ריצה ניתן לבדוק אם אובייקט תומך ב Interface-מסוים ע"י שימוש במילה :TypeOf...Is ניתן לבדוק מהו סוג האובייקט המוצבע בפועל על ידי שימוש בפונקציה .TypeNameפונקציה זו מחזירה מחרוזת הזהה לשם ה Class-שאליו שייך האובייקט (הכוונה כאן היא לאובייקט המוצבע בפועל ולא לסוג המצביע) ניתן לבדוק האם אובייקט אותחל או שהוא שווה ל Nothing-ע"י שימוש במילים ....Is Nothing... - 112אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים דוגמאות If TypeOf shape is IArchive Then ... End If בשורות קוד אלו נבדק האם objמממש את ה Interface-ששמו ,IArchiveאם כן נכנסים לתוך בלוק הביצוע של הIf- )MsgBox TypeName(obj שורת קוד זו מציגה את שם המחלקה אליה שייך האובייקט המוצבע ע"י obj If obj Is Nothing Then Exit Sub שורת קוד זו גורמת ליציאה מרוטינה אם objאינו מאותחל (כלומר הוא )Nothing שים לב שכדי לשלול את התנאי עליך לרשום Notבתחילת התנאי .כלומר: If Not TypeOf shape is IArchive Then... וכן: If Not obj Is Nothing Then Exit Sub תרגיל – 4התוכנ ית ImplementsDemo בדוגמה זו ניצור Classעם מספר פרוצדורות בעלות מימוש ריק כלומר ,Interfaceונממש אותו ב Class-אחר .1צו פרוייקט חדש מסוג Standard EXEושמור אותו: הקצה לפרוייקט את השם ImplementsDemoולטופס את השם frmImplementsDemo שמור את הפרוייקט .1הוסף שלושה -Class Moduleים לפרוייקט ושמור אותם: הקצה ל-Class-ים את השמות CCircle ,IShape :וCRect- שמור את ה-Class Module-ים .3הוסף קוד ל:IShape- Option Explicit Public Function Perimeter() As Double ' Empty inside interface End Function Public Function Surface() As Double ' Empty inside interface End Function בשורות קוד אלו מוצהרות שתי פונקציות Perimeter ,וSurface- שים לב כי אין מימוש לפונקציות (בתוך כל פונקציה רשומה הערה!) .1הוסף קוד ל:CCircle- Option Explicit Implements IShape בשורת הקוד הזו אנו מבקשים לממש את ה Interface-של IShape תשים לב כי ב Combo Box-השמאלי שבחלון הקוד ( )Objectמופיע כעת IShape Public m_dRadius As Double - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic- תכנות מונחה עצמים ב:1 שיעור בשורת קוד זו מצהירים על משתנה שיאחסן את רדיוס המעגל וליצורPrivate- אך ברור לך שכדאי להצהיר עליו כPublic-שים לב כי לצורך ההדגמה המשתנה מוצהר כ מתאימותProperty Let- וProperty Get עבורו פרוצדורות Private Function IShape_Perimeter() As Double IShape_Perimeter = 2 * 3.14 * m_dRadius End Function P 2r הוא כמובןCircle עבורPerimeter המימוש של Private Function IShape_Surface() As Double IShape_Surface = 3.14 * m_dRadius * m_dRadius End Function S r 2 הואCircle עבורSurface המימוש של :CRect- הוסף קוד ל.1 Option Explicit Implements IShape Public m_dLength As Double Public m_dWidth As Double Private Function IShape_Perimeter() As Double IShape_Perimeter = 2 * (m_dLength + m_dWidth) End Function Private Function IShape_Surface() As Double IShape_Surface = m_dLength * m_dWidth End Function תוך ביצוע החישובים המתאימים למלבן,IShape שלInterface- ממומש הCRect- גם בCCircle- כמו ב : והגדר את המאפיינים הבאים, אחדTextBoxים ו-CommandButton הוסף לטופס חמישה ערך Implements Demo 3- Fixed Dialog 2-CenterScreen cmdSetCircle Set Circle Radius... cmdSetShapeIsCircle Set shape = c cmdSetRectangleValues Set Rectangle Values... cmdSetShapeIsRect Set shape = r cmdDisplayInfo Display Info... txtInfo מאפיין Caption BorderStyle StartUpPosition Name Caption Name Caption Name Caption Name Caption Name Caption Name אובייקט frmImplementsDemo - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Command1 Command2 Command3 Command4 Command5 Text1 לתוכניתניםVisual Basic 6 ][ריק True Text MultiLine :הטופס אמור להיראות כמו בציור שלפניך :הוסף קוד לטופס Option Explicit Dim c As New CCircle Dim r As New CRect Dim shape As IShape IShape- ומשתנה ייחוס לCCircle אובייקט מסוג,CRect השורות הנ"ל מצהירות על אובייקט מסוג Private Sub cmdSetCircle_Click() c.m_dRadius = Val(InputBox("Enter the radius of the circle:")) End Sub Private Sub cmdSetRectangleValues_Click() r.m_dLength = Val(InputBox("Enter the length of the recangle:")) r.m_dWidth = Val(InputBox("Enter the width of the rectangle:")) End Sub r והמלבןc שורות הקוד הנ"ל מאפשרות אתחול של המעגל Private Sub cmdSetShapeIsCircle_Click() Set shape = c End Sub Private Sub cmdSetShapeIsRect_Click() - 113 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- Set shape = r End Sub בשורות הקוד הללו קובעים לאיזה מבין הצורות ( cאו )rיצביע המשתנה shape שים לב כי אין כל בעיה ש shape-יצביע על אובייקט מסוג CCircleאו מסוג CRectכיוון שאובייקטים אלו ממשים את IShape עם זאת – shapeלא יוכל להפעיל פונקציות שאינן שייכות ל( IShape-נדון בכך בסעיף הבא "Early Binding לעומת )"Late Binding )(Private Sub cmdDisplayInfo_Click If shape Is Nothing Then Exit Sub txtInfo.Text = TypeName(shape) & "..." & vbCrLf _ & )" " txtInfo.Text = txtInfo.Text & String(8, "Perimeter = " & Str(shape.Perimeter()) & vbCrLf _ & )" " txtInfo.Text = txtInfo.Text & String(8, "Surface = " & Str(shape.Surface()) & vbCrLf End Sub בתגובה ללחיצה על Display Info...מתבצעות שורות הקוד הנ"ל תחילה נבדק שהמשתנה shapeמאותחל .אם shapeאינו מאותחל יוצאים מהרוטינה לאחר מכן מציגים את שם סוג האובייקט המוצבע ע"י .shapeעושים זאת באמצעות הפונקציה TypeName מוסיפים קריאות ל Perimeter-ו Surface-כדי להציג את היקף ושטח הצורה .1בחינת התוכנית: הרץ את התוכנית ובדוק את אופן פעולתה Early Bindingלעומת Late Binding Early Bindingפירושו קישור הקריאות למתודות ומאפיינים של אובייקט עוד בזמן הקימפול .כלומר בEarly - Bindingעוד במן הקימפול ידוע לקומפיילר מהן הכתובות הפיסיות של המתודות הנקראות קישור מסוג זה קרוי VTBL Bindingוהוא המהיר ביותר בCOM- בדרך כלל אתה משתמש בסוג זה של קישור בתוכניות Visual Basic Late Bindingהיא האפשרות לגשת למאפיין או מתודה של אובייקט שאין וודאות בזמן הפיתוח שהם נתמכים ע"י האובייקט .משמעות הדבר היא שבזמן ריצת התוכנית יהיה על התוכנית לגלות אם באותו אובייקט קיימת המתודה או קיים המאפיין שאליו רוצים לגשת פונקציונליות זו אפשרית על ידי שימוש בממשק IDispatchמ COM-או ע"י שימוש ב Type Library-וזיהויו בזמן ריצה ב Visual Basic-כל האובייקטים מממשים את ה Interfaceששמו Object Objectהוא למעשה הממשק IDispatchהמאפשר Late BindingבVisual Basic- Late Bindingהרבה יותר גמיש מבחינת אפשרויות התכנות מאשר .Early Bindingעם זאתLate Binding , איטי ביותר ביחס לEarly Binding- בעת קריאה למתודה או מאפיין בזמן ריצה תוך שימוש ב Object-מתבצעות מספר הכנות לפני שהפונקציה מופעלת .פעולות אלה בודקות את קיומה של המתודה או קיומו של המאפיין הנקרא .ניקח לדוגמה את המשפטים: Dim obj As Object ... ... )obj.SetValues("Today is your day", 57 - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים שלבי הביצוע הם: oהכנת כל המחרוזות הטקסטואליות שיש לזהות :במקרה זה המחרוזת שיש לזהות היא – SetValues כלומר יש לבדוק האם האובייקט שאליו מצביע objאכן כולל פונקציה כזו oקריאה ל .IDispatch::GetIDsOfNames()-קריאה זו מטרתה לאחזר את מספרי הזיהוי ( )DISPIDsשל שם המתודה והפרמטרים שיש להעביר לה :במקרה שלנו יוחזרו מספרי זיהוי עבור השם SetValues ועבור הפרמטרים שיש להעביר לה oכל מספרי הזיהוי ( )DISPIDsיוחזרו oקריאה ל .IDispatch::Invoke()-קריאה זו מטרתה להפעיל (סוף סוף) את המתודה לאחר שזיהינו שאכן היא נתמכת ,וכל הפרמטרים שלה הוכנו. oהערך המוחזר של הפונקציה ( )HRESULTמוחזר מ IDispatch::Invoke()-לקוד הקורא תחשוב על כך שהפעולות הללו מתבצעות עבור כל קריאה למתודה ,כאשר היא מתבצעת באמצעות .IDispatch ללא ספק זוהי תקורה ( )Overheadגבוהה למדי עבור קריאה בודדת .תחשוב מה כמה זמן היית ממתין לתשובה לו הקטע הנ"ל היה מתבצע בין שני -Processים נפרדים או בין שני מחשבים ברחבי הרשת בדוגמה הבאה תבחן במושגים של זמן את ההבדלים בין Late BindingלEarly Binding- תרגיל – 3התוכנ ית Analyzer .1צו פרוייקט חדש מסוג Standard EXEושמור אותו: הקצה לפרוייקט את השם Analyzerולטופס את השם frmAnalyzer שמור את הפרוייקט .1הוסף Class Moduleלפרוייקט: הקצה את השם CTestלClass Module- שמור את הפרוייקט שוב הוסף קוד ל:CTest- Option Explicit Private m_lVal As Long )Public Property Let Val(lVal As Long m_lVal = lVal End Property זוהי מחלקה פשוטה עם מאפיין אחד המאפשר להזין ערך למשתנה Val .3הוסף לטופס שלושה -CommandButtonים ו TextBox-אחד והגדר את המאפיינים הבאים: אובייקט frmAnalyzer Command1 Command2 Command3 Text1 מאפיין Caption BorderStyle StartUpPosition Name Caption Name Caption Name Caption Name ערך Late Binding VS. Early Binding 3- Fixed Dialog 2-CenterScreen cmdSetNew Set ... = New cmdUseObject Dim ... As Object cmdStop !I got it - STOP txtTimer - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- Background Locked Text MultiLine Button Face True [ריק] True הטופס אמור להיראות כמו בציור שלפניך: הוסף קוד לטופס: Option Explicit )(Private Sub cmdSetNew_Click Dim cls As CTest Dim lVal As Long, i As Integer Dim sTime As Single Set cls = New CTest sTime = Timer For i = 1 To 1000 _ & txtTimer.Text = "As CTest... " & vbCrLf _ & "i = " & Str(i) & vbCrLf ""Time elapsed:" & Str(Timer - sTime) & " sec DoEvents For lVal = 1 To 10000 cls.Val = lVal Next Next End Sub בקטע קוד זה מריצים שתי לולאות מקוננות בתוך הלולאה הפנימית ניגשים למאפיין של האובייקט cls לפני הכניסה ללולאה החיצונית נמדד הזמן ולפני כל איטרציה של הלולאה הפנימית מוצג ההפרש בשניות מאז הכניסה ללולאה החיצונית בפעולת ההדפסה מציגים את שם האובייקט באמצעות TypeName - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים )(Private Sub cmdUseObject_Click Dim cls As Object Dim lVal As Long, i As Integer Dim sTime As Single Set cls = New CTest sTime = Timer For i = 1 To 1000 _ & txtTimer.Text = "As Object..." & vbCrLf _ & "i = " & Str(i) & vbCrLf ""Time elapsed:" & Str(Timer - sTime) & " sec DoEvents For lVal = 1 To 10000 cls.Val = lVal Next Next End Sub קטע קוד זה זהה לקודם ,אלא שכאן מוצהר האובייקט כObject- במקרה זה מופעלת הגישה למאפיין Valבאמצעות Late Binding )(Private Sub cmdStop_Click Unload Me End Sub )Private Sub Form_Unload(Cancel As Integer End End Sub .1בחינת התוכנית: הרץ את התוכנית ןהשווה את הביצועים של Early Bindingלעומת Late Binding תסכים איתי שהתוצאות מרשימות .אצלי במחשב ( )Pentium III 733MHrzהשימוש בEarly Binding- (שימוש במשתנה ייחוס מסוג )CTestהסתכם ב 4.41-שניות ,ואילו הפעלה באמצעות ( Late Bindingשימוש במשתנה ייחוס מסוג )Objectהסתכם ב 77.21-שניות. הגדרת תכונות של פרוצדורות בINTREFCAE- בעת יצירת Classב Visual Basic-נוצר עבורו באופן אוטומטי Interface לפרוצדורות ב Interface-ישנן הגדרות ותכונות נוספות הגדרה מותאמת אישית של תכונות אובייקטים ב Visual Basic-מהווה לעתים תכופות מטלה שחובה לבצע אותה על מנת לגרום לאובייקט לפעול בצורה תקינה בסעיף זה תלמד כיצד ניתן לצפות בתכונות ה ,Interface-וכיצד ניתן להגדיר את התכונות הללו בVisual Basic- חלק מהתכונות יילמדו בשיעורים הבאים צפייה בתכו נות באמצעות Object Browser כדי לצפות בפרוצדורות והתכונות שלהן ניתן להשתמש בObject Browser- - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- תרגיל – 6צפי יה באובייקטים באמצעות ה Object Browser - תרגיל זה נטול קוד .מטרת התרגיל היא להכיר לך את חלון הObject Browser- .1פתח את ה:Object Browser- מתוך התפריט Viewבחר ב ,Object Browser-לחילופין לחץ על F2 .1בחר אובייקט לבחינה: לצורך התרגול (וגם בגלל שהנושא הבא הוא )Collectionsנבחר לצפות באובייקט Collection מתוך הרשימה Classesבחר ב( Collection-אם אינך מוצא את ,Collectionוודא שב Combo Box-העליון בחרת ב <All Libraries>-או בVBA- .3בחן את :Collection כפי שאתה רוצה ,בפנל הימני מוצגים המאפיינים והמתודות של Collection סמן את אחת הפרוצדורות ,תבחין מיד כי בתחתית החלון מוצגת אינפורמציה אודות הפרוצדורה הנבחרת. אינפורמציה זו כוללת את סוג הפרוצדורה ( Property ,Function ,Subאו )Eventהסבר קצר ,ולינק לClass- המכיל (במקרה זה )VBA.Collection .1זהה את פרוצדורת ברירת המחדל: תשים לב כי ליד Itemישנו עיגול כחול .זהו סימן לכך שהפונקציה Itemהיא פרוצדורת ברירת המחדל עבור Collection פרוצדורת ברירת מחדל מופעלת באופן אוטומטי אם לא ציינת במפורש שום פרוצדורה להפעלה הצג פרוצדורות נסתרות: לחץ לחיצה ימנית במקום כלשהו ובחר בShow Hidden Members- תבחין כי לרשימת הפרוצדורות של Collectionנוסף חבר חדש ושמו _NewEnum על משמעות _NewEnumתלמד בסעיף Collections צפייה באמצעות היישום OLE VIEW לא כל התכונות של פרוצדורה מוצגות בObject Browser- כדי לצפות בכל הפרטים אודות Interfaceמסוים ,אפשר להשתמש ביישום .OLE Viewיישום זה מותקן יחד עם חבילת .Visual Studioתוכל לפתוח אותו מתוך תת התפריט Microsoft Visual Studio 6.0 Toolsתחת Microsoft Visual Studio6.0 תרגיל OLE View – 7לבעלי לב ח זק בלבד אם אתה בעל לב חזק ,בטח תרצה לבחון את Collectionגם מתוך OLE View .1פתח את :OLE View OLE View נמצא במסלול הבא (אלא אם התקנת את Visual Studioבמסלול שונה מאשר ברירת המחדל): OLE View >--Microsoft Visual Studio 6.0 Tools >--Microsoft Visual Studio 6.0 >--Programs>--Start .1פתח את ה:Type Library- מהתפריט Fileבחר בView TypeLib...- עבור לספריית VB98תחת ספריית ההתקנה של ( Visual Studioבררך כלל זהו המסלול: \)C:\Program Files\Microsoft Visual Studio\VB98 בחר בקובץ .VBA6.DLLהאובייקט Collectionנמצא בספריית .VBA OLE View ישתהה מעט בזמן שהוא קורא את נתוני הספרייה .3בחר ב Interface-של האובייקט :Collection בתחתית הפנל השמאלי לחץ על לחצן הפלוס ( )+שליד הפריט interface _Collection תוכל להבחין שהמתודות Remove ,Count ,Add ,Itemו _NewItem-מופיעות מעיון בפרוצדורות תבחין כי לכל פרוצדורה יש מספר זיהוי ( )idהרשום בהגדרת הInterface- - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים אם תעיין במתודה _NewEnumתבחין בכך שמספר הזיהוי שלה הוא -4( 0xfffffffcבהקצהדצימלית) פרט זה ישמש אותנו כשניצור Collectionמותאם אישית .1עיין ב-Interface-ים ממומשים על-ידי :Collection כפי שזכור לך מהדיון על Reference Countingועל ,Late Bindingאמרתי אז ש IUnknown-הוא ה Interface-הבסיסי ביותר ב COM-ואילו IDispatchמאפשר Late Bindingעבור רכיבי ActiveX אם תלחץ על Inherited Interfacesתחת הענף הנוכחי ,תגלה את IDispatchחבוי עם המתודות המוכרות לנו מהדיון אודות Invoke ,GetIdsOfNames( Late Bindingועוד). אם תלחץ שוב על Inherited Interfacesשתחת IDispatchתגלה את IUnknownעם שלוש המתודות שלו ( AddRef ,Query Interfaceו .)Release-ואכן זהו ה Interface-הבסיסי ביותר IUnknown .אינו נורש מאף Interfaceאחר .1אם אתה מרגיש שאתה צריך קפה – זה הזמן! הגדרת תכונות עד כה ראינו איפה צופים בתכונות של Interface תכונות פרוצדורה של מחלקה נקבעים בשני מקומות חשובים: oהגדרת הפרוצדורה כפי שמופיעה בקוד קובעת: מהו סוג הפרוצדורה ( Property Let ,Property Get ,Function ,Subאו )Event מהם הפרמטרים המועברים לפרוצדורה (אם בכלל) מהו הערך המוחזר מהפונקציה oתיבת הדו שיח ה:Procedure Attributes- תיבת הדו שיח ה Procedure Attributes-נמצאת תחת התפריט Tools תיבת דו שיח זו מאפשרת לשלוט במאפיינים רבים שאת חלקם נסקור רק בשיעורים הבאים - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- o o :Name שם הפרוצדורה :Description תיאור קצר של הפרוצדורה :Project Help שם קובץ העזרה של הפרוייקט (ניתן להגדרה מתוך חלון הProject - )Properties :Help Context ID מגדיר את מספר הקשר העזרה בתוך קובץ העזרה ( :Procedure ID מזהה שגרה) :לכל שגרה ב Interface-יש מספר זיהוי .מספר זה משפיע על אופן התנהגות השגרה :Use This Page In Property Browser מגדיר את הדף שייפתח מבין דפי המאפיינים עבור מאפיין זה :Property Category הקטגוריה אליה שייכת הפרוצדורה (שים לב כי בחלון המאפיינים יש אפשרות להציג מאפיינים לפי קטגוריות) :Hide This Member מסתיר את הפרוצדורה ממשתמשי המחלקה :Don't Show In Property Browser לא מציג את המאפיין בחלון המאפיינים :User Interface Default האם הפרוצדורה תהיה פרוצדורת ברירת המחדל בחלון המאפיינים :Data Binding האם הפרוצדורה יכולה להיות קשורה לנתונים חיצוניים .נושא זה יידון בהמשך הקורס בהמשך שיעור זה תשתמש בתיבת דו שיח זו כדי להגדיר ( Procedure IDמזהה שגרה) עבור פרוצדורה שתכתוב ביתר ההגדרות שצויינו נשתמש בשיעורים הבאים ( COLLECTIONSאוספים) Collectionהוא מבנה נתונים דינמי Collectionהוא Classמוכן של ,Visual Basicכלומר ,מבנה שניתן להוסיף ולהסיר ממנו פריטים במהלך ריצת התוכנית לפריטים באוסף יש אינדקסים הרצים מ 1-עד ( Countכאשר Countהוא גודל ה)Collection- פריטים הנוספים ל Collection-הם מסוג ,Objectלפיכך ניתן להוסיף ל Collection-את כל סוגי האובייקטים, כיוון שכולם נגזרים מObject- אם אתה מוסיף אובייקטים מסוגים שונים ל Collection-תוכל להשתמש בזיהוי סוג האובייקט בזמן ריצה כדי לבצע פעולות האופייניות רק לסוג מסוים ניתן לבצע סריקה על אובייקטים ב Collection-בשתי צורות: oלולאת Forרגילה הרצה מ 1-עד Count oלולאת .For Each...In...Nextסוג זה של לולאה נוסף לשפה כדי להקל את העבודה עם אוספים תחביר תחביר ההצהרה על Collectionהוא: Dim coll As New Collection oאפשר להצהיר ללא המילה Newואז ליצור את ה Collection-מאוחר יותר ל Collection-יש את המאפיינים והמתודות הבאות: :Add oמוסיף פריט ל.Collection- תחביר: )]coll.Add (Item, [Key], [Before], [After :Itemזהו הפריט שיש להוסיף לCollection- - 112אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים o :Key מחרוזת ייחודית שניתן להצמיד לפריט .מאוחר יותר ניתן יהיה לאתר את הפריט באמצעות מחרוזת זו :Before מוסיף את הפריט לפני הפריט שהאינדקס שלו או המפתח ( )Keyשלו מצוין ב.Before- לא ניתן לציין Beforeיחד עם After :After מוסיף את הפריט אחרי הפריט שהאינדקס שלו אן המפתח ( )Keyשלו מצוין ב.After- לא ניתן להשתמש ב After-יחד עם Before :Removeמסיר פריט מה:Collection- תחביר: )coll.Remove (Index :Index מציין את האינדקס או המפתח ( )Keyשל הפריט שיש להסיר :Itemמחזיר מצביע לפריט מסויים בCollection- תחביר: )coll.Item (Index :Indexמציין את האינדקס או המפתח ( )Keyשל הפריט שיש להחזיר Itemהוא מאפיין ברירת המחדל .לפיכך ניתן לפנות לפריט גם באופן הבא: )coll(Index o :Countמחזיר את מספר הפריטים בCollection- תחביר: coll.Count הלולאה For each ..In .. Next לולאה זו מיועדת לסריקת אובייקטים מתוך אוסף תחביר הלולאה הוא כדלקמן: בכל איטרציה של הלולאה objמתייחס לאובייקט הנוכחי בColl- For Each obj In Coll obj.Method1... obj.Method2... Next תרגיל – 1התוכנ ית ShapeColl1 התוכנית ShapeColl1תאפשר למשתמש להוסחף מלבנים או עיגולים האובייקטים שייוצרו יצורפו ל Collection-שיוצהר לשם כך לחיצה על List Itemsתציג את כל הפריטים הנמצאים באוסף סריקת האוסף נעשית באמצעות הלולאה For Each ... In ... Next .1צו פרוייקט חדש מסוג Standard EXEושמור אותו: הקצה לפרוייקט את השם ShapeColl1ולטופס את השם frmTest שמור את הפרוייקט .1הוסף שני -Class Moduleים לפרוייקט: הקצה את השמות CCircleו CRect-למחלקות שמור את הפרוייקט שוב - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic- תכנות מונחה עצמים ב:1 שיעור :CCircle- הוסף את הקוד הבא ל.3 Option Explicit Private Const PI As Double = 3.14 Private m_dRadius As Double Public Property Get Radius() As Double Radius = m_dRadius End Property Public Property Let Radius(dRad As Double) If dRad >= 0 Then m_dRadius = dRad End Property Public Function Surface() As Double Surface = PI * m_dRadius * m_dRadius End Function Public Function Perimeter() As Double Perimeter = 2 * PI * m_dRadius End Function :CRect- הוסף את הקוד הבא ל.1 Option Explicit Private m_dLength As Double Private m_dWidth As Double Public Property Get Length() As Double Length = m_dLength End Property Public Property Let Length(dLen As Double) If dLen >= 0 Then m_dLength = dLen End Property Public Property Get Width() As Double Width = m_dWidth End Property Public Property Let Width(dWid As Double) If dWid >= 0 Then m_dWidth = dWid End Property - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 Public Function Surface() As Double Surface = m_dLength * m_dWidth End Function Public Function Perimeter() As Double Perimeter = 2 * (m_dLength + m_dWidth) End Function : אחד והגדר את המאפיינים הבאיםTextBox-ים ו-CommandButon הוסף ארבעה ערך Shape Collection Demo 1 3- Fixed Dialog 2-CenterScreen cmdAddRect Add Rectangle cmdAddCircle Add Circle cmdListItemsMethod1 List items - Method 1 cmdListItemsMethod2 List items - Method 2 txtColl ButtonFace True ][ריק True מאפיין Caption BorderStyle StartUpPosition Name Caption Name Caption Name Caption Name Caption Name Background Locked Text MultiLine אובייקט frmTest Command1 Command2 Command3 Command4 Text1 : הוסף את הקוד הבא לטופס.1 Option Explicit Public shpColl As Collection shpColl בשםCollection-בשורת קוד זו מוצהר מצביע ל Private Sub Form_Load() Set shpColl = New Collection End Sub Private Sub Form_Unload(Cancel As Integer) Set shpColl = Nothing End Sub עםCollection- ומשחרר את ההתיחסות ל, חדש עם טעינת הטופסCollection הקוד הנ"ל יוצר אובייקט התפרקות הטופס - 113 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic- תכנות מונחה עצמים ב:1 שיעור Private Sub cmdAddCircle_Click() Dim cr As CCircle Set cr = New CCircle cr.Radius = Val(InputBox("Enter the radius for the circle:")) shpColl.Add cr Set cr = Nothing End Sub Private Sub cmdAddRect_Click() Dim rc As CRect Set rc = New CRect rc.Length = Val(InputBox("Enter the length of the rectangle:")) rc.Width = Val(InputBox("Enter the width of the rectangle:")) shpColl.Add rc Set rc = Nothing End Sub בהתאם ללחיצה של המשתמש,בשורות הקוד הנ"ל יוצרים עיגול או מלבן InputBox מאתחלים את האובייקט שנוצר על ידי שימוש בפונקציה shpColl-מוסיפים את האובייקט ל Private Sub cmdListItemsMethod1_Click() Dim obj As Object txtColl.Text = "" On Error Resume Next For Each obj In shpColl txtColl.Text = txtColl.Text & TypeName(obj) & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Length = " & obj.Length & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Width = " & obj.Width & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Radius = " & obj.Radius & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Surface = " & obj.Surface & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Perimeter = " & obj.Perimeter & vbCrLf Next End Sub shpColl-בשורות קוד אלו מבצעים סריקה של האובייקטים ב Surface ,Radius ,Width ,Length עבור כל אובייקט מציגים (יותר מדוייק להגיד "מנסים להציג") את Perimeter-ו אין את המאפייניםCCircle ולאובייקטים מסוג,Radius אין את המאפייןCRect כיוון שלאובייקטים מסוג כדי להעביר את הביצוע לשורה הבאה אם מתרחשתOn Error Resume Next- קוראים ל,Width- וLength שגיאה - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 Late Binding ביצועי, וכפי שראית בתרגיל הקודם, כדי להציג פרטיםLate Binding-שיטה זו משתמשת ב ! צורות10000 חשוב כמה זמן היתה נמשכת פעולת הצגת הפרטים אם נניח שהאוסף מכיל.הם גרועים Private Sub cmdListItemsMethod2_Click() Dim obj As Object Dim rc As CRect Dim cr As CCircle txtColl.Text = "" On Error Resume Next For Each obj In shpColl If TypeOf obj Is CRect Then Set rc = obj txtColl.Text = txtColl.Text & "CRect" & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Length = " & rc.Length & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Width = " & rc.Width & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Surface = " & rc.Surface & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Perimeter = " & rc.Perimeter & vbCrLf Else Set cr = obj txtColl.Text = txtColl.Text & "CCircle" & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Radius = " & cr.Radius & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Surface = " & rc.Surface & vbCrLf txtColl.Text = txtColl.Text & String(8, " ") & _ "Perimeter = " & rc.Perimeter & vbCrLf End If Next End Sub shpColl- גם כאן מבצעים סריקה על האובייקטים ב או מסוגCRect כאן נבחן סוג האובייקט ולאחר מכן הוא מושם למשתנה מסוג, לעומת השיטה הקודמת שלהם וכתוצאה מקבלים ביצועיםType Library- הגישה לאובייקטים נעשית דרך ה, כיוון שכך.CCircle .הרבה יותר טובים : בחינת התוכנית.1 הרץ את התוכנית ובדוק את פעולתה - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- מחלקות Collectionמותאמות אישית כפי שראית Collection ,מקבל את הסוג Object ניתן ליצור מחלקות אוסף מותאמות ,כך שמחלקות אלו יקבלו נתונים מסוג מסוים או מנגזרותיו היתרון ב Collection-מותאם אישית הוא בכך שהאובייקטים המוחזרים ממנו הם מסוג מסוים ,לפיכך ניתן להשתמש בEarly Binding- משתמשים ב-Collection-ים גם כדי ליצור היררכית עצמים היררכית ( ADOשתכיר בהמשך הקורס) היא דוגמה לצירוף של -Classים ו-Collection-ים היוצרים היררכיה אחת בתרגיל הבא תיצור .Collectionמשלך ,בכל מקרה דע שתוכל להשתמש ב( VB Class Builder-אתה מציג אותו ע"י בחירת Add Class Moduleמתפריט )Projectכדי ליצור היררכת עצמים ואוספים שים לב שבאוספים הנוצרים ע"י VB Class Builderהמתודה Addיוצרת את האובייקטים .בתרגיל שלפנינו המתודה Addמקבלת את האובייקט בדיוק כמו ב Collection-רגיל הוללאה For Each...In...Nextהמוכרת לך ,פועלת על Collectionכיוון שהם ממשים פונקציה בשם _NewEnum (כפי שראית כשצפינו ב Collection-ב)Object Browser- המתודה NewEnumמאפשרת ללולאה לאתר רשומות ב .Collection-למעשה Enumeratorעוקב אחר המיקום של הלולאה בCollection- כדי שהלולאה For Each...In...Nextתפעל ב Collection-שלך ,עליך להוסיף פונקציה דומה כפי שראינו ב ,OLE View-ה id-של המתודה _NewEnumהוא . 4לפיכך ,גם למתודה שאתה תכתוב הid- חייב להיות . 4תוכל להגדיר זאת באמצעות תיבת הדו-שיח ( Procedure Attributesתוכל להבין מכך שהשם שתיתן לפונקציה שלך הוא לא חשוב ,מה שחשוב הוא שמספר הזיהוי שלה יהיה ) 4 כיוון שלא ניתן לכתוב Collectionיעילים ב ,Visual Bsic-משתמשים בטכניקה הנקראת Object Containment and Delegationכדי ליצור Collectionsמשלנו: :Containment oפירושה הכלה .ובאופן יותר מעשי ,האובייקט שאנו יוצרים מכיל אובייקט אחר :Delegation oפירושה האצלה .כלומר ,בעת קריאה לפונקציה של האובייקט שאנו יוצרים ,אנו מעבירים את הביצוע (העבודה השחורה) לאובייקט הפנימי בתרגיל הבא נשתמש בעקרון הנ"ל כדי ליצור Collectionמשלנו לפי השלבים הבאים: oצור מחלקה והצהר על משתנה Collectionפרטי למחלקה oהוסף למחלקה פרוצדורות Count ,Item ,Remove ,AddוNewEnum- oכדי לאפשר ללולאה For Each ... In ... Nextעליך להוסיף מתודה בשם ( NewEnumתוכל לתת לה גם שם אחר ,אך עדיף לתת לה שם זה) oממש את הפרוצדורות של המחלקה שלך ,ע"י קריאה לפרוצדורה המקבילה ב Collection-שבתוך המחלקה oמימוש NewEnumיפעיל את הפונקציה _NewEnumב Collection-הפנימי במחלקה oמתוך תיבת הדו שיח Procedure Attributesהגדר את מספר הזיהוי של המתודה NewEnumלמספר –4 והגדר את הפונקציה ItemכDefault- תרגיל – 1התוכנ ית ShapeColl2 בתוכנית הבאה תיצור היררכיה שלושה -Classים רגילים CRect ,IShape :ו ,CCircle-כאשר CRectוCCircle- ממשים את הממשק של IShape תיצור גם Collectionהמקבל את הסוג IShapeולפיכך גם תומך ב CRect-וCCircle- .1צור פרוייקט חדש מסוג Standard EXEושמור אותו: הקצה לפרוייקט את השם SahpeColl2ולטופס את השם frmTest שמור את הפרוייקט - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 :ים-Class Module הוסף לפרוייקט ארבעה.1 Shapes- וCCircle ,CRect ,IShape ים את השמות-Class- הקצה ל שמור את הפרוייקט שוב :IShape- הוסף קוד ל.3 לפיכך הפונקציות שלו רישות ממימוש, מגדיר ממשק בלבדIShape Option Explicit Public Function Surface() As Double ' Empty inside interface End Function מחזירה את שטח הצורהSurface הפונקציה מחזירה את היקף הצורהPerimeter הפונקציה Public Function Perimeter() As Double ' Empty inside interface End Function Public Function FormatDetails() As String ' Empty inside interface End Function : מחזירה מחרוזת עם נתונים אודותFormatDetails הפונקציה סוג הצורהo פרמטרים שונים של הצורהo היקף הצורהo שטח צורהo כך שהמשמעות שתינתן לכל אחת מהפונקציות הנ"ל,CCircle- ובCRect- הממשק הנ"ל ממומש ב: זכור תהיה שונה בכל אחת מהמחלקות הללו :CCircle הוסף קוד למחלקה.1 Option Explicit Private Const PI As Double = 3.14 Implements IShape Private m_dRadius As Double Public Property Get Radius() As Double Radius = m_dRadius End Property Public Property Let Radius(dRad As Double) If dRad >= 0 Then m_dRadius = dRad End Property - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic- תכנות מונחה עצמים ב:1 שיעור Private Function IShape_Perimeter() As Double IShape_Perimeter = 2 * PI * m_dRadius End Function P 2r בתוך המעגלIShape_Perimeter מימוש הפונקציה Private Function IShape_Surface() As Double IShape_Surface = PI * m_dRadius * m_dRadius End Function S r 2 בתוך המעגלIShape_Surface מימוש הפונקציה Private Function IShape_FormatDetails() As String Dim strRes As String strRes = "CCircle" & vbCrLf strRes = strRes & String(8, " ") & "Radius = " & _ Trim(Str(Me.Radius)) & vbCrLf strRes = strRes & String(8, " ") & "Perimeter = " & _ Trim(Str(IShape_Perimeter())) & vbCrLf strRes = strRes & String(8, " ") & "Surface = " & _ Trim(Str(IShape_Surface())) & vbCrLf IShape_FormatDetails = strRes End Function : במעגל מחזיר מחרוזת המכילהFormatDetails המימוש שלם )CCircle( שם המחלקהo רדיוס המעגלo היקף המעגלo שטח המעגלo :CRect הוסף קוד למחלקה.1 Option Explicit Implements IShape Private m_dLength As Double Private m_dWidth As Double Public Property Get Length() As Double Length = m_dLength End Property Public Property Let Length(dLen As Double) If dLen >= 0 Then m_dLength = dLen End Property Public Property Get Width() As Double Width = m_dWidth End Property - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 Public Property Let Width(dWid As Double) If dWid >= 0 Then m_dWidth = dWid End Property Private Function IShape_Perimeter() As Double IShape_Perimeter = 2 * (m_dLength + m_dWidth) End Function Private Function IShape_Surface() As Double IShape_Surface = m_dLength * m_dWidth End Function Private Function IShape_FormatDetails() As String Dim strRes As String strRes = "CRect" & vbCrLf strRes = strRes & String(8, " ") & "Length = " & _ Trim(Str(Me.Length)) & vbCrLf strRes = strRes & String(8, " ") & "Width = " & _ Trim(Str(Me.Width)) & vbCrLf strRes = strRes & String(8, " ") & "Perimeter = " & _ Trim(Str(IShape_Perimeter())) & vbCrLf strRes = strRes & String(8, " ") & "Surface = " & _ Trim(Str(IShape_Surface())) & vbCrLf IShape_FormatDetails = strRes End Function : במלבן מחזיר מחרוזת המכילהFormatDetails המימוש שלם )CRect( שם המחלקהo אורך המלבןo רוחב המלבןo היקף המלבןo שטח המלבןo :Shapes- הוסף קוד ל.1 Option Explicit Private m_coll As Collection Private Sub Class_Initialize() Set m_coll = New Collection End Sub Private Sub Class_Terminate() Set m_coll = Nothing End Sub - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :1תכנות מונחה עצמים בVisual Basic- בשורות הקוד הנ"ל מוצהר אובייקט Collectionשיכיל בפועל את האובייקטים בעת אתחול האובייקט ( )Initializeיוצרים Collectionחדש בעת שחרור האובייקט ( )Terminateמשחררים את ה Collection-שהוצהר זהו למעשה קטע ה Containment-במחלקה .כלומר ,במחלקה שלנו ( )Shapesמכילה אובייקט מסוג Collection )"" = Public Sub Add(Item As IShape, Optional Key As String If Len(Key) > 0 Then m_coll.Add Item, Key Else m_coll.Add Item End If End Sub הפונקציה Addמוסיפה אובייקט לCollection- הפעולה מתבצעת ע"י הפעלת Addמתוך ה Collection-שהוצהר במחלקה העברת הפעולה מהמחלקה שלנו לאובייקט שפנימי ,m_collהיא למעשה ( Delegationהאצלה) באופן דומה ננהג בפרוצדורות הבאות )Public Sub Remove(Index As Variant m_coll.Remove Index End Sub Public Function Item(Index As Variant) As IShape )Set Item = m_coll.Item(Index End Function Public Function Count() As Long Count = m_coll.Count End Function Public Property Get NewEnum() As IUnknown ]Set NewEnum = m_coll.[_NewEnum End Property בפונקציה NewEnumהעברנו את הפעולה ל _NewEnum-של האובייקט m_coll כיוון שאסור להשתמש בקו תחתון בתחילת שם פרוצדורה או משתנה ב Visual Basic-אנו עוטפים את המילה בסוגריים מרובעים .1הגדר את תכונות הפרוצדורות במחלקה :Shapes הישאר בחלון הקוד של Shapes מתוך התפריט Toolsבחר בProcedure Attributes...- מתוך הרשימה Nameבחר בItem- לחץ על הלחצן – Advancedתיבת הדו שיח תתרחב ותכלול אפשרויות נוספות מתוך הרשימה Procedure IDבחר בDefault- כך הגדרת את הפרוצדורה Itemכפרוצדורת ברירת המחדל של Shapes בשדה Nameבחר בNew Enum- בתיבה Procedure IDרשום 4 ב Attributes-סמן Vליד Hide This Member - 132אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 אבל מומלץ להסתיר ממשתמש, כמתודה נסתרת (לא היית חייבNewEnum באופן זה הגדרת את המתודה שלו מצפה 4 את מזהה השגרהNewEnum- כמו כן נתת ל.)המחלקה את מה שהוא לא אמור להשתמש בו For Each...In...Next הלולאה Shapes לכל אחת מהפרוצדורות שלDescription כעת הוסף תיאור בשדה : והגדר את המאפיינים הבאים, אחד לטופסTextBox-ים ו-CommandButton הוסף שלושה.1 ערך Shapes Collection Demo 2 3- Fixed Dialog 2-CenterScreen cmdAddRect Add Rectangle cmdAddCircle Add Circle cmdListItems List items txtColl Button Face True 2 - Vertical ][ריק True מאפיין Caption BorderStyle StartUpPosition Name Caption Name Caption Name Caption Name Background Locked ScrollBars Text MultiLine אובייקט frmTest Command1 Command2 Command3 Text1 :הטופס אמור להיראות דומה לזה שבציור : הוסף קוד לטופס.1 Option Explicit Public shpColl As Shapes - 131 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic- תכנות מונחה עצמים ב:1 שיעור Private Sub Form_Load() Set shpColl = New Shapes End Sub Private Sub Form_Unload(Cancel As Integer) Set shpColl = Nothing End Sub Shapes מסוגCollection בשורות הנ"ל מוצהר אובייקט אובייקט זה נוצר בעת טעינת הטופס ומשוחרר עם פריקת הטופס Private Sub cmdAddCircle_Click() Dim cr As CCircle Set cr = New CCircle cr.Radius = Val(InputBox("Enter the radius for the circle:")) shpColl.Add cr Set cr = Nothing End Sub Private Sub cmdAddRect_Click() Dim rc As CRect Set rc = New CRect rc.Length = Val(InputBox("Enter the length of the rectangle:")) rc.Width = Val(InputBox("Enter the width of the rectangle:")) shpColl.Add rc Set rc = Nothing End Sub נוסף מלבן או מעגל בהתאם לבחירת המשתמש,בדומה לתרגיל הקודם Private Sub cmdListItems_Click() Dim shp As IShape txtColl.Text = "" For Each shp In shpColl txtColl.Text = txtColl.Text & shp.FormatDetails Next End Sub נקראת כדי להציגFormatDetails והפונקציהCollection- בקטע קוד זה מתבצעת סריקה של האובייקטים ב את נתוני הצורה ולפיכך אנו קוראים,IShape כאן אנו יודעים מראש שאנו ניגשים לאובייקטים מסוג, בשונה מהתרגיל הקודם Early Binding- אנו מרוויחים מהירות גבוהה המתאימה ל.FormatDetails מיד לפונקציה הקוד כאן הרבה יותר קריא, בנוסף לרווחים הביצועיים : בחינה ראשונה של התוכנית – הרצה.12 הרץ את התוכנית ובחן את פעולה 1 בדוק אם הגדרת את תכונות הפרוצדורה בשלב,For Each...In...Next אם התקבלו שגיאות בלולאה :Object Browser צפייה המחלקות באמצעות- בחינה שניה של התוכנית.11 View מתוך התפריטObject Browser- פתח את חלון ה - 131 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים מתוך רשימת ה Classes-מצא את המחלקה ( Shapesאם אינך רואה אותה ,וודא שב ComboBox-העליון בחרת > <All Librariesאו )ShapeColl2 בפנל הימני אתה אמור לראות את הפרוצדורות של Shapes שים לב שפרוצדורות מוסתרות גם מוצגות בפנל הימני .כשתיצור ( DLLבשיעור הבא) פרוצדורות אלו יוסתרו. - 133אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX DLL :11 בשיעור זה: תבין יותר את המושגים Thread ,Address Space ,ProcessוComponent- תלמד ליצור רכיבי ActiveXמסוג ActiveX DLL תלמד כיצד להשתמש ברכיבים שנכתבו כ ActiveX DLL-מתוך תוכנית אחרת תכיר את המושג Instancing תבין כיצד Windowsטוענת קובץ DLLלתוך תוכנית תלמד לטפל בשגיאות בתוך רכיבים שתכתוב מושגים בסעיף זה תכיר מספר מושגים שיוכלו לסייע לך לנצל טוב יותר את מערכת ,Windowsלהבין מהו ,Component ולהכיר טוב יותר את ההבדל בין סוגי ה-Component-ות שניתן לפתח בVisual Basic- ( Inctanceמופע) של תוכנית :ניתן להריץ תוכנית מספר פעמים .כל הרצה נפרדת של תוכנית נקראת Instanceשל התוכנית .כך למשל ,אם הרצת את Microsoft Wordשלוש פעמים ,כל הרצה כזו מהווה Instanceשל Microsoft Word ( Processתהליך) :אוסף המשאבים הדרושים להרצת Instanceשל תוכנית נקרא .Processה Process-מנהל את המשאבים הקשורים בתוכנית שרצה .משאבים לדוגמה הם :הקצאת זיכרון לתוכנית ,יצירת -Threadים (יוסבר בהמשך) ,טעינת רכיבי DLLוכו' .ברגע שתוכנית מסתיימת ,מערכת ההפעלה פורקת את ה Process-וכל המשאבים הקשורים אליו. ( Threadמטלת ביצוע) Thread :הינו רצף של פקודות שעל המחשב לבצע Thread .הינו משאב הצורך בפועל זמן מעבד .ב Process-אחד יכולים להיות מספר -Threadים שרצים בו זמנית .כך למשל ,התוכנית Microsoft Word מאפשרת לך לערוך ולהדפיס בו זמנית על ידי הרצת Threadנפרד עבור פעולת ההדפסה .בעת טעינת Process מערכת ההפעלה יוצרת באופן אוטומטי Threadעבור ה Process-שהורץ Thread .זה נקרה ה Thread-הראשי של התוכנית. ( Address Spaceמרחב כתובות) Address Space :הוא מרחב כתובות של 4( 4Gג'יגה) .לכל Processישנו מרחב זכרון משלו .תוכל להסיק מכך שאם תוכנית מנסה לגשת לכתובת מסוימת ותוכנית אחרת מנסה לגשת לאותה הכתובת ,כל תוכנית תיגש בפפועל לנתונים ייחודיים משלה – כלומר יש הגנה על מרחב הכתובות מפני -Processים אחרים .תשאל את עצמך ,בוודאי ,איך ייתכן שלכל Processישנם 4Gכתובות זכרון ,והרי זיכרון ה RAM-הוא מצומצם מאוד (בדרך כלל בין 32Mל 256M-ברוב המחשבים) .יתרה מזאת ,אם נניח שישנם -Process 50ים שרצים במקביל במערכת ,כי אז אנו מדברים על 200Gזיכרון ( .) 50 4G 200Gתפתור את עצמך מטרדה זו, בכך שתדע (מבלי שניכנס לפרטים טכניים) כי מערכת ההפעלה עושה שימוש חסכוני בכתובות על ידי שימוש במספר טריקים ,כגון שימוש ב-Page-ים (דפי זכרון)( Page Tables ,טבלאות דפים) ועוד .היבט נוסף שחשוב לשים לב אליו ,בעוד שלכל Processיש Address Spaceמשלו-Thread ,ים הרצים באותו ה Process-משתתפים באותו .Address Spaceתוכל להסיק מכך ש-Thread-ים הרצים תחת אותו Processיכולים לשתף בניהם מידע גלובלי. – Executable File( EXEקובץ ריצה) :קובץ EXEהוא קובץ תוכנית שעם הרצתו נוצר עבורו Instanceחדש, וכתוצאה מכך נוצר Processבמערכת .ל Process-שנוצר מוקצים מיד Main Thread ,Address Spaceועוד. – Dynamic Link Library( DLLספריית קישור דינמי) :קובץ DLLהוא קובץ שיכול ליצא משאבים (למשל -Iconים ,מחרוזות ועוד) ,כמו גם פונקציות .משמעות המושג ליצא היא ,שמשאבים אלו נועדו לשימושן של תוכניות אחרות ,כלומר ,תוכניות שייבאו ת המשאבים הללו.כיוון ש DLL -אינו רץ בפני עצמו ,אלא משמש תוכניות .EXEקובץ DLLהנטען על ידי תוכנית ,נטען לתוך ה Address Space-של ה.Process- - 131אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX DLL :11 ( Componentרכיב)( Component :כפי שהוסבר בפרק )8הוא רכיב בינרי Component .יכול להיות מאוחסן בקובץ DLL ,EXEועוד .נבדיל בין מספר מושגים הקשורים ב-Component -ות: ( Server Component oרכיב שרת) :זהו Componentהמספק שירותים .כך למשל ניתן לכתוב Componentמיוחד ,המספק שירותי חישובים מתמטיים ועוד. ( Client Component oרכיב לקוח) :זהו רכיב המנצל שירותים של רכיב אחר. שים לב Client Component :יכול להיות גם .Server Componentכך למשל ייתכן שComponent- מסוים מספק שירותים מסוימים ומבחינה זו הוא ,Serverאך במקביל מנצל שירותים של Component אחר כדי להשלים את המשימה ,ובחינה זו הוא .Client ( In Process Component oרכיב תוך תהליכי) :זו Componentהנטען אל תוך Address Spaceשל Processקיים .חשוב למשל על Controlמיוחד המציג לוח שנה ,וממוקם על טופס בתוכנית שלך .רכיב זה הינו חלק מהתוכנית והוא נטען לתוך התוכנית. ( Out Of Process Component oרכיב חוץ תהליכי) :זהו רכיב הרץ כתוכנית עצמאית ומספק שירותים לתוכניות אחרות .חשוב למשל על התוכנית שלך המריצה את Microsoft Wordכדי לננצל את שירותי האיות ( )Spellingשל .Microsoft Wordבמקרה זה ה Server Component-הנו התוכנית Wordהרצה ב Process-נפרד ( Wordהיא תוכנית EXEולכן היא רצה כתוכנית עצמאית) יצירת ACTIVEX DLL יש לבחור את הפרוייקט ActiveX DLL יש להבחין בין -DLLים שנוצרים ב Visual Basic-לבין -DLLים רגילים-DLL .ים הנוצרים ב Visual Basic-הם מסוג ActiveXולפיכך מהווים ספריות של רכיבים .ב DLL-מסוס זה אין גישה ישירה לפונקציה מסוימת ,אלא קיימת אפשרות ליצור רכיב .לאחר שהרכיב נוצר ניתן לפנות למתודות שלו .כלומר -DLLים של ActiveX מייצאים רכיבים ולא פונקציות-DLL .ים רגילים של Win32מייצאים פונקציות. כל רכיב ב DLL-נכתב ב Class Module-נפרד יצירת אובייקטים יישום לקוח יכול המעוניין להשתמש ברכיבים מספרייה חיצונית יכול לבצע זאת במספר דרכים: הוספת הפניה ב ,Project References-ולאחר מכן יצירת אובייקט באמצעות המילה .New יצירת אובייקט והמתו למשתנה מסוג Objectבאמצעות הפונקציה ( CreateObjectבמקרה כזה יהי שימוש ב .Late Binding-כדי להמנע מכך ,ניתו ליצור משתנה מסוג האובייקט ,ולהוסחף את ההפניה המתאימה ב)Project References- באמצעות הפונקציה CreateObjectניתן ליצור אובייקטים גם במחשבים מרוחקים .פשוט יש להעביר את שם המחשב ברשת כפרמטר שני לפונקציה לפי התחביר הבא: )CreateObject(component_name, computer_name הצגת ממשק משתמש רכיב DLLיכול ליצור ממשק משתמש למשל על ידי קריאה לפונקציה MsgBox ניתן למנוע הצגת ממשק משתמש על ידי הרכיב אם מסמנים Vליד האפשרות Unattended Execution בכרטיסיית Generalבחלון הProject Properties- אם רכיב שהוגדר עבור Unattended Executionמנסה להציג ממשק משתמש ,תירשם הודעה בקובץ ה Log-של המערכת (ב Windows 2000-ניתן לצפות בהודעה מתוך חלון ה Event Viewer-תחת הקטגוריה Application .Logהיישום Application Viewerנמצא תחת )Administrative Tools - 131אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים ניהול קבוצת פרוייקטים במקביל בעת פיתוח רכיב יש לבחון אותו במקביל לפיתוח ניתן ליצור קבוצת פרוייקטים ב Visual Basic-ולנהל אותם במקביל Visual Basicיוצרת קובץ פרוייקט ( )*.vbgהשוקב אחר מיקום הפרוייקטים ומנהל אותם אני ממליץ בפניך ליצור ספרייה עבור קבוצת הפרוייקטים .תחת ספרייה זו צור תתי ספריות עבור כל פרוייקט בקבוצת הפרוייקטים .את הקבצים של כל פרוייקט שמור בספרייה השייכת לפרוייקט ,ואת קובץ הפרוייקט שמור תחת ספריית הקבוצה תרגיל – 1ספריית הרכיבים SecurityLib בתרגיל זה ניצור רכיב DLLהמאפשר הצגת מסך ,Loginובדיקת וסיסמה הפונקציה Loginתציג את מסך ה .Login-אם הסיסמה שהוכנסה תקינה ,הפונקציה תחזיר ,Trueאחרת יוחזר Flase בדוגמה זו אנו מניחים שהמשתמש היחד הוא " "superuserושסיסמתו היא " ,"1234ברור עם זאת שביישום אמיתי תכתוב משהו קצת פחות טיפשי .1צור קבוצת פרוייקטים ActiveX DLLו:Standard EXE- פתח את Visual Basicיחד עם פרוייקט מסוג ActiveX DLL שנה את שם הפרוייקט לSecurityLib- בתוך הפרוייקט ישנו .Class Moduleשנה את שמו לCLogin- הוסף פרוייקט Standard EXEעל ידי בחירת האפשרות Add Projectמהתפריט File שנה את שם הפרוייקט ל TestLib-ואת שם הטופס שבו לfrmTestLib- .1שמור את קבוצת הפרוייקטים: בעת לחיצה על Saveייפתח חלון השמירה .צור ספרייה בשם Securityותחת ספרייה זו צור שתי ספריות בשם SecurityLibוTestLib- את קבצי פרוייקט ה ActiveX DLL-שמור תחת הספרייה SecurityLibואת קובצי פרוייקט הStandard - EXEשמור תחת הספרייה TestLib לאחר שתשמור את הפרוייקטים Visual Basicתבקש ממשך לשמור את קובץ קבוצת הפרוייקטים .שנה את שם הקובץ ל grpSecurity.vbg-ושמור אותו תחת הספרייה Security .3הוסף טופס לספריית הרכיבים: בחלון ה Project Explorer-בחר בפרוייקט ( SecurityLibאם אינך רואה את חלון ה Project Explorer-תוכל לבחור אותו מתוך התפריט Viewאו על ידי הצירוף )Ctrl+R הוסף טופס על ידי בחירת האפשרות Add Formמתוך התפריט Project שנה את שם הטופס לfrmLogin- שמור את הטופס תחת הספרייה השייכת לפרוייקט )\Security\SecurityLib\( SecurityLib עצב את הטופס :frmLogin הוסף שני -TextBoxים ,שני -CommandButtonים ושני -Labelים לטופס ,והגדר את המאפיינים הבאים: אובייקט frmLogin Label1 Label2 מאפיין Caption BorderStyle StartUpPosition Name Caption TabIndex Name ערך Login 3- Fixed Dialog 1-CenterOwner lblUsername &Username 0 lblPassword - 131אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il ActiveX DLL :11 שיעור &Password 2 txtUsername ][ריק 1 txtPassword 8 * ][ריק 3 cmdOK &OK True cmdCancel &Cancel True Caption TabIndex Name Text TabIndex Name MaxLength PasswordChar Text TabIndex Name Caption Default Name Caption Cancel Text1 Text2 Command1 Command2 :הטופס אמור להיראות בדומה לציור שלפניך :frmLogin הוסף קוד לטופס.1 Option Explicit Private m_strUsername As String Private m_strPassword As String שני המשתנים הללו יכילו את שם המשתמש והסיסמה לאחר שהטופס יוסר Private Sub cmdOK_Click() m_strUsername = txtUsername.Text m_strPassword = txtPassword.Text Unload Me End Sub והטופס מפורקm_strPassword- וm_strUsername מועברים מעוגכנים ערכי המשתניםOK בעת לחיצה על Unload על ידי המתודה ברגע. עדיין קיימים בזכרוןm_strPassword- וm_strUsername למרות שהטופס מפורק המשתנים:שים לב . יפורקו גם המשתנים הללוSet...= Nothing ידי-שהטופס ישוחרר מהזכרון על - 131 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 Private Sub cmdCancel_Click() Unload Me End Sub m_strPassword- וm_strUsername הטופס מפורק מבלי לעדכן אתCancel בעת לחיצה על Public Property Get Username() As String Username = m_strUsername End Property Public Property Get Password() As String Password = m_strPassword End Property m_strPassword- וm_strUsername שני פרוצדורות המאפיינים הללו מאפשרים לאחזר את ערכם של :CLogin הוסף קוד למחלקה.1 Option Explicit Public Function ShowLogin() As Boolean Dim loginForm As New frmLogin loginForm.Show vbModal If LCase(loginForm.Username) = "superuser" And _ loginForm.Password = "1234" Then ShowLogin = True Else ShowLogin = False End If Set loginForm = Nothing End Function ומציגה אותו למשתמש במצב מודאליfrmLogin של הטופסInstance יוצרתShowLogin הפונקציה אם.loginForm שלPassword- וUsername נבדקים המאפייניםCancel אוOK לאחר שהמשתמש לחץ על False אחרת יוחזר,True אזי מוחזר מהפונקציה הערך," בהתאמה1234"–" וsuperuser"-הם שווים ל :TestLib עבור לפרוייקט.1 Project Explorer- בחלון הTestLib לחץ על שם הפרוייקט :frmTestLib עצב את הטופס :ים והגדר את המאפיינים הבאים-CommandButton שניfrmTestLib הוסף לטופס ערך Test Login 3- Fixed Dialog 2-CenterScreen cmdUseNew Use "Set ...New" cmdUseCreate Use "CreateObject (...)" מאפיין Caption BorderStyle StartUpPosition Name Caption Name Caption - 131 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il אובייקט frmTestLib Command1 Command2 שיעור ActiveX DLL :11 הטופס אמור להיראות דומה לזה שבציור שלפניך: .1הוסף Referenceלפרוייקט :SecurityLib מתוך התפריט Projectבחר באפשרות References סמן Vליד הספרייה SecurityLib שים לב :ללא הפניה זו לא תוכל ליצור אובייקטים או משתנים מהסוג CLoginבתוך יישום הלקוח (במקרה הזה התוכנית )TestLibתוך שימוש במילה .Newעם זאת ,תוכל ליצור אובייקטים באמצעות הפונקציה CreateObjectתוך ציון שם הספרייה ושם הרכיב בספרייה ,כלומר )"CreateObject("SecurityLib.CLogin .1הוסף קוד לטופס :frmTestLib Option Explicit )(Private Sub cmdUseNew_Click Dim sec As New SecurityLib.CLogin If sec.ShowLogin() Then "!MsgBox "You are succesfull logged in Else "!MsgBox "Login Failed End If Set sec = Nothing End Sub בתגובה לליחצה על cmdUseNewיוצרים מופע של המחלקה CLoginמתוך הספרייה SecurityLib לאחר מכן מפעילים את הפונקציה ShowLoginומציגים הודעה למשתמש באמצעות Message Boxעל פי התוצאה המוחזרת מShoLogin- )(Private Sub cmdUseCreate_Click Dim sec As Object )"Set sec = CreateObject("SecurityLib.CLogin If sec.ShowLogin() Then "!MsgBox "You are succesfull logged in Else "!MsgBox "Login Failed End If Set sec = Nothing End Sub פונקציה זו זהה לקודמת אלא שהפעם האובייקט נוצר באמצעות CreateObjectומושם לתוך משתנה מסוג Object - 112אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים .1 .12 .11 .11 קבע את ה:Start Up Project- לפני שתנסה להריץ את הפרוייקט עליך לקבוע איזה פרוייקט יופעל על ידי Visual Basic בחלון ה Project Explorer-לחץ לחיצה ימנית על הפרוייקט .TestLibבתגובה יוצג תפריט מוקפץ שהאפשרות הראשונה בו היא .Set As Start Upבחר באפשרות זו. שים לב ש Visual Basic-הדגישה את שם הפרוייקט בחינה ראשונה של הפרוייקט: הרץ את התוכנית באמצעות F5ובחן את פעולתה בחינה שניה של הפרוייקט: בטל את ה Reference-לספרייה SecurityLibעל ידי הסרת סימן ה V-מתיבת הדו שיח .References (לפתיחת תיבת דו שיח זו בחר ב References-מתוך התפריט )Project נסה להריץ את הפרוייקט .שים לב כי לחיצה על הלחצן " Use "Set...Newתגרום לשגיאה ,ואילו שימוש ב Use "CreateObject (...)"-ימשיך לפעול שמור את הפרוייקטים: החזר את ה Reference-שביטלת שמור את הפרוייקטים אם אתה לא הולך לישון ,השאר את הפרוייקטים פתוחים .בתרגיל הבא נעשה שימוש בקובוצת פרוייקטים זו ( Instancingיצירת מופעים) לכל Class Moduleישנו מאפיין Instancingהמגדיר כיצד ניתן ליצור אובייקטים מסוג המחלקה המאפיין Instancingמשפיע על אופן יצירת האובייקטים על ידי תוכנית חיצונית המשתמשת בספריית הרכיבים. מאפיין זה אינו משפיע על אופן יצירת הרכיבים מתוך הפרוייקט עצמו. Instancingעבור Classבפרוייקט מסוג ActiveX DLLמאפשר את הערכים הבאים: :Privateה Class-הוא פרטי של הפרוייקט .יישומים חיצוניים אינם יכולים ליצור אובייקטים מסוג המחלקה. יתרה מכך ,יישומים חיצוניים אינם יכולים להצהיר אפילו על משתנים מסוג המחלקה .כלומר ,ה-Class-ים הללו פרטיים באופן מוחלט בפרוייקט ואינם מוכרים כלל מיישומים חיצוניים. :PublicNoCreatableה Class-יהיה מוכר ביישומים חיצוניים באופן כזה שניתן להצהיר על משתני ייחוס מסוג האובייקט הזה .עם זאת ,יישומים חיצוניים אינם יכולים ליצור בעצמם אובייקטים מסוג המחלקה. :MultiUseכל האובייקטים הנוצרים על ידי יישום חיצוני משתתפים בעותק אחד של ה .Class-ברור שעבור המשתנים הפנימיים של ה Class-נוצרים העתקים עבור כל יצירת אובייקט על ידי יישום לקוח ,עם זאת ,הקוד מופיע פעם אחת. :GlobalMultiUseזהה ל MultiUse-אלא שהיישום החיצוני אינו חייב.ליצור עותק של האובייקט .כלומר באופן אוטומטי נוצר אובייקט כזה על ידי ספריית הרכיבים .כמו כן ,היישום יכול לפנות לפונקציות של המחלקה ללא הקדמת שם אובייקט .אם לדוגמה קיימת מחלקה בשם CStatisticsהכוללת את הפונקציה ,StdDevאפשר להשתמש בפונקציה פשוט על ידי רישום ) StdDev(...כאילו היה מדובר בפונקציה גלובלית. שים לב :בכל פרוייקט ActiveXחייב להיות לפחות Classאחד הניתן ליצירה תרגיל – 2שינוי המאפיין Instancingבמחלקה CLogin בתרגיל זה ננסה את האפשרות GlobalMultiUseבמקום MultiUse .1פתח את קבוצת הפרוייקטים :grpSecurity.vbg אם סגרת את קבוצת הפרוייקטים grpSecurityתוכל לפתוח אותה מתוך הסייר על ידי לחיצה כפולה על שם הקובץ grpSecurity.vbg .1שנה את המאפיינן :Instancing שנה את המאפיין Instancingשל המחלקה CLoginלGlobalMultiUse- שמור את הפרוייקט - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX DLL :11 .3בחינה ראשונה: הרץ את הפרוייקט שים לב שהכל פועל כרגיל .1בחינה שניה: הוסף CommandButtonנוסף לטופס שנה את שמו ל cmdUseGlobal-ואת הכותרת שלו ל"Use Global"- הוסף את הקוד הבא בתגובה ללחיצה על :cmdUseGlobal )(Private Sub cmdUsetGlobal_Click If ShowLogin() Then "!MsgBox "You are succesfull logged in Else "!MsgBox "Login Failed End If End Sub שים לב כי הפונקציה ShowLoginמופעלת כאילו הייתה פונקציה גלובלית .דבר זה מתאפשר הודות להגדרת CLoginכ .GlobalMultiUse-במקרה זה נוצר עבורנו אובייקט מסוג CLoginבעת שהתוכנית מופעלת והפונקציות שלה נחשפות באופן אוטומטי .כמו כן שים לב שאתה יכול לרשום SecurityLib.ShowLogin כאילו מדובר בפונקציה גלובלית של הספרייה .1שמור את קבוצת הפרוייקטים: מתוך התפריט Fileבחר בSave- אם עדיין לא נרדמת אז תיאר ער עוד קצת .בתרגיל הבא נסיים את העבודה על קבוצת הפרוייקטים הזו. הגדרת כתובות בסיס לרכיבי DLL רכיב ( DLLכפי שהוסבר בתחילת השיעור) נטען לתוך ה Address Space-של תוכנית הלקוח בעת קימפול הרכיב ,קריאות לפונקציות מתפרשות לפי כתובות הפונקציות .לדוגמה ,אם נניח שפונקציה מסוימת נמצאת במרחק ( &H00000100 )Offsetמתחילת ה DLL-ואותו DLLקומפל מתוך הנחה שייטען לכתובת &H11000000בתוכנית הלקוח (זוהי כתובת הבסיס) ,אזי כתובת הפונקציה לאחר הקימפול תהיה ( &H11000100כתובת בסיס +כתובת היסט) כאשר תוכנית משתמשת במספר -DLLים סביר מאוד ששני -DLLים או יותר ינסו להיטען לאותה כתובת בסיס אם DLLמנסה להיטען לכתובת בסיס שנתפסה כבר על ידי DLLאחר ,מערכת ההפעלה Windowsמקצה כתובת בסיס ייחודית עבור הרכיב כדי למנוע התנגשויות .בנוסף ,מערכת ההפעלה משנה את הכתובות כך שיתאימו לכתובת הבסיס החדשה .פעולה זו נקראת .Rebasingשינוי כתובות הבסיס כרוך בזמן טעינה ארוך יותר. ניתן להגדיר את כתובת הבסיס שלפיה יתבצע קימפול הרכיב מתוך הכרטיסייה Compileבתיבת הדו שיח Project Properties כתובת ברירת המחדל היא &H11000000ומומלץ לשנות אותה ,כיוון שסביר להניח שישנם לא מעט רכיבים שכתובת זו מוקצת עבורם - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים בעת הגדרת כתובת בסיס זכור את הכללים הבאים: oעל כתובת הבסיס להיות כפולה של ( 64Kבהקצהדצימלית ,)&H10000כלומר ארבע הספרות האחרונות של כתובת הבסיס יהיו .0000 Address Space oשל Processכולל 4Gכתובות .עם זאת ,הכתובות הבאות שמורות עבור מרכיבים שונים של :Windows ב Windows NT/2000-וכן ב ,Windows 98-רצץ הכתובות בין ( 2Gהכתובת )&H80000000 לבין ( 4Gהכתובת )&HFFFFFFFFשמורות עבור Windows ב Windows98-רצף הכתובות המתחילות ב &H00000000-לבין ( &H0040000כלומר 4M הזיכרון התחתון) שמור גם הוא לWindows- ב 64k WindowsNT/2000-הזיכרון התחתון (כלומר הרצף )&H00000000-&H00010000 שמור למערכת ההפעלה ,וכן 64Kמתחילים ברצף &H7FFF0000עד )&H80000000 oאני ממליץ לשנות את כתובת הבסיס כך שתהיה כפולה של 64Kבין הכתובת &H40000000לבין ( &H80000000כלומר בין 1Gל)2G- תרגיל – 1שינוי כתובת הבסיס לספרייה Securi tyLib בתרגיל זה נשנה את כתובת הבסיס לטעינת הDLL .1פתח את קבוצת הפרוייקטים שכתבנו בתרגילים הקודמים .1בחר בפרוייקט :SecurityLib מתוך קבוצת הפרוייקטים המוצגים בחלון ה Project Explorer-בחר בSecurityLib- .3שנה את כתובת הבסיס: בחר באפשרות SecurityLib Properties...מתוך התפריט Project עבור לכרטיסייה Compile בשדה DLL Base Addressהמופיע בתחתית תיבת הדו שיח שנה את הכתובת לערך &H80000000ולחץ .OKאתה אמור לקבל הודעה כי כתובת זו אינה חוקית .נסה את הכתובות הבאות: כתובת 0אינה חוקית &H00000000 o כתובת שאינה כפולה של 6kKאינה חוקית (בכתובות שהן כפולה של 64K &H40001000 o ארבע הספרות הימניות הן )0 כתובת חוקית &H4001000 o שמור את הפרוייקט: שמור את הפרוייקט וסגור אותו טיפול בשגיאות ברכיב בעת יצירת רכיב שים לב שעל הרכיב שלך לטפל בכל השגיאות העלולות להתרחש במהלך החיים שלו שגיאה המתרחשת ברכיב ואינה זוכה לטיפול תגרום לקריסת תוכנית הלקוח (חשוב איך יגיבו המשתמשים של הרכיב שלך ברגע שהם יגלו שאתה הוא הבאג שלהם!!!) תוכל לטפל בשגיאות הן ע"י פתרון הבעיה בתוך הרכיב או ע"י שיגור שגיאה (מותאמת אישית או המקורית) החוצה אל תוכנית הלקוח כדי להקצות מספר לשגיאה מותאמת אישית עליך להוסיף מספר בין 512ל 65535-לקבוע vbObjectError תוכל לעורר את השגיאה באמצעות המתודה Raiseשל האובייקט Err שים לב ,אם בתוך הרכיב שלך מתבצע טיפול בשגיאות ואתה רוצה לעורר שגיאה ללקוח ,קרא תחילה לOn Error - ,GoTo 0כדי לבטל את מטפל השגיאות הפעיל שים לב :אל תנסה לעורר שגיא ללקוח מתוך אירוע השייך לאובייקט .לשגיאה כזו אין מקום לכידה בתוך תוכנית הלקוח ,ולפיכך היא תקרוס. - 113אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX DLL :11 תרגיל : 4ספריית הרכיב ים DynamicArray בדוגמה זו ניצור ספריית רכיבים בשם DynamicArrayשתכיל רכיב אחד בשם CDynamicArray בשונה מהתרגיל הקודם ,בתרגיל זה נקמפל את ה DLL-ונטען אותו לתוכנית שניה. רכיב זה ישמש כמערך דינמי המשנה את גודלו באופן אוטומטי כאשר מכניסים איבר באינדקס מסוים שאינו מוקצה באותו שלב במערך האינדקסים במערך רצים מ 2-עד ( n 1כאשר nהוא גודל המערך) ניסיון לגשת לאינדקס שלילי יגרום לשגיאה ניסיון לקריאה ( )Property Getשל איבר באיננקס שעדיין לא הוקצה גורם לשגיאה שים לב כי הרכיב מטפל בכל השגיאות ,ע"י פתרון שלהם (כמו שינוי ממדי המערך) או העברה שלהם החוצה ,אל רכיב הלקוח בשיעור הקודם הכרנו את אפשרות הגדרת התכונות עבור פרוצדורות של מחלקה .בתרגיל זה נשתמש באפשרות זו. .1צור פרוייקט חדש מסוג ,ActiveX DLLושמור אותו: הקצה לפרוייקט את השם DynamicArrayולמחלקה CDynamicArray שמור את הפרוייקט .2הוסף משתנים למחלקה: המחלקה תכיל מערך דינמי פנימי Private m_anValues() As Integer .3הוסף את המאפיין :Count המאפיין Countמחזיר את גודל המערך (אחד מעל האינדקס האחרון במערך) תוך שימוש בפונקציות LBoundוUBound- אם לא הוקצו איברים למערך תתרחש שגיאה .לוכדים שגיאה זו כדי להחזיר גודל מערך 0 Public Property Get Count() As Integer On Error GoTo Err_Handler Count = UBound(m_anValues) - LBound(m_anValues) + 1 Exit Property Err_Handler: Count = 0 End Property .1הוסף את השגרה :Clear השגרה Clearמשחררת את הזיכרון שהוקצה עבור המערך תוך שימוש במילה השמורה Erase )(Public Sub Clear Erase m_anValues End Sub .1הוסף את המאפיין :Item המאפיין Itemמקבל אינדקס במערך ומאפשר לאחזר או לקבוע את ערכו כאשר מעבירים מספר פרמטרים ל Property Let-הפרמטר האחרון יהווה את סוג המאפיין יש להקפיד שכל הפרמטרים (מלבד האחרון ב )Property Let-שב Property Get-וב Property Let-יהיו זהים בסוגם ובשמם) - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים Public Property Get Item(ByVal n As Integer) As Integer On Error GoTo Err_Handler )Item = m_anValues(n Exit Property Err_Handler: Err.Raise Err.Number End Property )Public Property Let Item(ByVal n As Integer, ByVal value As Integer On Error GoTo Err_Handler m_anValues(n) = value Exit Property Err_Handler: If n > 0 Then )ReDim Preserve m_anValues(n Resume Else Err.Raise Err.Number End If End Property .1הוסף תיאורים לממשק המחלקה: בעת שימוש באובייקטים ניתן לבחון את מאפייניהם תוך שימוש ב( Object Browser-ניתן לפתוח את ה Object Browser-באמצעות F2או מתוך תפריט )View מתוך התפריט Toolsבחר בProcedure Attributes- מתוך התיבה Nameבחר ב Clear-והקלד את התיאור הבא בשדה :Description Free the memory occupied by the array. באופן דומה הוסף את התיאור הבא למאפיין :Count Returns the number of items in the array. ואת התיאור הבא למאפיין :Item Sets/Returns the value of an item in the array. אל תסגור את חלון ה Procedure Attributes-אתה צריך אותו לשלב הבא הגדר את Itemכמאפיין ברירת מחדל: להזכירך ,מאפיין ברירת מחדל הוא המאפיין שיופעל במקרה שלא צוין במפורש שם מאפיין (לדוגמה ,המאפיין Textהוא מאפיין ברירת המחדל של )TextBox בחר במאפיין Itemבתיבה Nameולחץ על הלחצן Advanced כעת ,כדי להפוך את Itemלמאפיין ברירת מחדל ,ב Procedure ID-בחר ב)Default(- .1בצע קומפילציה לספריית הרכיבים: מתוך התפריט Fileבחר ב...Make DynamicArray.dll- התוכנית תקומפל ו Visual Basic-תרשום את הרכיב באופן אוטומטי במערכת אם התגלו שגיאות ,תקן אותן וקמפל מחדש את הפרוייקט - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX DLL :11 .1 .1 .12 .11 צור תוכנית לקוח לבחינת ספריית הרכיבים: הפעל את Visual Basicמחדש ופתח פרוייקט Standard EXE הקצה לפרוייקט את השם TestDArrayולטופס שבו את השם frmTestDArray שמור את הפרוייקט הוסף הפנייה לספריית הרכיבים: מתוך התפריט Projectבחר בפריט References סמן Vליד הספרייה ( DynamicArrayשים לב שלא היית צריך לבצע רישום של הרכיב ,כי Visual Basic ביצעה זאת עבורך בעת קימפול הספרייה בשלב )1 שים לב :אם תרצה לערוך ולאחר מכן לקמפל את ה DLL-כאשר יש הפניה אליו מתוך הפרוייקט ,TestDArray יהיה עליך להסיר את ההפניה כדי שהקמפול יצליח. בחינה ראשונה :ה:Object Browser- פתח את ה Object Browser-מתוך התפריט Viewאו ע"י שימוש בקיצור F2 בחר ב CDynamicArray-ועיין במאפיינים והמתודות המוצגים בפנל הימני של החלון שים לב שתיאור המאפיינים והמתודות מופיע בתחתית החלון של הObject Browser- שים לב כי ליד סמל המאפיין Itemמופיע עיגול כחול קטן המעיד כי זהו מאפיין ברירת המחדל סגור את חלון הObject Browser- הוסף Controlsלטופס: הוסף Controlsלטופס כפי שמוצג בציור הבא: .11הוסף קוד לטופס: הקוד הבא מצהיר על אובייקט מסוג CDynamicArray Private m_DArray As DynamicArray.CDynamicArray הוסף קוד לטופס: הקוד הבא מאתחל את ממשק המשתמש ויוצר Instanceשל :CDynamicArray )(Private Sub Form_Load ' Initializations: "Me.Caption = "Test Dynamic Array "" = txtIndex.Text "" = txtValue.Text "cmdGet.Caption = "&Get "cmdLet.Caption = "&Let "cmdCount.Caption = "&Count "cmdClear.Caption = "Clea&r ' Create the dynamic-array class Set m_DArray = New CDynamicArray End Sub - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים .13הוסף קוד לטופס: הקוד הבא פועל בתגובה ללחיצה על אחד הלחצנים שים לב שאין חובה לציין במפורש את המאפיין Itemבעת השימוש בו ,כיוון שזהו מאפיין ברירת המחדל. כלומר הרישום m_DArray(1) = 100כמוהו כרישום m_DArray.Item(1) = 100 )(Private Sub cmdClear_Click m_DArray.Clear End Sub )(Private Sub cmdCount_Click "MsgBox "The array contains " & Str(m_DArray.Count) & " items End Sub )(Private Sub cmdGet_Click )))txtValue.Text = Str(m_DArray(Val(txtIndex.Text End Sub )(Private Sub cmdLet_Click )m_DArray(Val(txtIndex.Text)) = Val(txtValue.Text End Sub בחינה שניה :הרצת הפרוייקט: הרץ את התוכנית ובצע את הפעולות הבאות (לפי הסדר) לחץ על :Countאתה צריך לקבל 0 לחץ על :Getאתה אמור לקבל שגיאה .זוהי השגיאה שהרכיב מעורר כשמנסים לקרוא פריט שאינו קיים (עיין בקוד הרכיב לפרטים נוספים) הרץ שוב את הפרוייקט והזן ערך למערך .בשדה Indexבחר באינדקס המתאים ובשדה Valueבחר בערך עבור אותו פריט לאחר מכן לחץ .Letבאופן זה הזן מספר ערכים השתמש ב Get-כדי לאחזר את הערכים הללו השתמש ב Count-כדי לקבל את מספר האיברים החדש במערך השתמש ב Clear-כדי לרוקן את המערך נסה להזין ערך למערך באינדקס שלילי כלשהו ,אתה אמור לקבל שגיאה שהרכיב מעורר (עיין בקוד הרכיב לפרטים נוספים) - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :11כתיבת Stored ProceduresבSQL Server- בשיעור זה: תבין מהם Stored Proceduresותלמד כיצד להוסיף Stored Procedureל Database-של SQL Server תלמד לכתוב Stored Procedureהמקבלים פרמטים תכיר מבני בקרה שונים בTransact SQL- STORED PROCEDURES Stored Procedureהיא פרוצדורה המאוחסנת בתוך הDatabase- Stored Procedureיכול לקבל פרמטרים ולפיכך יכול לשמש לבקשות שונות Stored Procedureמקומפל בתוך ה Database-ולפיכך כל תהליך ה( Parsing-ניתוח המשפט)בניית הExecution - ( Planמסלול הביצוע) נחסכים כדי להבין את היתרון שבהפעלת Stored Procedureמתוך תוכנית לקוח לעומת בניית משפט SQLושליחתו לביצוע ל Database-על ידי תוכנית לקוח ,נבחן את תהליך הביצוע בשני המקרים על ידי ה:Database- תהליך הביצוע של משפט SQLהנשלח על ידי לקוח נניח כי תוכנית לקוח יוצרת את משפט ה SQL-הבא ושולחת אותו לביצוע ב:Database- * SELECT FROM Employees WHERE EmployeeID = 10 .1 .1 בתוך ה:Database- מתבצע ניתוח סינטקטי (תחבירי) של המשפט קיום הטבלה Employeesנבדק ,כמו כן נבדקות הרשאות הגישה לטבלה זו על ידי המשתמש המפעיל את משפט הSQL- נוצר Execution Planעבור משפט הSQL- ( Execution Planהיא תוכנית הביצוע של משפט ה SQL-הכוללת הנחיות כיצד יש לסרוק טבלאות כדי לאתר את הרשומות ,האם יש להשתמש באינדקסים ,בצירוף טבלאות ,כיצד יש למזג את הטבלאות וכו') משפט ה SQL-מופעל והתוצאות מוחזרות למשתמש נניח שאותו משפט SQLנשלח שוב על ידי תוכנית הלקוח ב Database-ישנו אזור זיכרון הכולל את משפטי ה SQL-האחרונים שהורצו וכן אזור נוסף הכולל את הרשומות האחרונות שהתקבלו כתוצאהמהפעלת משפטי . SQLאם התמזל מזלך ,משפט ה SQL-יימצאו בתוצאות עבור שאילתה זו ,או לפחות המשפט עצמו .במקרה כזה ,חלק מהשלבים שצוינו קודם יחסכו אם המשפט אינו נמצא בין המשפטים האחרונים שבוצעו (זה יקרה אם עבר זמן רב מאז הרצת המשפט ,כי אז אזורי הזכרון הללו פינו את מקומם למשפטים חדשים .ככה זה בשיטת )LRUכל השלבים שתוארו קודם יבוצעו שוב נניח שהמשפט הבא נשלח על ידי תוכנית הלקוח: לכאורה נראה כי שני משפטי ה SQL-זהים רק התנאי שונה ,ובכל זאת אלו הם שני משפטי SQLשונים לגמרי וכל התהליך שבוצע קודם יבוצע שוב עד להחזרת הרשומות לתוכנית הלקוח .מדוע? כיוון שלכל משפט SQLהרץ .3 .1 * SELECT FROM Employees WHERE EmployeeID = 18 - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :11כתיבת Stored ProceduresבSQL Server- תהליך הביצוע של בקשה ל הפעלת Stored Procedureמתוך תוכנית לקוח נניח כי ב Database-מאוחסנת פרוצדורה בשם GetEmployeeהמקבלת כפרמטר מספר המזהה את מספר העובד ()EmployeeID תוכנית הלקוח שולחת בקשה לקבל את פרטי העובד שמספרו 10 בתוך ה:Database- .1נבדק כי הפרמטר שהועבר תקין .1מופעלת הפרוצדורה (שים לב כי הפרוצדורה כבר מקומפלת ואין צורך לקמפל אותה מחדש ,לפיכך כל השלבים שתוארו במקרה הקודם נחסכים) כעת נניח כי תוכנית הלקוח מבקשת את פרטי העובד שמספרו .18בקשה כזו לא תיחשב כבקשה שונה מהקודמת כיוון שמספר העובד מועבר כפרמטר לפרוצדורה כתיבת STORED PROCEDURESבSQL SERVER- פרוצדורות ב SQL Server-נכתבות בTransact SQL- Transact SQLזוהי ההרחבה של שפת SQLהסטנדרטית במערכת ( SQL Serverבדיוק כפי ש PL SQL-היא ההרחבה של שפת SQLבמערכת )Oracle פרוצדורה פשוטה ללא פרמטרים CREATE PROCEDURE proc_name AS statements... GO דוגמה 1 הוספת Stored ProcedureלNorthwind- (לקוח מתוך )Microsoft SQL Server 7 Administrator Companion הפרוצדורה LateShipmentsמחזירה את תאריך המבוקש למשלוח ( ,)RequiredDateתאריך המשלוח בפועל ( )ShippedDateושם חברת המשלוחים ( CompanyNameמהטבלה )Shippersעבור כל אותן הזמנות שהמשלוח הגיע באיחור דוגמה זו לקוחה מהספר Microsoft SQL Server 7.0 Administator Companion CREATE PROCEDURE LateShipments AS SELECT RequiredDate, ShippedDate, Shippers.CompanyName FROM Orders, Shippers = WHERE ShippedDate > RequiredDate AND Orders.ShipVia Shippers.ShipperID GO הפעלת הפרוצדורה ב:Query Analyzer- oאם זהו המשפט הראשון שמופעל מתוך סדרת משפטים ,ניתן לרשום: LateShpments - 112אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 :אם זהו אינו המשפט הראשון יש לרשום EXECUTE LateShipments או EXEC LateShipments פרוצדורה המקבלת פרמטרי ם CREATE PROCEDURE proce_name @parameter1 type, @parameter2 type... AS statements... GO 2 דוגמה אלא שכאן מועבר שם חברת המשלוח כפרמטר ומוצגות רק השורות של חברה זו,דוגמה זו זהה לדוגמה הקודמת Microsoft SQL Server 7.0 Administator Companion דוגמה זו לקוחה מהספר CREATE PROCEDURE LateShippmentsByShipperName @shipperName char(40) AS SELECT RequiredDate, ShippedDate, Shippers.CompanyName FROM Orders, Shippers WHERE ShippedDate > RequiredDate AND Orders.ShipVia = Shippers.ShipperID AND Shippers.CompanyName = @shipperName GO :Query Analyzer הפעלת הפרוצדורה מתוך EXECUTE LateShipmentsByShipperName "Speedy Express" הג ד רת ערך ברירת מחדל לפרמטרים CREATE PROCEDURE proce_name @parameter1 type [= deft_val], @parameter2 type [= def_val]... AS statements... GO 1 דוגמה דוגמה זו מציבה בפרוצדורה הקודמת ערך ברירת מחדל עבור שם חברת המשלוחים Microsoft SQL Server 7.0 Administator Companion דוגמה זו לקוחה מהספר CREATE PROCEDURE LateShippmentsByShipperName @shipperName char(40) = "United Package" AS SELECT RequiredDate, ShippedDate, Shippers.CompanyName FROM Orders, Shippers WHERE ShippedDate > RequiredDate AND Orders.ShipVia = Shippers.ShipperID - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור :11כתיבת Stored ProceduresבSQL Server- AND Shippers.CompanyName = @shipperName GO הפעלת הפרוצדורה מתוך :Query Analyzer EXECUTE LateShipmentsByShipperName "EXECUTE LateShipmentsByShipperName "Speedy Express החזרת ערך מפרוצדורה באמצעות משת נה CREATE PROCEDURE proce_name @parameter1 type [= deft_val] OUTPUT,... AS statements... GO דוגמה 4 בדומה הבאה ניצור פרוצדורה בשם GetUnitPrice פרוצדורה זו מחזירה באמצעות המשתנה unit_priceאת המחיר ליחידה של מוצר שמספר הזיהוי שלו נתון בprod_id- דוגמה זו לקוחה מהספר Microsoft SQL Server 7.0 Administator Companion CREATE PROCEDURE GetUnitPrice @prod_id INT, @unit_price MONEY OUTPUT AS SELECT @unit_price = UnitPrice FROM Products WHERE ProductID = @prod_id GO הפעלת הפרוצדורה מתוך :Query Analyzer oיש להצהיר (באמצעות )DECLAREעל משתנה שיאוחסן בו הערך המוחזר מהפרוצדורה oאת הפרמטר יש להעביר תוך שימוש במילה OUTPUT oניתן להדפיס ערך באמצעות הפונקציה PRINT oאם רוצים להמיר סוג נתונים לסוג אחר ,ניתן להשתמש בפונקציה CONVERT DECLARE @price MONEY EXEC GetUnitPrice 77, @price output )PRINT CONVERT(VARCHAR(8), @price דוגמה 3 ניתן להשתמש במשתנה הן כדי להעביר ערך לפרוצדורה והן כדי לקבל ערך מוחזר מהפרוצדורה בדוגמה זו ניצור פרוצדורה בשם GetBossהמחזירה באמצעות emp_idאת מספר הזיהוי של המנהל של עובד שמספר הזיהוי שלו מועבר באמצעות emp_id בטבלת ( Employeesב )Northwind-שינו שדה בשם ReportsToהמזהה את מספר המנהל אם מדובר במנהל הראשי ,מוחזר המספר 0 שים לב שניתן להשתמש במשפט תנאי IF...BEGIN...END כדי להשים ערך למשתנה יש להשתמש במילה SETלפני ההשמה CREATE PROCEDURE GetBoss @emp_id INT OUTPUT AS SELECT @emp_id = ReportsTo FROM Employees - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 WHERE EmployeeID = @emp_id IF @emp_id IS NULL BEGIN SET @emp_id = 0 END GO :Query Analyzerהפעלת הפרוצדורה מתוך ה DECLARE @emp INT SET @emp = 8 EXEC GetBoss @emp OUTPUT PRINT CONVERT(VARCHAR(4), @emp) שימוש במשתנים מקומי ים DECLARE ניתן להצהיר על משתנים מקומיים בפרוצדורה באמצעות 6 דוגמה ) (שניצור בהמשךPupilsTBL שורות חדשות לטבלת5 הפרוצדורה הבאה מכניסה pupil_name- וpupil_id :בטבלה זו שני שדות WHILE...BEGIN...END בפרוצדורה נעשה שימוש בלולאה CREATE PROCEDURE Insert5Rows @low_val NUMERIC AS DECLARE @loop_counter NUMERIC SET @loop_counter = 5 WHILE @loop_counter > 0 BEGIN INSERT INTO PupilsTBL VALUES (@low_val, "new_pupil") SET @low_val = @low_val + 1 SET @loop_counter = @loop_counter - 1 END GO :Query Analyzer הרצה מתוך CREATE TABLE... תחילה ניצור את הטבלה באמצעות המשפטo לאחר מכן נריץ את הפרוצדורהo SELECT לבסוף נציג את התוצאות באמצעות המשפטo CREATE TABLE PupilsTBL (pupil_id NUMERIC(4), pupil_name NVARCHAR(20)) EXEC Insert5Rows 8 SELECT * FROM PupilsTBL RETURN יציאה מפרוצדורה באמצעות RETURN ניתן לצאת מפרוצדורה באופן מיידי על ידי שימוש במילה ) לתוכנית הקוראתINT( ערך מסוג שלםRETURN ניתן להחזיר באמצעות - 113 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il SQL Server- בStored Procedures כתיבת:11 שיעור 7 דוגמה : המקבלת מספר מוצר ומחזירה את הערכים הבאיםGetPriceCategory בדוגמה זו ניצור פרוצדורה בשם ) לפרוצדורה (זהו יהיה גם ערך ברירת המחדלNULL אם הועבר-1 o Products אם המוצר אינו קיים בטבלה0 o דולר20- אם מחירו של המוצר קטן מ1 o דולר30- אם מחירו של המוצר קטן מ2 o דולר50- אם מחירו של המוצר קטן מ3 o בכל מקרה אחר99 o CASE...WHEN...THEN...END לצורך הדוגמה נשתמש במשפט CREATE PROCEDURE GetPriceCategory @prod_id INT = NULL AS DECLARE @price INT IF @prod_id IS NULL RETURN -1 SELECT @price = UnitPrice FROM Products WHERE ProductID = @prod_id RETURN CASE WHEN @price IS NULL THEN 0 WHEN @price < 20 THEN 1 WHEN @price < 30 THEN 2 WHEN @price < 50 THEN 3 ELSE 99 END GO :Query Analyzer הרצה באמצעות DECLARE @cat_id INT EXEC @cat_id = GetPriceCategory 38 PRINT @cat_id - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 בשיעור זה: אסקור בפניך את אפשרויות החיבור השונות מהיישום שלך ב Visual Basic-למקורות נתונים תכיר את מודל האובייקטים של הספרייה ADODB תכיר את המאפינים ,השיטות והאירועים של האובייקטים השונים של ADO סקירה של טכנולוגיות הגישה לנתונים קיימות שיטות רבות לגישה לנתונים ,החל מטכנולוגיות מבוססות ממשקי קריאות ,APIוכלה באובייקטים וויזואליים נוחים המתממשקים למסדי נתונים Visual Basicתומכת באפשרויות רבות המאפשרות גישה לנתונים בסעיף זה נסקור אוסף הרכיבים הללו ,ונראה את אפשרויות החיבור השונות הגרף הבא מתאר את היררכית האובייקטים ,הספריות ורכיבי הקוד השונים המפרידים בין יישום Visual Basic לבין שכבת הData- Visual Basic Application ADO Data Control Data Control Remote Data Control DAO ODBCDirect RDO ADO Jet Engine ODBC Driver Manager MSDASQL OLE DB Provider Specific ODBC Driver Database ) Open Database Connectivity ( ODBC ODBCמספק ממשק APIלקישור עם Databases ODBCמהיר מאוד כיוון שהוא מבוסס ,)Call Level Interface( CLIמשתמש המפעיל פונקציות ODBC API מנצל תקורת ( )Overheadמשאבים נמוכה יחסית ,לעומת תקורת קוד גבוהה ,ODBCהחל מגרסה ,3תומך ב .Connection Pooling-כיוון שהתחברות לשרת Databaseהא פעולה ארוכה, ODBCמנהל חיבורים פתוחים ,כך שייתכן שבקוד שלך מתבצעת פתיחה וסגירה של חיבורים ל Databases-אך בפועל אותו חיבור ב ODBC-משרת את כל החיבורים שלך בעת התחברות ,נבחר ה Driver-הספציפי המותאם לעבודה עם ה Database-הספציפי - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 המידע אודות ה ,Database-מיקומו ,אופן ההתחברות אליו ,שם המשתמש והסיסמה המשמשים בהתחברות אליו, שם ה Driver-המשמש לתקשורת עמו ועוד נשמרים ב)Data Source Name( DSN- ניתן ליצור DSNמתוך ה ,Control Panel-או מתוך הקוד של התוכנית קיימים שלושה סוגים של :DSN DSN :User DSN oהזמין לאותו משתמש בלבד DSN :System DSN oהזמין לכל המשתמשים במערכת ,כולל שירותי IIS( NTממומש כשירות NT ולפיכך יש לשתף Databasesשאמורים להשתמש בשירות זה) DSN :File DSN oהמאפשר לשמור את ההגדרות בקובץ (עם הסיומת ,)*.dsnכך שמשתמשים ברחבי הרשת יכולים לשתף אותו בניהם ,בתנאי שיש להם Driversמתאימים הערה :בשני הסוגים הראשונים המידע מאוחסן בRegistry- כרטיסיות ODBCבControl Panel- הערה :ב Win2k-יש להיכנס ל Administration Tools-ומשם לפתוח )Data Sources (ODBC :User DSNכרטיסייה ליצירת DSNשל משתמש ספציפי :System DSNהכרטיסייה ליצרית DSNשל מערכת :File DSNהכרטיסייה ליצירת DSNהנשמר בקובץ :Driversמציג את רשימת ה Drivers-המותקנים ומידע נוסף לגביהם :Tracingמאפשר לבצע מעקב אחר פעולות ה ,ODBC-כולל הפעלה משולבת יחד עם Visual Studio Analyzer המאפשר ביצוע אבחון ברשת של פעולות היישום :Connection Poolingמאפשר לקבוע את הגדרות ה Connection Pooling-עבור ה Drivers-הספציפיים השונים של ODBC ) Data Access Object ( DAO DAOהוא ממשק תכנות מונחה עצמים הפועל על גבי מנוע ( Jetמנוע Jetהוא מנוע ה Databases-היוצר ומנהל קובצי *.mdbהמוכרים מ)Access- DAOעוצב והותאם המיוחד לעבודה מול Databasesשל Access ניתן לגשת לטבלאות מכל Databaseשקיים עבורו ,ODBC Driverבאמצעות שיטת הטבלאות המקושרות של Access חסרון השימוש במנוע Jetהוא בכך שכולו נטען לזכרון ,גם אם עובדים עם Databaseמסוג שונה מ*.mdb- DAOאינו חושף את כל היכולות של ODBC API DAOלא פותחה רבות מאז גרסת ,3.5וככל הנראה Microsoftרואה את העתיד כשייך לADO- ) Data Control ( DC Data Controlהוא פקד סטנדרטי של Visual Basic זהו ממשק וויזואלי המאפשר חיבור לDatabase- Data Controlמהווה ממשק וויזואלי (לא כ"כ מתוחכם) לDAO- ניתן לכרוך פקדים ( )to bindלמקורות מידע המסופקים ע"י הData Control- כריכת פקדים היא פעולה שהופכת את היישום לדו שכבתי (שכבת תוכנית המשתמש ושכבת ה ,)Database-ולפיכך קיימים בכך חסרונות עיצוב רבים ) Remote Data Object ( RDO RDOמשלב את הפשטות של DAOעם הכוח של ODBC RDOמדלג על מנוע Jetמה שמשפר את הביצועים באופן ניכר RDOעוצב המיוחד לעבודה מול ODBC API - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים הגרסה האחרונה של RDOהיא ( 2.0והיא דיי ישנה) ,כך שניתן להסיק ש Microsoft-דוחפת אותנו "בגסות" לכיוון הADO- ) Remote Data Control ( RDC Remote Data Controlהוא פקד וויזואלי הדומה בתפקודו ל Data Control-הסטנדרטי של Visual Basic כל היתרונות והחסרונות של הפקד Data Controlקיימים גם בRemote Data Control- ההבדל בין Data Controlל Remote Data Control-הוא בשכבת הביניים .עבור DCזהו אובייקט DAOואילו עבור RDCזהו אובייקט RDO ODBCDirect ODBCDirectהוא מצב פעולה של DAOהטוען את רכיב RDOבמקום מנוע Jet כדי להפעיל אובייקט DAOבמצב ODBCDircetיש לרשום: DBEngine.DefaultType = dbUseODBC במקרה של מצב פעולה של ,ODBCDirectניתן לנצל את יתרונות ODBCואת פשטות הקוד של DAO OLE DB OLE DBמגדיר ממשקי COMסטנדרטיים שעל כל OLE DB Providerלתמוך בהם ,כדי שצרכני ()Consumers מידע יוכלו להתקשר אליו באמצעות ממשקים אלו התחברות ישירה יכולה להתבצע דרך קוד הכתוב בשפת Cמבוסס על קריאות ,COM APIהתחברות באופן כזה מתוך קוד Visual Basicהיא כמעט בלתי אפשרית לשם כך קיימים רכיבי ADOשנכיר ונתמקד בהם בפרק זה יתרונה הגדול של טכנולוגיה זו הוא בתמיכה בסוגי מידע שונים ולאו דווקאב-Database-ים רגילים באמצעות OLE DBניתן לגשת למידע שבכל קובץ נתונים ,מסוג כלשהו ,כולל מסמך ,Excelהודעת דואר ועוד, ובתנאי שקיים עבורו OLE DB Providerמתאים השכבה היחידה שחוצצת בין ה Database-לבין היישום ,הוא .OLE DB Providerכיוון שברכיב זה קיימת תמיכה בממשקי COMהדרושים ,אין צורך בשכבה מפרידה כמו בODBC- הנתונים שאליהם ניתן לגשת ב OLE DB-הם כל הנתונים תומכי COMולא רק נתונים סטנדרטיים של SQL ) ActiveX Data Objects ( ADO ADOהוא ממשק עילי לOLE DB- כיאה לממשקי ADO ,COMתומך ב OLE DB Provider-המציעים ממשקים נוספים המרחיבים את יכולת פעילותו של ADO הפונקציונליות של ADOאינה ממוקמת ב DLL-יחיד ,אלה במספר -DLLים .לכן אין צורך להפיץ את כל ה-DLL-ים למשתמש הקצה אם אין שימוש בפונקציונליות של כולם ניתן להשתמש ב ADO-מתוך קוד HTMLוASP- תת מערכת של ADOבשם Remote Data Servicesמאפשר שליחת רשומות ל Client-ברחבי הרשת ,ואפילו הפעלת COM Componentsאצל הClient- MSDASQL MSDASQLהוא אחד מה-Proveder-ים של OLE DB הייחוד ב MSDASQL-הוא בכך שהוא מהווה Providerמתאם בין OLE DBלODBC- הצורך ב MSDASQL-קיים ,כיוון שישנם -DBMSים שעדיין לא פותח עבורם OLE DB Providerמתאים - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 ) ADO Data Control ( ADODC ADODCהינו אובייקט וויזואלי הדומה בעיקרו ל DC-ול ,RDC-אם כי ADODCמציג מספר שיפורים לעומת DCוRDC- ADODCמשתמש ב )OLE DB( ADO-כשכבת הביניים להתקשרות מול מקור הנתונים תרגיל Nwi ndDSN – 1 בדוגמה זו ניצור DSNבאמצעות לוח הבקרה של Windows .1פתח את חלון :ODBC Data Source Administrator פתח את הControl Panel- בWindows 2000-מתוך ה Control Panel-בחר בAdministrative Tools- בחר ב ( ODBC-או ) Data Sources (ODBCב)Windows 2000- .1הכר את הכרטיסיות השונות ביישום :ODBC Data Source Admiistrator לפני שניגש להגדרת ה DSN-בתרגיל זה ,נכיר את הכרטיסיות השונות הכרטיסיה :User DSN בכרטיסייה User DSNאתה יכול להוסיף ( DSN )Add...חדש השייך למשתמש בנוכחי בלבד במערכת ( User ,)DSNולהגדיר ( )Configure...את המאפיינים שלו ,או להסיר User DSNקיים - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים הכרטיסיה :System DSN בכרטיסייה System DSNניתן לבצע את אותם הפעולות כמו ב ,User DSN-אלא שה-DSN-ים הנוצרים ומוגדרים בכרטיסייה זו יהיהו זמינים לכל משתמשי המערכת ()System DSN הכרטיסיה :File DSN - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 בכרטיסייה File DSNתוכל ליצור -DSNים חדשים ולהגדירם ,כמו גם להסיר -DSNים קיימים .ה-DSN-ים הנוצרים בכרטיסיה זו נשמרים בקבצים ()File DSN File DSNנשמרים בדרך כלל בספרייה .C:\Program Files\Common Files\ODBC\Data Sourcesאם תרצה לשנות את מיקום קובץ ה DSN-שאתה יוצר יהיה עליך ללחוץ על Set Directoryלאחר המעבר לספרייה המתאימה הכרטיסיה :Drivers בכרטיסיה Driversמוצגים ה-Driver-ים השונים של ODBCהמותקנים במערכת והפרטים הבאים עבור כל :Driver :Version oמספר הגירסה של הDriver- :Company oשם החברה המייצרת :File oשם קובץ ה DLL-של הDriver- :Date oהתאריך האחרון בו שונה הקובץ - 112אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים הכרטיסיה :Tracing בכרטיסיה Tracingתוכל להפעיל מעקב אחר פעולות ODBCשיירשמו בקובץ ששמו נתון בשדה Log file .Pathאפשרות זו יכולה לסייע כשעובדים באופן ישיר או עקיף (באמצעות ADOלמשל) יחד עם .ODBC תוכל גם להפעיל את Visual Studio Analyzerכדי לאבחן פעולות של היישום שלך ברחבי הרשת .בשדה Custom Trace DLLתוכל לבחור DLLאחר שינהל את פעולות המעקב ,אן קיים אחד כזה ברשותך - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 הכרטיסיה :Connetion Pooling בכרטיסייה Connection Poolingתוכל להגדיר את ההגדרות הבאות: :Connetion Pooling Timeout oבשדה זה אתה מגדיר את משך הזמן שבו יישארו -Connectionים בזיכרון לאחר סגירתם .המטרה בהשארת -Connectionים בזכרון ה Pooling-היא לחסוך את זמן ההתחברות בעת יצירת חיבורים חדשים על ידי אותה תוכנית אם קיימים חיבורים פנויים המתאימים לדרישות החיבור החדש של התוכנית .כדי לשנות הגדרה זו עבור Driverמסוים, עליך להקליק על שמו ולהתאים את ההגדרות בתיבת הדו שיח המתקבלת (מוצגת להלן): :)Performance Monitoring( PerfMon oסימון אפשרות זו מאפשר מעקב אחר ביצועי ה Connection Pooling-של כל ה-Driver-ים :Retry Wait Time oכאשר ניסיון התחברות למערכת ניהול -Databaseים נכשלת ,מתבצע ניסיון נוסף .משך הזמן בשניות בין ניסיון אחד למשנהו מוגדר בשדה זה מומלץ שלא לשנות ההגדרות של ה Connection Pooling-אלא אם אתה מודע למשמעות השינויים שאתה מבצע - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים .3 .1 .1 .1 .1 .1 הכרטיסיה :About בכרטיסייה Aboutתוכל לצפות במידע אודות קובצי הליבה ( )Coreהמנהלים את תת המערכת ODBCתחת מערכת ההפעלה הוסף :DSN וודא שהכרטיסייה UserDSNנבחרה לחץ על Add בחר ב Driver-המתאים: מתוך רשימת ה-Driver-ים המוצעים בחר בSQL Server- לחץ על Finish הקצה שם ל:DSN- בשדה Nameהקצה את השם NwindDSN הקצה תיאור ל:DSN- בשדה Descriptionרשום DSNאם Northwind Database קבע את מיקום ה Server-ברשת: בשדה Serverבחר מהרשימה הנפתחת או הקלד ידנית את שם המחשב ברשת שבו נמצאת מערכת הSQL - Serverשאליה תרצה להתחבר באמצעות DSNזה (אם מערכת ה SQL Server-מותקנת במחשב המקומי ושמו אינו מוצג ברשימה הנפתחת ,תוכל להשתמש גם בכתובת ה)127.0.0.1 :IP- בחר את שם המשתמש והסיסמה באמצעותם תתחבר ל:SQL Server- אם שם מערכת ה SQL Server-אליה אתה מתחבר מאפשרת כניסה באמצעות שם המשתמש והסיסמה של ,Windows NT/2000אזי תוכל לבחור באפשרותWith Windows NT Authentication... תוכל לבחור באפשרות With SQL Server Authentication...ובתחתית החלוןהקלד את שם המשתמש והסיסמה באופן מפורש - 113אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 בדוגמה זו הקלד saעבור שם המשתמש והשאר את הסיסמה ריקה (בעת התקנת SQL Serverנוסף באופן אוטומטי מנהל מערכת בשם saללא סיסמה ,אם שינית את הסיסמה התאם את השדה Passwordבהתאם) לחץ על Next .1בחר ב Database-אליו תרצה להתחבר: סמן Vב Change the default database to:-ומתוך הרשימה הנפתחת בחר Northwind לחץ על Next .12סיים את הגדרת ה:DSN השאר את ההגדרות במסך האחרון ללא שינו ולחץ על Finish )ACTIVEX DATA OBJECTS( ADO כאמור ADO ,הוא ממשק עילי לOLE DB- בסעיף זה נסקור את מודל העצמים של ADOונלמד להשתמש בכל אחד מהאובייקטים הללו כדי לכלול את ספריית ADOבפרוייקט Visual Basicבצע את השלבים הבאים: .1פתח את החלון Referencesעל ידי בחירת האפשרות Referencesמהתפריט Project .1הוסף הפנייה לספרייה .Microsoft ActiveX Data Objects 2.7ייתכן שבמחשב שלך הגרסה 2.7לא תופיעה, או שתופיעה גרסה מתקדמת יותר .בכל מקרה מומלץ לבחור בגרסה המעודכת היותר של הספרייה. התרשים הבא מציג את היררכית ה-Object-ים וה-Collection-ים שבספרייה ( ADODBהספרייה ADODBהיא הספרייה המכילה את האובייקטים של :)ADO ADODB Connection Error Errors Property Properties Command Parameter Parameters Property Properties Recordset Field Property Fields Properties Property Properties מקרא: ( Libraryספרייה) ( Collectionאוסף) ( Objectאובייקט) בהמשך השיעור נתעכב על כל אחד מהאובייקטים והאוספים הללו - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים Data Link בדומה ל Data Link ,DSN-מהווה את אוסף הפרטים הנחוצים לשם פניה למקור נתונים על ידי אובייקט ADO Data Linkהוא קובץ טקסט הכולל פרטי מידע אודות שם ה Provider-באמצעותו ניגשים למקור הנתונים ,שם מקור הנתונים ומיקומו ועוד. בעת בחירת Providerמשתנים הפרטים הנוספים הנדרשים לפי סוג ה .Provider-כך למשל אם בחרת ב( MSDASQL-זהו ה Provider-עבור מקור נתונים של )ODBCתידרש להזין את שם ה DSN-ולא יהיה צורך בציון מקור הנתונים כיוון שהוא כלול כבר בתוך ה .DSN-אם ,לעומת זאת ,בחרת ב( SQLOLEDB-זהו Provider עבור )SQLServerתידרש להזין את שם המחשב עליו מצוי ה SQL Server-ושם ה Database-אליו ברצונך לגשת. יצירת קובץ Data Link תחת Windows 98או :Windows NT .1פתח את הסייר ועבור לספרייה שברצונך ליצור בה את הקובץ .1לחץ לחיצה ימנית על העכבר במקום ריק בספריה ובחר באפשרות New .3בחר Microsoft Data Link .1הקצה שם לקובץ תחת ( Windows 2000פועל גם ב Windows 98-ו:)Windows NT- .1פתח את הסייר ועבור לספרייה שברצונך ליצור בה את הקובץ .1לחץ לחיצה ימנית על העכבר במקום ריק בספריה ובחר בNew- .3בחר באפשרות Text Document .1הקצה לקובץ שם כרצונך ,ושנה את הסיומת שלו ל( .udl-אם אינך רואה את סיומת הקובץ בחר באפשרות Folder Optionsמתוך התפריט Toolsובכרטיסייה Viewנקה את הסימון ליד Hide file Extensions for known file typesולחץ על )OK .1אל תתייחס לאזהרה שתתקבל כתוצאה משינוי הסיומת לאחר שיצרת את הקובץ הקלק עליו והתאם את ההגדרות בתיבת הדו שיח Data Link Properties בתרגילים הבאים ובסעיף העוסק באובייקט ,Connectionתכיר היטב את פרטי המידע הנחוצים לשם הגדרת Data Linkואת משמעותם תרגיל NWind.udl : 2 בתרגיל זה ניצור קובץ Data Linkשיכיל את הנתונים הדרושים לשם פניה לNwind.mdb- .1צור קובץ Data Linkריק: צור קובץ עם הסיומת .udlכפי שהוסבר בסעיף הקודם הקצה לקובץ את השם NWind.udl .1פתח את תיבת הדו שיח Data Link Propertiesוהכר את הכרטיסיות שבו: הקלק על הקובץ ,תיבת הדו שיח Data Link Propertiesאמורה להיפתח לפני שנתאים את ההגדרות ,נבחן את הכרטיסיות השונות של תיבת הדו שיח Data Link - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 הכרטיסיה :Provider בכרטיסייה Providerאתה בוחר את ה OLE DB Provider-לפי סוג מקור הנתונים שאליו אתה מתכוון לגשת: oעבור -Databaseים של Accessבחר ב Microsoft Jet 3.51 OLE DB Provider-או גירסה 4.0 שהיא מעודכנת יותר oעבור -Databaseים של SQL Serverבחר בMicrosoft OLE DB Provider for SQL Server- oעבור -Databaseים של Oracleבחר ב Microsoft OLE DB Provider for Oracle-או בProvider- אחר המתאים ל Oracle-אם קיים כזה במחשב שלך oעבור גישה ל Database-שלא קיים עבורו OLE DB Providerאך קיים עבורו Driverשל ,ODBC בחר ב .Microsoft OLE DB Provider for ODBC Drivers-שים לב ש Provider-זה מסומן כברירת מחדל אם לא בחרת Providerאחר - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים הכרטיסייה :Connection הכרטיסייה Connectionמאפשרת להגדיר את מיקום ה ,Database-שם המשתמש והסיסמה וכו'. הפרטים בתוך כרטיסייה זו משתנים בהתאם ל Provider-שנבחר בכרטיסייה הראשונה את פרטי הכרטיסייה הזו תכיר בהמשך תרגיל זה ובשני התרגילים הבאים - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 הכרטיסייה :Advanced Connect Timeoutמגדיר את משך הזמן בשניות בהן יתבצע ניסיון התחברות למקור הנתונים .אם החיבור לא התליח בפרק זמן זה תתרחש שגיאה Access Permissionsמגדיר את הרשאות הגישה ל Database-בסעיף העוסק במאפיין Modeשל האובייקט ( Connectionבהמשך) תמצא הסבר אודות האפשרויות השונות Impersonation Levelו Protection Level-מאפשרים הגדרות שונות עבור חיבור למקורות נתונים ברחבי הרשת המבוססים על שיטות קריאה שונות מאשר ,)Remote Procedure Call( RPCברוב המקרים הגדרות אלו אינן רלוונטיות - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים הכרטיסייה :All בכרטיסייה Allמוצגים כל המאפיינים של ה Provider-שבחרת בכרטיסייה הראשונה ,בין שהגדרת להם ערכים ובין שלא הגדרת להם ערכים המאפיינים המוצגים בכרטיסייה זו שונים עבור -Providerים שונים תוכל לסמן מאפיין מסויים ולהגדיר את ערכו באמצעות לחיצה על הכפתור Edit Value... בדרך כלל לא תצטרך להגדיר מאפיינים שאינם סטנדרטיים ,אך אם בכל זאת תרצה להבין את משמעותו של מאפיין מסויים ,יהיה עליך לעיין בתיעור של ה Provider-המתאים .3הגדר את מאפייני ה:Data Link- בכרטיסייה :Provider oבחר ב( Microsoft Jet 4.0 OLE DB Provider-אם ברשותך גרסה מעודכנת יותר מ 4.0-בחר בה) בכרטיסייה :Connection oבסעיף )Select or enter a database name( 1הזן את המסלול של ( NWIND.MDBקובץ זה נמצא תחת ספריית ההתקנה של , Visual Basicבמחשב שלי המסלול הוא : ,C:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDBאם בחרת בספריית התקנה שונה בעת התקנת Visual Studioהתאם את המסלול בהתאם) oלחץ על Test Connectionכדי לוודא שההתחברות ל Database-מצליחה בכרטיסייה :Advanced oהשאר את הגדרת ה Access permissions-כמו שהיא - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 בכרטיסייה :All oתוכל לעיין בכרטיסייה Allכדי לצפות בהגדרות שקבעת עד כה .תוכל גם לשנות הגדרות בכרטיסיה זו ,או להגדיר ערכי מאפיינים שאינם מופיעים בכרטיסיות הקודמות .1אשר את ההגדרות: לחץ על OKוסגור את תיבת הדו שיח .1עיין בקובץ :NWind.udl פתח את הקובץ NWind.udlבאמצעות ה Notepad-ועיין במבנה הקובץ ובאופן שבו נשמרו ההגדרות השונות כפי שקבעת בכרטיסיות השונות תרגיל Pubs.udl : 1 בתרגיל זה ניצור קובץ Data Linkשיכיל את פרטי המידע הדרושים לשם פניה ל Database-בשם Pubsהנמצא בSQL Server- .1צור קובץ Data Linkריק: צור קובץ Data Linkריק כפי שביצעת בתרגיל הקודם והקצה לו את השם Pubs.udl .1הגדר את מאפייני ה:Data Link- בכרטיסייה :Provider oבחר בMicrosoft OLE DB Provider for SQL Server- בכרטיסייה :Connection oבסעיף )Select or enter a server name( 1בחר בשם המחשב בו נמצאת תוכנת הSQL Server- שלך (אם התוכנה מותקנת על אותו המחשב בו ממוקם קובץ ה Data Link-ואינך יודע מה שמו של המחשב ברשת ,תוכל להזין בשדה זה את כתובת ה .127.0.0.1 IP-כתובת זו היא כתובת ה loopback-אשר מצביעה חזרה על המחשב המקומי) oבסעיף )Enter information to log on to the server( 2קיימות שתי אפשרויות: :Use Windows NT Integrated security אפשרות זו מתאימה אם התקנת הSQL - Serverאליה אתה מתחבר מאפשרת התחברות אוטומטית באמצעות שם המשתמש והסיסמה של מערכת ההפעלה Windows NTשעליה היא מותקנת :Use a spesific username and password באפשרות זו אתה מזין את שם המשתמש והסיסמה ידנית .בעת התקנת SQL Serverנוצר באופן אוטומטי usernameששמו הוא sa בעל סיסמה ריקה .אם לא שינית את ההגדרות ב SQL Server-הזן saלשדה username והשאר את הסיסמה ריקה .אם הסיסמה ריקה הוסף סימן Vליד האפשרות Blank .passwordאם אתה מזין סיסמה שאתה מעוניין שתישמר בקובץ ה Data Link-עליך לסמן Vליד האפשרות Allow Saving Password oבסעיף 3עליך לבחור את ה Database-אליו תרצה להתחבר .באפשרותך לציין את הDatabase- בשתי צורות: לסמן Vליד האפשרות ,Select the database on the serverולבחור ב Pubs-מתוך רשימת ה-Database-ים לסמן Vליד האפשרות ,Attach a database file as a database nameולבחור את השם Pubsבשדה הראשון ,ולהזין את מיקום הקובץ pubs.mdfבשדה השני (SQL Server ממקם קובץ זה תחת תת הספרייה Dataשתחת ספריית ההתקנה של ,SQL Serverבדרך כלל זהו )C:\Program Files\Microsoft SQL Server\Data\Pubs.MDF הערה :בשונה מ Access-יישומים רציניים לניהול -Databaseים ,למשל ,SQL Server DB2 ,Oracleועוד ,שומרים את הנתונים ופרטי המידע הדרושים עבור ניהולו השוטף של Databaseבמספר קבצים .במקרה של SQL Serverקיימים שלושה סוגי קבצים: קובץ עם הסיומת :.MDFזהו קובץ הנתונים הראשי של הDatabase- - 112אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים קבצים עם הסיומת :.NDFאלו הם קובצי נתונים משניים של הDatabase- קבצים עם הסיומת :.LDFאלו הם קובצי רישום ( )Log Filesהמשמשים לפיעילותו השוטפת של הDatabase- oתוכל לבדוק אם ההתחברות ל Database-מצליחה על ידי לחיצה על Test Connection בכרטיסיה :Advanced oבשדה Connect timeoutהקצה 30שניות לניסיון ההתחברות oשים לב שה Provider-עבור SQL Serverאינו תומך באפשרות Access permissions בכרטיסיה :All oתוכל לעיין בערכי המאפיינים שהזנת oתוכל גם לשנות את ערכי המאפיינים ,או להזין ערכים למאפיינים שאינם מופיעים בכרטיסיות Connectionו( Advanced-אני ממליץ בפניך לא לשנות ערכי מאפיינים שאינך יודע את משמעותם) .3אשר את ההגדרות: לחץ על OKוסגור את תיבת הדו שיח .1עיין בקובץ :Pubs.udl פתח את הקובץ ,Pubs.udlשזה עתה יצרת ,באמצעות היישום ,Notepadובחן את תוכנו ואת מבנהו תר גיל NWindDSN.udl : 4 .1 .1 .3 .1 בתרגיל זה ניצור קובץ Data Linkשיכיל את פרטי המידע הדרושים לשם פניה ל Database-בשם Northwind המצוי ב SQL Server-תוך שימוש ב DSN-שיצרנו בתרגיל 1בשם NWindDSN צור קובץ Data Linkריק: צור קובץ Data Linkריק והקצה לו את השם NWindDSN.udlכפי שביצעת בשני התרגילים הקודמים הגדר את מאפייני ה:Data Link- בכרטיסייה :Provider oבחר ב( Microsoft OLE DB Provider for ODBC Drivers-זוהי אפשרות ברירת המחדל) בכרטיסייה :Connection oבסעיף )Use data source name( 1בלר מהרשימה הנפתחת ב( NwindDSN-זהו הUser DSN- שיצרנו בתרגיל .)1תוכל גם ליצור ConnectionStringאך נושא זה יילמד בהמשך השיעור. oבסעיף )Enter information to log on to the server( 2הקצה שם משתמש וסיסמה מתאימים לשם התחברות לDatabase- oלחץ על Test Connectionעל מנת לוודא שההתחברות מצליחה בכרטיסייה :Advanced oתוכל לשנות את הגדרות ה Connect timeout-והגדרות ה( Access permissions-האפשרויות השונות של ה Access permissions-יילמדו בהמשך ,כאשר תכיר את המאפיין Modeשל האובייקט .)Connectionלצורך תרגיל זה אני ממליץ בפניך להשאיר את ההגדרות כמו שהן אשר את ההגדרות: אשר את ההגדרות על ידי לחיצה על OK עיין בקובץ :NWindDSN.udl באמצעות ה Notepad-פתח את הקובץ NWindDSN.udlכדי לעיין במבנהו ותוכנו של הקובץ האובייקט Connection אובייקט Connectionשולט על התקשרות אחת למקור נתונים אובייקט Connectionמשמש כמכולה לטרנזקציות מול מקור הנתונים - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 מאפיינים ,מתודות ואירועים להכנה וביצוע התחברות למקור נתונים הערה :לא כל המאפיינים נתמכים על ידי כל ה-Provider-ים השונים .למשל המאפיין Modeנתמך על ידי הProvider- של )Microsoft.Jet.OLEDB( Accessאך אינו נתמך על ידי ה Provider-של .)SQLOLEDB( SQL Serverאינך צריך לזכור את כל המאפיינים הנתמכים על ידי Providerמסויים כיוון שיצירת ה ConnectionString-הכוללת את המאפיינים נעשית בדרך כלל על ידי .Wizard :Provider מגדיר את שם ה OLE DB Provider-המשמש לביצוע ההתחברות .ברירת המחדל היא MSDASQL המאפשר התחברות באמצעות Driverשל .ODBCניתן להגדיר מאפיין זה כחלק מהמאפיינים בתוך ה ConnectionString-כפי שיוסבר להלן ,או כאובייקט .Propertyלדוגמה כדי להגדיר את הProveider כ Provider( SQLOLEDB.1-עבור )SQL Serverניתן להשתמש בכל אחת מהצורות הבאות: Dim conn As New ADODB.Connection ... ... "conn.Provider = "SQLOLEDB.1 או "conn.Properties("Provider") = "SQLOLEDB.1 או "conn.ConnectionString = "Provider=SQLOLEDB.1;... :ConnectionStringמחרוזת המכילה את מאפיני החיבור השונים .המחרוזת היא במבנה של " "PropertyName1=Value; PropertyName2=Value;...כאשר PropertyNameהוא שם של מאפיין וValue- הוא הערך המושם לאותו מאפיין .ניתן להגדיר את מאפייני החיבור גם באמצעות האוסף Propertiesכפי שהודגם קודם .קיימים מאפיינים רבים עבור חיבור והם משתנים בין -Providerים שונים .נציין מספר מאפיינים נפוצים: :Data Source oשם מקור הנתונים או שם של DSNהקיים במערכת במקרה של התחברות למקור נתוני ODBC :DSN oשם של DSNהקיים במערכת .מאפיין זה יכול להחליף את Data Sourceבמקרה של התחברות למקור נתונים של ODBC :File Name oשם של קובץ המכיל את נתוני ההתחברות .קובץ זה יכול להיות מסוג DSNעבור חיבור למקור נתונים של ODBCאו שם של קובץ מסוג UDL :Initial Catalog oהשם של הDefault Database- :Database oשם ה .Database-ניתן להשתמש במאפיין זה בעת התחברות למקור נתונים של ODBC :Password oסיסמת המשתמש באמצעותו מתבצע החיבור :PWD oסיסמת המשתמש באמצעותו מתבצע החיבור .ניתן להשתמש במאפיין זה בעת התחברות למקור נתונים של ODBC :Persist Security Info oקובע האם ADOישמור ( )Persistאת שם המשתמש והסיסמה ( )Security Infoבקובץ הData Link- :Provider oכפי שהוסבר קודם ,זהו שם ה OLE DB Provider-באמצעותו מתבצעת ההתחברות :User ID oשם המשתמש באמצעותו מתבצעת ההתחברות :UID oשם המשתמש באמצעותו מתבצעת הנתחברות .ניתן להשתמש במאפיין זה בעת התחברות למקור נתונים של ODBC :Default Databaseמחזיר את שם ה .Default Database-מאפיין זה זמין רק לאחר שההתחברות בוצעה ,ואז הוא לקריאה בלבד :ConnectionTimeoutמגדיר את משך הזמן (בשניות) המקסימלי שאובייקט ה Connection-ימתין עד להשלמת ההתחברות למקור הנתונים .אם ההתחברות לא הסתיימה תוך פרק הזמן המוגדר ,תתעורר שגיאה מתאימה .ערך ברירת המחדל למאפיין זה הוא 15שניות - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים :CommandTimeoutמגדיר את משך הזמן (בשניות) המקסימלי שאובייקט ה Connection-ימתין עד להשלמת פקודה מול מקור הנתונים .אם הפקודה לא הושלמה תוך פרק הזמן המוגדר תתעורר שגיאה מתאימה .ערך ברירת המחדל למאפיין זה הוא 30שניות .מאפיין זה משפיע על הפקודות המורצות באופן ישיר באמצעות Connection זה ,ואינו משפיע על פקודות המורצות מאובייקט Commandהמשתמש באובייקט זה .לאובייקט Commandישנו מאפיין CommandTimeoutמשלו :CursorLocationקובע את מיקום ה .Cursor-מאפיין זה יכול לקבל אחד מהערכים הבאים: הערה Cursor :הינו אובייקטהמכיל רשומה אחת או בלוק של רשומות מתוך אוסף הרשומות המוחזר על ידי שאילתה ממקור הנתונים :adUseServer oה Cursor-נוצר במחשב הServer- :adUseClient oה Cursor-נוצרבמחשב הClient- שים לב :ניתן ליצור את כל סוגי ה-Cursor-ים ב ,Server-ואילובמחשב ה Client-ניתן ליצור Cursor מסוג adOpenStaticבלבד .הסבר אודות סוגי ה-Cursor-ים תמצא בהמשך השיעור :Modeמאפיין זה מגדיר את הרשאות ה .Connection-מאפיין זה יכול לקבל אחד או יותר מהערכים הבאים: :adModeRead oמאפשר קריאה ממקור הנתונים :adModeWrite oמאפשר כתיבה למקור הנתונים :adModeReadWrite oמאפשר קריאה ממקור הנתונים כמו גם כתיבה למקור הנתונים :adModeShareDenyRead oמונע מלקוחות אחרים להתחבר לאותו מקור נתונים לשם קריאה :adModeShareDenyWrite oמונע מלקוחות אחרים להתחבר לאותו מקור נתונים לשם כתיבה :adModeShareExclusive oמונע מלקוחות אחרים התחברות לאותו מקור נתונים בהרשאה כלשהי :adModeShareDenyNone oמאפשר ללקוחות אחרים להתחבר למקור הנתונים עם הרשאות כלשהן יצירת Connection String תוכל להגדיר את ה ConnectionString-במספר דרכים: .1לקודד בעצמך מאפיין זה – הגדרה באופן כזה קשה למדי כיוון שקשה לזכור את רשימת המאפיינים הרבה הקיימים עבור מאפיין זה .תוכל להשתמש בטריק קטן :צור קובץ Data Linkולאחר מכן העתק את ההגדרות שבתוך הקובץ (תוכל לצפות בהן באמצעות ה ,Notepad-כפי שביצעת בתרגילים הקודמים) למאפיין ConnectionStringשבקוד התוכנית שלך .1ליצור קובץ Data Linkולהגדיר אותו באמצעות המאפיין File Nameב .Connection String-כך למשל ,כדי להתחבר למקור הנתונים שהוגדר באמצעות קובץ ה Data Link-מתרגיל ,)Pubs.udl( 1ניתן להגדיר את ה Connection String-באופן הבא: Dim conn As New ADODB.Connection ... ... "conn.ConnectionString = "File Name=...\Pubs.udl כאשר יש לציין כמובן את המסלול המלא של הקובץ שיטה זו מומלצת מאוד ,כיוון שתוכל לשנות את הגדרת מקור הנתונים בקובץ ה Data Link-מבלי לשנות את קוד המקור של התוכנית או לקמפל את התוכנית מחדש .3תוכל לבנות את המאפיין ConnectionStringבאמצעות האשפים השונים .בתיבות הדו שיח המגדירה את מקור הנתונים עבור פקד ADODCקיים כפתור Buildליד השדה .Connection Stringלחיצה על כפתור זה מפעילה אשף המאפשר לך להגדיר את מקור הנתונים .לאחר סיום פעולת האשף ,נוצר עבורך Connection .Stringתוכל להעתיק Connection Stringזה לתוך הקוד שלך .באחת הדוגמאות הבאות תשתמש בטכניקה זו. - 113אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il ActiveX Data Objects :12 שיעור SimpleConnection – התוכנ ית3 תרגיל מוכןDSN- תוך שימוש בADO לבין מקור נתונים באמצעותVisual Basic בתרגיל זה ניצור חיבור בין תוכנית : ושמור אותוStandard EXE צור פרוייקט.1 frmTestConnection ולטופס את השםSimpleConnection הקצה לפרוייקט את השם : לטופס והגדר את המאפיינים הבאיםCommandButtons הוסף שני.1 ערך Test Connection 3- Fixed Dialog 2-CenterScreen cmdConnect Connect True cmdDisconnect Disconnect False מאפיין Caption BorderStyle StartUpPosition Name Caption Enabled Name Caption Enabled אובייקט frmTestConnection Command1 Command2 :הטופס צריך להיראות דומה לזה שבציור :ADO הוסף הפנייה לספריית.3 References בחר באפשרותProject מתוך תפריט (ייתכןMicrosoft ActiveX Data Objects 2.7 Library מתוך רשימת ספריות הרכיבים בחר בספרייה ) בחר בגירסה הכי מתקדמת.שבמחשב שלך מותקנת גירסה מוקדמת יותר או מאוחרת יותר של הספריה : הוסף קוד לטופס.1 Option Explicit Dim conn As ADODB.Connection ADO שלConnection בחלק הגלובלי של הטופס הוצהר אובייקט Private Sub Form_Load() Set conn = New ADODB.Connection End Sub New בעת טעינת הטופס נוצר אובייט באמצעות המילה Private Sub cmdConnect_Click() conn.ConnectionString = "DSN=NwindDSN;User ID=sa" conn.Open If conn.State = adStateOpen Then MsgBox "Connection successful" cmdConnect.Enabled = False cmdDisconnect.Enabled = True - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים Else "MsgBox "Connection Failed End If End Sub בעת לחיצה על Connectיוצרים Connection Stringעם הפניה ל DSN-שיצרנו בתרגיל הקודם וכפרמטר נוסף מעבירים את שם המשתמש לאחר קריאה לפרוצדורה Openבודקים את מצב החיבור adStateOpen .מצביע על חיבור מוצלח )(Private Sub cmdDisconnect_Click conn.Close If conn.State = adStateClosed Then "MsgBox "Disconnected cmdConnect.Enabled = True cmdDisconnect.Enabled = False End If End Sub בעת ליחצה על Disconnectקוראים לשיטה Closeכדי לנתק את החיבור לDatabase- )Private Sub Form_Unload(Cancel As Integer If conn.State = adStateOpen Then conn.Close End If Set conn = Nothing End Sub בעת הסרת הטופס מנתקים את החיבור (אם הוא עדיין לא נותק) ומשחררים את אובייקט הADO- אם לא קוראים באופן מפורש ל ,Close-פעולה זו תתבצע באופן אוטומטי על ידי האובייקט ADOבעת שיחרורו מהזיכרון .1בחינת הפרוייקט: הרץ את התוכנית ובדוק את פעולתה - Eventים של אובייקט Connection האובייקטים השונים של ADOחושפים -Eventים שונים .לחלק מבין ה-Event-ים ישנו מבנה קבוע: :Willxxxx oאירוע זה מתרחש לפני שהפעולה xxxxמתרחשת :xxxxComplete oאירוע זה מתרחש לאחר השלמת הפעולה xxxx דוגמאות לצמדים כאלה של אירועים הם WillConnectוWillExecute ,ConnectComplete- ו ExecuteComplete-וכו' בעת כניסה לאירוע Willxxxxמועבר פרמטר adStatusשיכול להכיל את הערכים הבאים: :adStatusOK oאין שום שגיאות :adStatusErrorsOccured oהתרחשה שגיאה כלשהי :adStatusCantDeny oלא התרחשה שגיאה ,אך לא ניתן לבטל את הפעולה בעת כניסה לאירוע Willxxxxתוכל לשנות את ערכו של adStatusלאחד הערכים הבאים: :adStatusCancel oמורה ל ADO-לבטל את הפעולה (כאמור ,לא ניתן לבצע זאת אם הערך הקודם של adStatusהיה )adStatusCantDeny :adStatusUnwantedEvent oמורה ל ADO-לחדול משליחת האירוע - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 תרגיל – 6התוכנ ית ConnectWithEvents בתרגיל זה ניצור חיבור בין תוכנית Visual Basicלבין מקור נצונים באמצעות ADOתוך שימוש ב OLE Providerעבור ,SQL Serverכמו כן נשתמש ב-Event-ים של האובייקט Connectionבתרגיל זה .1שלבים 1-1בתרגיל זה ,זהים לתרגיל הקודם (לתוכנית זו הקצה את השם )ConnectWithEvents .1צור :Connection String בתרגיל זה ניצור Connection Stringשישתמש בMicrosoft OLEDB Provider for SQL Server- שליטה בתחביר של ה Connection String-ויצירת ה Connection String-היא ,כאמור ,משימה מפרכת, לפיכך נשתמש באובייקט ADODCבאופן זמני כדי ליצור את ה ConnectionString-באמצעות :Wizard oמהתפריט Projectבחר ב Components-והוסף את הרכיב Microsoft ADO Data Control 6.0 ) (OLEDBלפרוייקט oהוסף אובייקט ADODCלטופס oלחץ לחיצה ימנית על הפקד שהוספת ובחר ב ,Properties-חלון המאפיינים של ADODCאמור להפתח oבכרטיסייה Generalבחר ב Use Connection String-ולאחר מכן לחץ על הלחצן Build...הממוקם מימין לתיבת הטקסט ,ייפתח חלון שכותרתו Data Link Properties oמתוך רשימת ה OLEDB Providers-בחר בMicrosoft OLEDB Provider for SQL Server- ולאחר מכן לחץ על Next oבסעיף 1בכרטיסייה Connectionבחר ב Server-שבו ממוקמת מערכת SQL Serverשאליה אתה מתחבר oבסעיף 2הזן שם משתמש וסיסמה או שתבחר ב Use Windows NT Integrated Security-אם מערכת ה SQL-שאליה אתה מתחבר מאפשרת זאת .תוכל להזין את שם המשתמש saבצירוף סיסמה ריקה אם במערכת ה SQL Server-לא שונו ההגדרות oבסעיף 3בחר מתוך רשימת ה-Database-ים את Northwind oתוכל ללחוץ על Test Connectionכדי לבחון האם ה Connection-שהגדרת פועל oלחץ על ,OKכעת חזרת לכרטיסייה General oשים לב שבתיבת הטקסט מופיעה מחרוזת ,העתק מחרוזת זו ע"י סימונה ולחיצה על Ctrl+C oסגור את חלון ה Property Pages-והסר את אובייקט ה ADODC-מהטופס ,תוכל להסיר גם את ההתיחסות ל Microsoft ADO Data Control 6.0 (OLEDB)-שהוספת קודם .3הוסף את הקוד הבא לטופס: Option Explicit Dim WithEvents conn As ADODB.Connection בשורה זו מוצהר אובייקט Connectionתוך שימוש במילה WithEventsכדי שגם האירועים שלו יילכדו )(Private Sub Form_Load Set conn = New ADODB.Connection End Sub בעת טעינת הטופס יוצרים את האובייקט )(Private Sub cmdConnect_Click On Error Resume Next _ & ";conn.ConnectionString = "Provider=SQLOLEDB.1 _ & ";"Persist Security Info=False _ & ";"User ID=sa;Initial Catalog=Northwind ""Data Source=WIN2K - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 conn.Open If Err.Number <> 0 Then MsgBox "Error No. " & Trim(Str(Err.Number)) & ":" & vbCrLf & _ Err.Description Err.Clear conn.Errors.Clear End If End Sub 1 זוהי המחרוזת שהעתקת בשלב: (שים לבConnection String- מגדירים את הConnect בעת לחיצה על ) שהוספת באופן זמני לטופסADODC של האובייקטProperty Pages-מחלון ה בוטלה או נכשלה, כדי לבחון האם ההתחברות הצליחהErr נבדק האובייקטOpen לאחר הפעלת הפרוצדורה מסיבה כלשהי Private Sub conn_WillConnect(ConnectionString As String, _ UserID As String, _ Password As String, _ Options As Long, _ adStatus As ADODB.EventStatusEnum, _ ByVal pConnection As ADODB.Connection) If adStatus = adStatusOK Then If MsgBox("Do you want to cancel the operation?", _ vbYesNo Or vbQuestion Or vbDefaultButton2) = vbYes Then adStatus = adStatusCancel End If End If End Sub מציגים למשתמש שאלה המאפשרת לו לבטל את פעולת ההתחברותWillConnect באירוע משמעותו היא שלאadStatusOK .adStatusOK- שווה לadStatus שאלה זו מוצגת רק אם ערך:שים לב התרחשו שגיאות וכן ניתן לבטל את הפעולה Private Sub conn_ConnectComplete(ByVal pError As ADODB.Error, _ adStatus As ADODB.EventStatusEnum, _ ByVal pConnection As ADODB.Connection) If conn.State = adStateOpen Then MsgBox "Connection successful" cmdConnect.Enabled = False cmdDisconnect.Enabled = True End If End Sub אם כן מציגים הודעה למשתמש, בודקים אם ההתחברות הצליחהConnectComplete-ב אירוע זה יטופל שם,cmdConnect_Click אם ההתחברות נכשלה אזי תיווצר שגיאה שתילכד באירוע כיוון שבשלב זהConnectComplete לא תוכל לבדוק אם התרחשה שגיאה בהתחברות בתוך האירוע:שים לב conn.Open שגיאה תתעורר רק בסיום נסיון ההתחברות לאחר בשורה שבה כתוב,0 יהיהErr.Number ערך - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il ActiveX Data Objects :12 שיעור Private Sub cmdDisconnect_Click() conn.Close End Sub Close נסגר החיבור על ידיDisconnect בעת לחיצה על Private Sub conn_Disconnect(adStatus As ADODB.EventStatusEnum, _ ByVal pConnection As ADODB.Connection) If conn.State = adStateClosed Then MsgBox "Disconnected" cmdConnect.Enabled = True cmdDisconnect.Enabled = False End If End Sub מציגים הודעה מתאימה למשתמשadStateClosed- שווה לconn.State אם פעולת הניתוק הצליחה וערכו של Private Sub Form_Unload(Cancel As Integer) If conn.State = adStateOpen Then conn.Close End If Set conn = Nothing End Sub בעת הסרת הטופס מנתקים את החיבור אם לא נותק עד כה : בחינת הפרוייקט.1 הרץ את הפרוייקט ובחן את פעולתו כדי לבחון אותה מקרובF8 באמצעותStep By Step אני ממליץ בפניך להריץ את התוכנית RECORDSET האובייקט DisplayEmployees – התוכנ ית7 תרגיל Employees ונציג את תוכן הטבלהNorthwind- בתרגיל זה ניצור חיבור ל : ושמור אותוStandard EXE צור פרוייקט.1 frmDisplayEmployees ולטופס את השםDisplayEmployees הקצה לפרוייקט את השם שמור את הפרוייקט :ADO לספרייתReference הוסף לפרוייקט.1 Project מתוך התפריטReferences בחר באפשרות (אם יש לך גירסה מוקדמת יותר אוMicrosoft ActiveX Data Objects 2.7 Library ליד הספרייהV סמן ) ליד הספרייה המעודכנת ביותרV סמן,מאוחרת יותר : והגדר את המאפיינים הבאים, אחד לטופסTextBox-ים ו-CommandButton הוסף שני.3 ערך Test Connection 3- Fixed Dialog 2-CenterScreen cmdUseTableName Use table name cmdUseSQLStatement מאפיין אובייקט Caption frmDisplayEmployees BorderStyle StartUpPosition Name Command1 Caption Name Command2 - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il לתוכניתניםVisual Basic 6 Use SQL statment txtDisplay True 3 - Both Caption Name Multiline ScrollBars Text1 :הטופס צריך להיראות דומה לזה שבציור : הוסף קוד לטופס.1 Option Explicit Dim conn As ADODB.Connection Dim rcs As ADODB.Recordset עבור אחזור שלrcs- וNorthwind- עבור התחברות לconn ,בשתי השורות הנ"ל מצהירים עלש ני אובייקטים )Recordset( אוסף רשומות Private Sub Form_Load() Set conn = New ADODB.Connection conn.Open "Provider=SQLOLEDB.1;" & _ "Persist Security Info=False;" & _ "User ID=sa;" & _ "Initial Catalog=Northwind;" & _ "Data Source=WIN2K" If conn.State = adStateClosed Then MsgBox "Error: Fail to connect" Unload Me End If Set rcs = New ADODB.Recordset Set rcs.ActiveConnection = conn End Sub Open באמצעות הפרוצדורהNorthwind- פותחים חיבור לForm_Load באירוע :שים לב - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il ActiveX Data Objects :12 שיעור בדוגמאות.Open- או כפרמטר לOpen לפני הפעלתConn- לConnection String- ניתן להעביר את ה.1 Open לפני הפעלתConnection String-הקודמות העברנו את ה כפי שעשית בתרגיל הקודםADODC צור באמצעות פקדConnection String- את ה.1 לחיבורconn והופכים את החיבור,New חדש באמצעות המילהRecordset יוצרים, לאחר יצירת החיבור rcs ) עבור האובייקטActiveConnection( הפעיל Private Sub cmdUseTableName_Click() If rcs.State = adStateOpen Then rcs.Close End If rcs.Source = "Employees" rcs.Open , , , , adCmdTable txtDisplay.Text = "" DisplayRecordset rcs End Sub כדי לאחזר את רשומות הטבלהrcs שלOpen מפעילים את הפרוצדורהUse table name בעת לחיצה על Employees :שים לב ) (כפי שתראה בשגרה הבאהOpen בעת הפעלת המתודהrcs- לSourec String-ניתן להעביר את ה .1 . וכו') אין חובה להעביר,adCmdText – SQL משפט,adCmdTable – את סוג הפקודה (בקשת טבלה .1 יהיהחייב להחליט באיזה סוג פקודהOLE Provider- יהיה הפסד ביצועי קל כיוון שה,במקרה כזה מדובר באמצעותrcs ולהשימו לתוךADODB.Command ניתן להגדיר פקודה באמצעות אובייקט מסוג .3 rcs.ActiveCommand המאפיין שנכתוב בהמשךDisplayRecordset מוצגות הרשומות באמצעות הפרוצדורה, לאחר שהמשפט בוצע Private Sub cmdUseSQLStatement_Click() If rcs.State = adStateOpen Then rcs.Close End If rcs.Open "SELECT * FROM Employees", , , , adCmdText txtDisplay.Text = "" DisplayRecordset rcs End Sub אלא שנשתמש,Employees נציג את תוכן הטבלהUse SQL Statement- גם ב,Use table name-בדומה ל במקום שם טבלהSQL במשפט SQL המציין כי מדובר במשפטadCmdText שים לב שסוג הפקודה שצויין הוא Private Sub DisplayRecordset(rs As ADODB.Recordset) rs.MoveFirst Do Until rs.EOF DisplaySingleRecord rs.Fields txtDisplay.Text = txtDisplay.Text & vbCrLf rs.MoveNext Loop End Sub - 112 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים ברוטינה DisplayRecordsetמציגים את תוכן הטבלה באמצעות לולאה הסורקת את אוסף הרשומות עד שמגיעים ל EOF-המציין את סיום אוסף הרשומות השימוש במתודה MoveFirstנועד לאתחל את ה Recordset-כך שימוקם ברשומה הראשונה ברוסף עבור כל רשומה מעבירים את אוסף השדות שלה למתודה ( DisplaySingleRecordמוגדרת בהמשך) באמצעותה מציגים את הרשומה הנוכחית באוסף הרשומות )Private Sub DisplaySingleRecord(flds As ADODB.Fields Dim fld As ADODB.Field For Each fld In flds _ & txtDisplay.Text = txtDisplay.Text _ & " = " & fld.Name _ & )IIf(IsNull(fld.Value), "<Null>", fld.Value )" " String(8, Next End Sub עבור כל רשומה ,סורקים את אוסף השדות שבה ,תוך הצגת שמות השדות ותוכנם אם ערך שדה מסוים הוא Nullמציגים את המחרוזת ><Null )Private Sub Form_Unload(Cancel As Integer Set rcs = Nothing Set conn = Nothing End Sub באירוע Form_Unloadמשחריים את ה Connection-ואת הRecordset- .1בחינה והרצת הפרוייקט: הרץ את התוכנית ובדוק את פעולתה המאפי ין CursorType :adOpenForwardOnlyיוצר Cursorהנע קדימה בלבד .ב Cursor-מסוג זה תוכל להשתמש במתודות MoveFirst , MoveNextאו Moveעם פרמטר חיובי .לא תוכל לדלג לרשומה האחרונה באמצעות MoveLastאו לחזור לרשומותקודמות באמצעות MovePreviousאו Moveעם פרמטר שלילי Cursor .מסוג Forward Only יכול להיות בצד ה Server-בלבד .ל Cursor-זה הביצועים הטובים ביותר. :adOpenDynamicיוצר Cursorהמאפשר תנועה חופשית ב Cursor .Recordset-מסוג זה מעודכן תמיד בנתונים העדכניים ביותר מה .Database-בעת מעבר לרשומה מסוימת ,מובאת הרשומה המעודכנת מה Cursor .Database-מסוג זה יכול להיות ממוקם בצד ה Server-בלבד .ל Cursor-זה הביצועים הגרועים ביותר. :adOpenKeysetבדומה ל Cursor ,adOpenDynamic-מסוג זה מציג גם הוא את הנתונים העדכניים ביותר .עם זאת Cursor ,מסוג Keysetאינו מציג רשומות חדשות שנוספו על-ידי משתמשים אחרים Cursor .מסוג Keyset יכול להיות במחשב ה Server-בלבד. Cursor :adOpenStaticמסוג זה יוצר העתק של הנתונים המאוחזרים מה .Database-ניתן לנוע בחופשיות בין הרשומות שב Cursor-סטטי .שינויים הנעשים על ידי משתמשים אחרים ברשומות לא יעודכנו ב Cursor-מסוג זה. ביצועיו של Cursorסטטי הם טובים למרות שמשך הטעינה הראשון הוא ממושך יחסית .מומלץ לעבוד עם Cursor כזה כאשר מספר הרשומות המאוחזרות קטן יחסית Cursor .סטטי הוא ה Cursor-היחיד הניתן ליצירה בצד הClient- - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 תנועה ב Recordset - :MoveFirstהופך את הרשומה הראשונה ב Recordset-לרשומה הנוכחית :MoveLastהופך את הרשומה האחרונה ב Recordset-לרשומה הנוכחית :MoveNextהופך את הרשומה הבאה לרשומה הנוכחית :MovePreviousהופך את הרשומה הקודמת לרשומה הנוכחית ) :Move(nהופך את הרשומה הנמצאת המרחק nמהרשומה הנוכחית ,לרשומה הנוחכית n( .יכול להיות גם מספר שלילי) ( CURSORSסמנים) Cursorהוא מערך רשומות המתקבל כתוצאה משליחת בקשה לDatabase- ניתן לשלוט על שלושה מאפיינים של :Cursor ( CursorLocation oמיקום ה)Cursor- ( CursorType oסוג ה)Cursor- ( LockType oסוג הנעילה) ניתן להגדיר מאפיינים אלו ,כל עוד לא נפתח ה Recordset-באמצעות הפרוצדורה Open בשלושת הסעיפים הבאים יפורטו מאפיינים אלו המאפי ין LockType :adLockReadOnly מאפיינים נוספים :MaxRecordsקובע את מספר הרשומות המקסימלי שיאוחזר מהDatabase- :CashSize תרגיל – 3התוכנ ית Nevi gateRecords בתוכנית זו תנווט בין רשומות באמצעות המתודות MoveFirst ,MovePrev ,MoveNextו .MoveLast-כמו כן תשתמש באירועים MoveCo .1לסיים .1לסיים .3 .1 .1 CONTROL ADO DATA ADODCהוא Controlהמבוסס על אובייקט מסוג ADO ADODCניתן לקשר לאוסף רשומות מ Database-בדרכים שונות ניתן להגדיר את ADODCכספק נתונים עבור פקד שהוא צרכן נתונים רוב הפקדים הסטנדרטיים תומכים ב ,Data Binding-כלומר יכולים לשמש כצרכני נתונים כדי שניתן יהיה להשתמש בADODC -יש להגדיר אליו הפניה בProject Components- - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים האובייקט Recordset הוספת רשומה חדשה מחיקת רשומה התחלת טרנזקציה (באמצעות גישה ל ActiveConnection-מתוך ה)Recordset- myadodc.Recordset.AddNew myadodc.Recordset.Delete myadodc.Recordset.ActiveConnection.BeginTrans סיום תוך שמירה של הטרנזקציה סיום ואי שמירה של הטרנזקציה לפי בדיקה שלי אין תמיכה בTransaction Nested- ADODCמבצע Commitאוטומטית בסוף ,אלא אם קראת לBeginTrans- myadodc.Recordset.ActiveConnection.CommitTrans myadodc.Recordset.ActiveConnection.RollbackTrans Propertiesשל ADODC :Alignמגדיר כיצד ייושר הפקד על פני הטופס :BOFActionמגדיר מה יבוצע בעת ניסיון לחרוג מתחילת אוסף הרשומות (:)Beginning Of File -BOF :adDoMoveFirst oגורם להחזרה לרשומה הרשואנה :adStayBOF oנשאר בBOF- :EOFActionמגדיר מה יבוצע ה ADODC-בעת ניסיון לחרוג מתחום אוסף הרשומות()End Of File - EOF :adDoMoveLast oמחזיר לרשומה האחרונה :adStayEOF oנשאר בEOF- :adDoAddNew oגורם להוספת רשומה חדשה :ConnectionStrinמחרוזת המכילה את כל הפרטים הדרושים לשם התחברות לDatabase- Usernameו :Password-כוללים את שם המשתמש והסיסמה ,שבאמצעותם מתחברים לDatabase- :ConnectionTimeoutמגדיר את משך זמן שלאחריו ייפסק הניסיון להתחבר אל הDatabase- :Modeמגדיר את אוסף הפעולות המותר מול הDatabase- :RecordSourecמגדיר את מקור הרשומות עבור ה .ADODC-קיימות ארבע אפשרויות: :Table oטבלה או שאילתה :StoreProcedure oשגרה מאוחסנת בDatabase- :Text oמשפט SQL :CommandTypeמגדיר את סוג הRecordSource- :CommandTimeoutמגדיר את משך הזמן שלאחריו ייפסק ניסיון להפעיל פקודה מול הDatabase- :Captionכותרת הפקד Methodsשל ADODC :Refreshמרענן את התצוגה (חשוב לאחר ביצוע שינויים כגון Deleteאו CommitTransאו ביטול שינויים באמצעות )RollbakTrans - 113אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור ActiveX Data Objects :12 Eventsשל ADODC :WillChangeRecordמתרחש רגע לפני שרשומה מעודכנת .זהו המקום לבצע בדיקת ערכים ולאשר או לבטל את השינוי :Errorמתרחש כאשר מתרחשת שגיאה כלשהי .ניתן לבטל את ההודעה המוצגת ע"י שינוי ערכו של fCancelDisplayהמועבר להודה – לערך True עיצוב הנתונים ניתן להשתמש במספר דרכים: oהמאפיין DataFormatשל Bound Controlsאך לא תמיד מאפיין זה פועל כמו שצריך oקוד בדיקה מותאם אישית – כרוך בעבודה רבה oשימוש בStdDataFormat Objects- StdDataFormats Obj ects לסיים יש להוסיף Referenceאליו מתוך ( Project References הערות לגבי Data Bound Controls כאשר משתמשים ב Data Bound Label Control-יש להגדיר את המאפיין UseMnemonicsלערך Falseכדי שתוי אמפרסנד לא יוצגו כקו תחתי. CheckBoxמקבל ערך vbCheckedעבור ערך שונה מ 2-ב vbUnchecked ,Database-לערך ,0וvbGrayed לNull- יש לקשר CheckBoxאך ורק לערך בוליאני ,כיוון שיש לו שני מצבים שהמשתמש שולט בהם True -או False תמונות מ Access-יש לקשר לcontrol OLE- תמונות מ SQL Server-ניתן לקשר לPicture Box- OptionBoxאינו ,Data Bound Controlולפיכך כדי להשתמש בו בצמוד לשדה מה .Database-בכל אופן ,ניתן לבצע טריקים כדי לפתור את הבעיה בדרך עקיפה ,וגם כמובן ליצור ActiveXמתאים ניתן לשנות בזמן ריצה את ה DataSource-ל ADODC-אחר( .לא קיימת אפשרות כזו ב Data-ובRDO Data - )Control - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור COM+ :11 בשיעור זה: תכיר את המודל N Tiersותשווה אותו לTiers 1- תכיר את ( MTS - Microsoft Transaction Serverזהו COM+ב ,)Windows 2000-תבין את פעולתו ביחס לניהול טרנזקציות ,ותכיר בחשיבותו תלמד להפוך את רכיבי הקוד שאתה מפתח ב Visual Basic-ל Business Objects-הפועלים תחת COM+ תרגיל COM+Demo : 1 בתרגיל זה ניצור אפליקצית COM+ריקה (כלומר ללא רכיבים) בתרגילים הבאים תיצור רכיבי COM+באמצעות Visual Basicותוסיף אותם לאפליקציה זו .1פתח את החלון :Component Services פתח את ה Control Panel-ומשם עבור לAdministrative Tools- בחר ב Component Services-החלון הבא אמור להיפתח: .1הוסף אפליקצית COM+ריקה: בפנל השמאלי הרחב את הענף Component Services עבור ל My Computer-ומשם ל( COM+ Applications-לחץ על COM+ Applicationsבאמצעות הלחצן השמאלי של העכבר כך שהאפליקציות המותקנות יוצגו בפנל הימני) לחץ לחיצה ימנית על COM+ Applicationsובחר ב New-ואחר כך בApplication- - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור COM+ :11 Wizardהמשמש להתקנת אפליקציית COMייפתח: oבמסך הראשון של ה Wizard-לחץ על Next oבמסך השני של ה Wizard-קימות שתי אפשרויות .האפשרות הראשונה ,להתקין אפליקציה מוכנה על ידי בחירת קובץ התקנה ,והאפשרות השניה ,ליצור אפליקציה חדשה .בחר באפשרות השניה Create an empty application oבמסך השלישי של ה Wizard-עליך להקצות שם לאפליקציה ולבחור את אופן ההפעלה של האפליקציה .קיימים שני סוגי הפעלה לאפליקצית Library Application :COM+וServer - Library Application .Applicationמציין כי האפליקציה תרוץ כמו DLLבתוך ה Process-שיצר את רכיב מהאפליקציה Server Application .מציין כי האפליקציה תרוץ בתוך Processמשל עצמה .הגדר את המאפיינים כפי שמתואר בציור שלפניך: - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים oבמסך הרביעי של ה Wizard-עליך לקבוע תחת איזה משתמש NTהאפליקציה תרוץ בעת טעינתה. תוכל לבחור שם משתמש מסוים ולהזין את הסיסמה ,או לבחור Interactive userשמשמעותו היא כי האפליקציה רצה תחת חשבון המשתמש המחובר למערכת oבמסך האחרון של ה Wizard-לחץ על Finish .3עיין במאפייני האפליקציה: בפנל הימני של חלון ה Component Services-יוצג סמל האפליקציה COM+Demoשזה עתה יצרת לחץ לחיצה ימנית על סמל האפליקציה ובחר באפשרות .Propertiesהחלון COM+Demo Propertiesאמור להיפתח כפי שמוצג בציור הבא: - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור COM+ :11 בחלון זה מוצגות שש כרטיסיות: oבכרטיסייה Generalתוכל להוסיף שדה תיאור ( )Descriptionלאפליקציה oבכרטיסייה Securityתוכל להגדיר נושאי אבטחה שונים הקשורים להפעלת האפליקציה oבכרטיסיה Identityזהה לזה שפגשת ב Wizard-בעת יצירת האפליקציה oהכרטיסיה Activationזהה לאפשרות Activation typeשפגשת ב Wizard-בתחילת התרגיל oשים לב :אם אתה משנה את אופן ההפעלה של האפליקציה ,האפשרויות בשאר הכרטיסיות ישתנו בהתאם oהכרטיסייה Queuingמגדירה את אופן הפעולה ההדי יחד עם MSMQ oבכרטיסיה Advancedתוכל להגדיר הגדרות שונות ,כגון משך הזמן בו Processשל אפליקציה ישאר מופעל ,למרות שהאפליקציה אינה פעילה באותו השלב ,הגנות מסוימות על האפליקציה ועוד בתרגיל שלנו השאר את ההגדרות ללא שינוי ,וסגור את חלון הCOM+Demo Properties- יצירת רכיבים המותאמים לפעולה תחת COM+ המאפי ין MTSTransact ionMode COM+משתמש במאפיין MTSTransactionModeכדי לקבוע האם יש להפעיל את האובייקט בתוך טרנזקציה, והאם טרנזקציה נדרשת או אופציונלית מאפיין זה משפיע רק על האובייקטים הנוצרים תחת .COM+אובייקטים שאינם נוצרים תחת COM+אינם מושפעים ממאפיין זה - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים מאפיין זה יכול לקבל אחד מהערכים הבאים: :NotAnMTSObject oהאובייקט אינו תומך בCOM+- :NoTransactions oהאובייקט אינו תומך בטרנזקציות .מאפיין זה מציין שהאובייקט אינו רץ במסגרת טרנזקציות .כאשר נוצר אובייקט חדש ,ל ObjectContext-המוצמד לאובייקט לא נוצרת טרנזקציה. :RequiresTransaction oמאפיין זה מציין כי האובייקט חייב לרוץ במסגרת טרנזקציה .כאשר אובייקט חדש נוצר ,ה ObjectContext-שלו יורש את הטרנזקציה מה ObjectContext-של ה .Client-אם אין טרנזקציה ב ObjectContext-של ה Client-תיווצר טרנזקציה חדשה עבור האובייקט. :UsesTransaction oערך זה מציין כי האובייקט משתמש בטרנזקציה של האובייקט המשתמש בו (ה .)Client-כאשר נוצר אובייקט חדש הוא יורש את הטרנזקציה מאובייקט ה .Client-אם לאובייקט ה Client-אין טרנזקציה ,אזי גם ל ObjectContext-של האובייקט הנוצר לא תיווצר טרנזקציה. :RequiresNewTransaction oערך זה מציין שלאובייקט הנוצר חייבת להיווצר טרנזקציה חדשה בתוכה הוא ירוץ .כאשר נוצר אובייקט חדש COM+יוצר עבורו טרנזקציה חדשה ללא קשר לקיום או היעדר טרנזקציה באובייקט ה.Client- לרוב תקצה לאובייקטים שלך את המאפיינים UsesTransactionאו .RquiresTransactionההבדל בין שני הערכים הללו הוא במקרה שטרנזקציה אינה קיימת באוביקט היוצר אותם ,שאז עבור אובייקטים בהם מוגדר המאפיין כ RquiresTransaction-נוצרת טרנזקציה חדשה ,ואילו עבור אובייקטים בהם מוגדר המאפיין כ UsesTransaction-לא תיווצר טרנזקציה הגדרת מאפיין כ RequiresNewTransaction-כמו RequiresTransactionמבטיחה כי האובייקט יפעל במסגרת טרנזקציה .עם זאת הערך RequiresNewTransactionיוצר טרנזקציה חדשה שאינה תלויה בטרנזקציה של האובייקט המכיל (אובייקט ה .)Client-מאפיין זה שימושי כאשר רוצים לבצע רישום פעילות של אובייקט ה Client-ללא קשר להצלחה או כישלון של הטרנזקציה שלו. האובייקט ObjectContext להוסיף הסבר אודות Objetct Context תרגיל MTSSample.dll : 2 בתרגיל זה ניצור רכיב DLLאשר יתמוך בCOM+- לרכיב שניצור נוסיף פונקציה בשם ExecuteTransactionהמקבלת שני פרמטרים: oמערך של -Stringים המייצגים -ConnectionStringים למקורות מידע שונים oמערך של -Stringים של משפטי SQLשיש להריץ מול מקורות המידע הללו הרעיון שבבסיסו של רכיב זה :אם אחד ממשפטי ה SQL-המבוצע מול אחד ממקורות הנתונים נכשל ,יתבצע Rollbackלכל משפטי ה SQL-שבוצעו עד כה .1צור תוכנית ActiveX DLLריק: הקצה לפרוייקט את השם MTSSampleDLL הקצה ל Class-בפרוייקט את השם MTSObj שמור את הפרוייקט .1התאם את הגדרות הפרוייקט: מתוך התפריט Projectבחר ב ,MTSSampleDLL Properties...-כך שיוצג חלון המאפיינים של הפרוייקט בכרטיסיה Generalסמן Vליד האפשרות .Unattended Executionאפשרות זו מבטיחה כי הרכיב לא יציג ממשק משתמש (למשל על ידי שימוש בפונקציה .)MsgBoxאם הרכיב ינסה להציג ממשק ,תירשם שגיאה מתאימה בקובץ ה Log-של המערכת בכרטיסיה Generalוודא כי ב Threading Model-נבחרה האפשרות Apartment Threaded - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il שיעור COM+ :11 .3הוסף הפניות לספריות רכיבים בפרוייקט: כיוון שהפרוייקט משתמש ברכיבי ADOוברכיבי COM+כדי לגשת למקורות הנתונים יש להוסיף הפניות מתאימות בחלון הReferences- בחר באפשרות References...מתוך התפריט Project סמן Vליד הספריה Microsoft ActiveX Data Objects 2.7או גירסה אחרת (בחר את הגירסה המעודכנת ביותר במחשב שלך) סמן Vליד הפריט COM+ Services Type Library .1הגדר את המאפיין :MTSTransactionMode האפשרויות השונות של המאפיין MTSTransactionModeהוסברו קודם בחר באפשרות 2 - RequiresTransaction כך אנו מבטיחים שהאובייקט שלנו ירוץ בתוך טרנזקציה .אם האובייקט נקרא על ידי אובייקט אחר שיש לו טרנזקציה ,האובייקט שניצור ישתתף בטרנזקציה של אובייקט האב .אם אין לאובייקט האב טרנזקציה משלו ,תיווצר טרנזקציה חדשה עבור האובייקט .1הוסף קוד למחלקה: במודול המחלקה MTSObjהוסף את הקוד הבא: Option Explicit _ Public Sub ExecuteTransaction(strSQLStatements() As String, )strConnectionStrings() As String Dim l As Long Dim u As Long On Error GoTo Err_Handler בעת התרחשות שגיאה תתבצע קפיצה ל Err_Handler-שם תיקרא השגרה SetAbortותוחזר שגיאה מתאימה לפונקציה הקוראת )l = LBound(strSQLStatements )u = UBound(strSQLStatements Do While l <= u )adoExecute strSQLStatements(l), strConnectionStrings(l l = l + 1 Loop בלולאה זו מפעילים את הפונקציה ( adoExecuteמוגדרת בהמשך) אשר מריצה כל משפט SQLיחד עם ה ConnectionString-המתאים לו GetObjectContext.SetComplete בשורת קוד זו ,לאחר שכל הקריאות לפרוצדורה adoExecuteשבלולאה לא נתקלו בשום שגיאה ,קוראים ל SetComplete-כדי להשלים את הטרנזקציה Exit Sub Err_Handler: GetObjectContext.SetAbort "Err.Raise vbObjectError + 1024, , "Transaction Failed - 112אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il Visual Basic 6לתוכניתנים אם התרחשה שגיאה כלשהי ,קוראים ל SetAbort-כדי לבטל את הטרנזקציה .בנוסף ,מעוררים שגיאה החוצה כדי לסמן לאובייקט חיצוני המריץ טרנזקציה חיצונית (אם קיים אחד כזה) כי הטרנזקציה של האובייקט נכשלה .באופן כזה מאפשרים לאובייקט החיצוני להגיב בהתאם End Sub _ Private Sub adoExecute(ByVal strSQL As String, ByVal )strConnectionString As String Dim oConn As ADODB.Connection Set oConn = New ADODB.Connection oConn.Open strConnectionString oConn.Execute strSQL oConn.Close End Sub הפונקציה adoExecuteפשוט למדי .בפונקציה זו ,מתבצע חיבור למקור נתונים באמצעות אובייקט Connectionשל .ADODBומתוך אובייקט זה מורצת פקודת ה SQL-תוך שימוש בפרוצדורה Executeשל האובייקט Connection .1קמפל את הרכיב: מתוך התפריט Fileבחר בMake MTSSampleDLL.dll...- תקן שגיאות במידת הצורך .1הגדר רמת תאימות בינרית לרכיב שיצרת: מתוך התפריט Projectבחר באפשרות MTSSampleDLL Properties... בכרטיסיה Componentבחר בBinary Compatibility- אפשרות זו תבטיח שאם תנסה לשנות את ממשק הרכיב שיצרת ,תקבל הודעת אזהרה מתאימה תרגיל : 1הוספת MTSSampleDLL.dllל COM+ - לסיים תרגיל : 4בחינת פעולת MTSSample.dllתחת COM+ לסיים תרגיל : 3הוספת Rolesלאפליקצית COM+ לסיים תרגיל : 6בדיקת הרשאות מתוך רכיב לסיים יש להשתמש במתודה IsCallerInRoleשל הObjectContext- תרגיל : 7העברת ConstructStringלרכיב לסיים תרגיל : 1קליטת ConstructStringמרכיב לסיים Option Explicit - 111אילן אמויאל © כל הזכויות שמורות אין להעתיק ,לשדר או להציג את הספר או חלקים ממנו בשום צורה. מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il COM+ :11 שיעור Implements COMSVCSLib.IObjectConstruct להעביר מחרוזת אתחולCOM+- המאפשר לIObjectConstruct בשורת קוד זו מממשים את הממשק לאובייקט Dim strConstruct As String Private Sub IObjectConstruct_Construct(ByVal pCtorObj As Object) strConstruct = pCtorObj.ConstructString מעביר לאובייקט את מחרוזת האתחולCOM+ מתרחש כאשרIObjectConstruct_Construct האירוע ConstructString- מחזיר את ה, המועבר באירועpCtorObj של האובייקטConstructString המאפיין End Sub Public Property Get Constructor() As String Constructor = strConstruct End Property - 111 אילן אמויאל © כל הזכויות שמורות . לשדר או להציג את הספר או חלקים ממנו בשום צורה,אין להעתיק מותר להפיץ את הספר חינם בשלמותו בלבד אך לא למטרות מסחריות www.kita.co.il כתיבה עריכה :אילן אמויאל כתובת אימייל[email protected] : אתר אינטרנטwww.kita.co.il : © כל הזכויות שמורות למחבר אין להעתיק או לשדר בכל אמצעי שהוא ספר זה או קטעים ממנו בכל צורה ובכל אמצעי אלקטרוני או מכני ,לרבות צילום והקלטה ,אמצעי אחסון והפצת מידע ללא צורך באישור מאת המחבר. מותר להפיץ את הספר חינם וללא ביצוע כל שינוי בתוכנו ,אך שלא למטרות מסחריות