Visual Basic/יסודות השימוש בשפה/הצהרת תנאי

Visual Basic 6.0



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

בפרק זה, נלמד על הצהרת התנאי (If Statement). זוהי פקודה בסיסית למדי, אך משתמשים בה הרבה גם בכתיבת תוכנות ארוכות ומסובכות. פקודה זו גורמת לתוכנה לבחור האם לבצע חטיבה מסויימת של הקוד, על-פי בדיקה מסויימת שהתוכנה מבצעת. בוואריאציות היותר מתוחכמות שלה, הפקודה גורמת לתוכנה לבחור באחד ממספר נתיבי-פעולה שונים, על פי תוצאות של בדיקה, או אפילו מספר בדיקות. כל זאת נלמד בפרק זה.

הקדמה - מבני בקרה עריכה

ראשית, נלמד בקצרה מספר מושגים.

כאמור לעיל, בתוכנות שכתבנו עד כה שורות הקוד בוצעו על-פי סדר מלמעלה למטה. האמצעי העיקרי בו אנו משתמשים כדי לבקר את זרימת התוכנה הוא מבני בקרה (Control Structures). מושג זה מתייחס לקטעי קוד, בהם התוכנה מבצעת את שורות הקוד באופן שאינו (בהכרח) לינארי.

קיימים שני סוגים של מבני בקרה, ובתוכם מספר מבנים ספציפיים. הסוג המתוחכם יותר הוא מבני לולאות (Loop Structures), עליהם תלמד בהמשך. בפרק זה, נלמד על אחד ממבני ההחלטה (Decision Structures), הוא הצהרת התנאי (If Statement). קיים סוג נוסף של מבנה החלטה פרט להצהרת התנאי, הוא הצהרת הבחירה, עליה נלמד מאוחר יותר. שני מבני-קוד אלו נקראים "מבני החלטה", כיוון שהתוכנה מחליטה אילו שורות קוד לבצע, בהתאם לתוצאותיה של בדיקה שהיא מבצעת.

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

תחביר הצהרת התנאי עריכה

התחביר (Syntax) של הצהרת התנאי הבסיסית נראה כך:

If condition(s) Then
    Statement(s)
End If

כאשר:

condition(s)‎
התנאי או רשימת התנאים, אותם התוכנה בודקת.
Statement(s)‎
שורות הקוד, אותן התוכנה מבצעת אם התנאים מתקיימים.

להזכירכם, כפי שהוסבר בפתיחתו של ספר זה, בדוגמאת הקוד שנכתבה לעיל - המילים המודגשות (If, Then, End If) הן מילים שצריכות להופיע בקוד בדיוק כפי שהן, בעוד שהמילים בכתב נטוי מסמנות מקומות אותם כותב הקוד (אתם) צריך למלא בהתאם לצרכיו.

הבה נעיף מבט בתוכנה המדגימה את הצהרת התנאי. פתח קובץ VB חדש, ומקם בו כפתור-פקודה ותיבת-טקסט. לכפתור קרא cmdAbsolute, ולתיבה txtNumber. העתק את הקוד הבא לחלון הקוד של התוכנה:

Private Sub cmdAbsolute_Click()
    If txtNumber.Text < 0 Then
        txtNumber.Text = -1 * txtNumber.Text
    End If
End Sub

ננסה להבין את הקוד עוד לפני שנפעיל את התוכנה: ראשית, הכותרת של החטיבה cmdAbsolute_Click אומרת לנו שהקוד יתרחש כאשר נלחץ על הכפתור cmdAbsolute. בשורה הבאה מתרחשת הצהרת התנאי; המחשב בודק האם מתקיים txtNumber.Text < 0 - כלומר, האם בתיבת הטקסט מופיע מספר שלילי. אם כן, המחשב מבצע את השורה הבאה - מכפיל את המספר במינוס-אחד. אם התנאי לא התקיים, המחשב אינו מבצע דבר. התוכנה למעשה מוצאת את הערך המוחלט של המספר שבתיבת הטקסט - הופכת אותו לחיובי אם הוא שלילי.

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

כתיבת מספר תנאים עריכה

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

לצורך ההדגמה הבאה, פתח פרוייקט חדש ב-Visual Basic, ומקם בטופס שתי תיבות טקסט וכפתור פקודה. שנה את שמו של הכפתור ל-cmdOk. לתיבת טקסט אחת קרא txtName, ולשנייה קרא txtPassword. בתיבה השנייה, מצא את המאפיין הנקרא PasswordChar וכתוב בתוכו סימן כוכבית. דבר זה יגרום לכך שכאשר המשתמש יכתוב טקסט בתיבה, לא יופיעו האותיות שכתב, ובמקומן יופיעו כוכביות (בדיוק כמו בתוכנות ואתרי-אינטרנט שונים הדורשים סיסמאות). כעת, מקם על הטופס תווית (Label), קרא לה lblSecret וכתוב בה (באמצעות התכונה Caption) את המילה "סוד". הפוך את התווית לבלתי-נראית (באמצעות התכונה Visible).

ברצוננו לגרום לתווית להופיע על המסך לאחר שהמשתמש ילחץ על כפתור-הפקודה, רק בתנאי שהכניס שם-משתמש וסיסמא נכונים. כיוון שברצוננו לבדוק שני תנאים (גם שם-משתמש וגם סיסמא), נשתמש במילת-המפתח And בתוך התנאי שלנו.

נניח ששם המשתמש הרצוי הוא User והסיסמא היא Blue dawn. לחץ לחיצה-כפולה על כפתור-הפקודה על מנת ליצור חטיבת-קוד עבורו, וכתוב בה את הקוד הבא:

Private Sub cmdOk_Click()
    If txtName.Text = "User" And txtPassword.Text = "Blue dawn" Then
        lblSecret.Visible = True
    End If
End Sub

הפעל כעת את התוכנה. אם תלחץ על הכפתור כעת, לא יקרה דבר. כתוב בתיבת הטקסט הראשונה User ובשנייה Blue dawn (יש לשים לב מתי האותיות גדולות ומתי קטנות) - אם תלחץ כעת על הכפתור, התווית תופיע.

נניח כעת שברצוננו לאפשר לשני משתמשים שונים לראות את ה"סוד". לכל משתמש יש שם וסיסמא, ואם יתקבלו שם וסיסמא תואמים אז הסוד יוצג. נאמר שהמשתמש השני נקרא Admin והסיסמא שלו היא Head123; דרך אחת לאפשר לשני המשתמשים לראות את התווית הנסתרת היא לעשות שתי פקודות תנאי שונות:

Private Sub cmdOk_Click()
    If txtName.Text = "User" And txtPassword.Text = "Blue dawn" Then
        lblSecret.Visible = True
    End If
    If txtName.Text = "Admin" And txtPassword.Text = "Head123" Then
        lblSecret.Visible = True
    End If
End Sub

שיטה זו תפעל, אך כמובן שקיימת שיטה נוחה ויעילה יותר ממנה. שיטה זו היא שימוש במילת המפתח Or, אשר גורמת לכך שהפקודות יתבצעו אם התקיים לפחות אחד משני התנאים שהתקבלו. נשתמש בה כך (שים לב ששורת התנאי שבורה באמצע באמצעות הקו-התחתון, כיוון ששורת הקוד מאוד ארוכה):

Private Sub cmdOk_Click()
    If txtName.Text = "User" And txtPassword.Text = "Blue dawn" Or _
     txtName.Text = "Admin" And txtPassword.Text = "Head123" Then
        lblSecret.Visible = True
    End If
End Sub

הפעל כעת את התוכנה. בין אם תכתוב את השם User וסיסמא Blue Dawn, ובין אם תכתוב שם Admin וסיסמא Head123, התווית תוצג (אך היא לא תוצג עבור שילוב לא תקין, כגון שם Admin וסיסמא Blue dawn).

שים לב, כי בתוכנה שכתבנו ניתן לראות שהמחשב בודק קודם-כל זוגות תנאים שביניהם נמצאת המילה And, ולאחריהם הוא בודק תנאים שביניהם נמצאת המילה Or. דבר זה דומה למתמטיקה - כשם שקיים סדר פעולות-חשבון הקובע כי פעולות כפל וחילוק יתבצעו לפני חיבור וחיסור, כך קיים סדר פעולות במחשבים הקובע כי פקודת And תתבצע לפני פקודת Or. אם ברצוננו לעקוף סדר זה, עלינו להשתמש בסוגריים, בדיוק כמו במתמטיקה; כך, את התנאי שעליו דיברנו כעת, ניתן היה גם לכתוב בצורה כזו (שים לב לסוגריים):

If (txtName.Text = "User" And txtPassword.Text = "Blue dawn") Or _
 (txtName.Text = "Admin" And txtPassword.Text = "Head123") Then

"אחרת" עריכה

כשם שהורינו למחשב לבצע פעולות מסויימות כאשר התנאים מתקיימים, ניתן גם להורות לו לבצע פעולות רק אם התנאים אינם מתקיימים. לשם כך, נשתמש במילת-המפתח Else (אחרת).

נמשיך את הדוגמא על-ידי הרחבת התוכנה שכתבנו מקודם. נניח שנרצה שהתוכנה תודיע למשתמש אם הכניס שם וסיסמא לא נכונים. לשם כך, נוסיף את הפקודה Else אחרי ההצהרות שבפקודת התנאי (אך לפני השורה End If), ולאחריה נכתוב את שורות הקוד שיבוצעו כאשר השם או הסיסמא שהוזנו אינם נכונים. נשתמש כאן בפקודה MsgBox, המציגה על המסך תיבה המכילה הודעה עבור המשתמש (בהמשך הספר, נלמד על תכונותיה המתקדמות של פקודה זו). הקוד שלנו יראה כעת כך:

    If txtName.Text = "User" And txtPassword.Text = "Blue dawn" Or _
     txtName.Text = "Admin" And txtPassword.Text = "Head123" Then
        lblSecret.Visible = True
    Else
        MsgBox "Invalid user name or password!"
    End If

הרץ כעת את התוכנית. אם תזין שם או סיסמא שאינם נכונים (או שילוב לא-נכון של שם וסיסמא), תופיע על המסך הודעה המבשרת כי השם או הסיסמא אינם נכונים.

ולסיום... עריכה

נניח שאנו רוצים שתיבת הטקסט lblSecret תציג הודעה שונה עבור המשתמש הנקרא User מאשר עבור השמתמש Admin. כמובן שנוכל לעשות זאת באמצעות סידרה של כמה פקודות If שונות או על-ידי כתיבת If בתוך If (כן, אפשר לעשות זאת, כפי שגם נדגים בהמשך); וכמובן גם שכותבי השפה ידעו שנרצה לעשות דברים כאלה, ולכן הכינו עבורינו דרך פשוטה ונוחה לעשות זאת, באמצעות הפקודה ElseIf. פקודה זו אנחנו כותבים לאחר ההצהרות המתבצעות בתוך פקודת התנאי עצמה, ולפני פקודת ה-Else (אם יש לנו אחת כזאת). לאחר המילה ElseIf נכתוב את התנאים שלה ולאחריהם את המילה Then, ובשורה הבאה נכתוב את ההצהרות שיבוצעו עבור התנאים האלו.

נסו כעת לכתוב בעצמכם את התוכנה בגרסתה הסופית, על-פי הדרישות הבאות:

  1. עבור השם User והסיסמא Blue dawn, תוצג התווית lblSecret, ויכתב בה: ‎"Welcome, user."‎. (השתמשו כמובן בתכונה Caption).
  2. עבור השם Admin והסיסמא Head123, תוצג התווית ויכתב בה: ‎"Welcome, system admin."‎.
  3. בכל מקרה אחר, תוצג הודעת השגיאה ‎"Invalid user name or password!"‎.

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

If Conditions Then
    Statements
[ElseIf Conditions Then
    Statements
ElseIf Conditions Then
    Statements

. . . ]

[Else
    Statements]
End If

ולהלן, מוצגת התוכנה המלאה.

 Private Sub cmdOk_Click()
     If txtName.Text = "User" And txtPassword.Text = "Blue dawn" Then
         lblSecret.Visible = True
         lblSecret.Caption = "Welcome, user."
     ElseIf txtName.Text = "Admin" And txtPassword.Text = "Head123" Then
         lblSecret.Visible = True
         lblSecret.Caption = "Welcome, system admin."
     Else
         MsgBox "Invalid user name or password!"
     End If
 End Sub