עיצוב גרירה והשלכה באמצעות עכבר ליצירת ממשק משתמש נגזר מאב טיפוס של מחולל טפסים שפותח על ידי אלן קופר והחברה שלו "Tripod". מיקרוסופט התקשרה עם קופר וחבריו במטרה לפתח Tripod למערכת טופס לתכנות עבור Windows 3.0, תחת שם הקוד "Ruby" (אין קשר לשפת תכנות רובי). Tripod לא כללה כלל שפת תכנות. מיקרוסופט החליטה לשלב את רובי עם בייסיק כדי ליצור את Visual Basic.
מחולל ממשק רובי סיפק את החלק "החזותי" של Visual Basic בשילוב עם "EB" מנוע בייסיק משובץ שעוצב למערכת מסד נתונים "אומגה" הנטושה של מיקרוסופט. רובי גם סיפק את היכולת לטעון ספריות קישור דינמיות המכיל פקדים נוספים (שנקרא אז "gizmos"), שהפכו מאוחר יותר לסיומת VBX.
בשלביה הראשוניים השפה הייתה חלשה למדי, ובעלת ביצועים נחותים ותחביר פרימיטיבי וחסר גמישות, ולכן לא התאימה למערכות מסחריות, אך במהלך השנים, במיוחד החל מגרסאות 5 ו־6 שבהן הוספו פקדים שיתופיים, יכולת של הידור של הפרויקט לקובצי EXE ,DLL ו־ActiveX וכן פקדי משתמש ומסכי MDI, היא נעשתה חזקה למדי והתאימה להיבטים תכנותיים מסוימים, ובמיוחד ליצירת ממשק משתמש גרפי ולעבודה מול מנועי בסיסי נתונים.
בעקבות או במקביל להצלחה של VB יצאו תוכנות דומות כמו דלפי של בורלנד ומחולל היישומים Access של מיקרוסופט.
פיתוח השפה הופסק אחרי גרסה 6, ובמקומה פותחה Visual Basic.NET, כחלק מ-.NET ולשפה זו מומשו כל עקרונות התכנות מונחה עצמים, תחביר השפה הוגמש וחוזק, והיא חוברה אל פלטפורמת הדוט נט.
מאפיינים של Visual Basic.
השפה היא בעיקרה שפת תכנות ויזואלי מהירה, מונחת אירועים, בעלת טיפוסיות חלשה, שיש בה תמיכה חלקית בתכנות מונחה עצמים.
סביבת הפיתוח.
סביבת הפיתוח של VB כוללת מספר של חלונות:
הטופס.
הטופס הוא לב ליבה של שפה זו. התפיסה היא שמתחילים בשלב הוויזואלי. יוצרים את כל הטפסים של הפרויקט, נותנים תפקודיות ראשונית לכל טופס, באמצעות ציור של פקדים מובנים ושל פקדי Active X על גבי הטופס (שווה להכרזה של משתנה). קינפוג מאפייני הפקדים שבאמצעות חלון התכונות, וכתיבת קוד VB היכן שצריך (גישה נוחה לקוד הרלוונטי בהקלקה כפולה על הטופס או על הפקד). בחלון הקוד אפשר לקבל את רשימת כל האירועים של הטופס ופקדיו, ובבחירת אירוע נוצרת לה אוטומטית שגרת אירוע עם כל הפרמטרים הרלוונטיים. בשגרה יש לכתוב קוד או לקרוא לשגרה/פונקציה שנמצאת במקום אחר. במקרה שעדיין הפונקציונליות הדרושה חסרה, אפשר ליצור הפניה לפונקציות בקובצי DLL או לקובצי COM, או להכריז על פונקציות שנמצאת ב-APIs של המערכת, או לכתוב את הקוד הנצרך במודול או במחלקה.
בגישה הזו הטופס משמש כמֵכל (container) שמחזיק בתוכו את הפקדים השונים, כך שכאשר מעתיקים את הטופס כל הפקדים שבו מועתקים אף הם. בנוסף הטופס משמש גם כאוסף לכל הפקדים (collection) וכך אפשר באמצעות הטופס לעבור על כל הפקדים באופן סדרתי באמצעות לולאה. ישנם חלק מהפקדים שיש להם מאפיין של מֵכל, כך שהם יכולים לשמש בטופס כתת-טופס, ולהכיל בתוכם פקדים שונים (יעיל לקבץ פקדים סביב נושא מסוים). ויש חלק מהפקדים שמכילים בתוכם אוסף של פריטים כמו למשל פקדי תיבת רשימה ותיבה משולבת שמכילים אוסף של רשימות.
User Control.
זהו טיפוס פקד מיוחד שנוצר בידי המתכנת, שהוא מעין מיני טופס, ובעצם הוא מעין ActiveX פנימי של VB. כשם שאפשר ליצור בשפות תכנות טיפוסי משתנים, המבוססים על משתנים קיימים, כך אפשר ב-VB ליצור טיפוסי פקדים חדשים, המבוססים על פקדים קיימים או על שיטות גרפיות של השפה. יוצרים אותו כשם שיוצרים טופס, וברגע שהוא קיים במערכת, נוסף אייקון שלו בסרגל הכלים ואפשר לצייר אותו בכל טופס בפרויקט כשם שמציירים פקד רגיל. זהו למעשה יישום של התפיסה המונחת עצמים והתפיסה המודולרית. לרכז פונקציונליות במחלקה סגורה, שמתקשרת עם החוץ באמצעות תכונות ומתודות חיצוניות. יחודו על סתם מחלקה שהוא בנוסף לקוד יכול להיות בעל מופע חזותי. שימוש פשוט יכול להעשות בו על מנת להכליל טופס אחד בטופס אחר, אך אפשר ליצור באמצעות טיפוס זה פקדים מורכבים. הפקד מתאפיין בקלות שבה ניתן ליצור אותו, ויתרון נוסף בו שניתן לראות את האפקט התכנותי שבו בטופס אחר, גם שלא בזמן ריצה. VB הורישה את הטיפוס הזה לסביבת הדוט נט.
פקדים שיתופיים.
ל-VB5 ול-VB6 הוספו פקדי ActiveX שיתופיים רבים בקובצי OCX. בין הפקדים הללו יש פקדי רבים ומגוונים, שחלקם פועלים באופן הדדי. הצירוף של פקדים אלו הרחיב באופן משמעותי את היכולות של שפה זו, ואפשר למתכנתים לבצע דברים רבים באופן קל ופשוט.
בין הפקדים הרבים ניתן למנות:
למעשה בסביבת הדוט נט חלקם של פקדים אלו אומצו, והפכו להיות פקדים מובנים בסביבת הפיתוח, כאשר האינטגרציה שלהם שופרה, כמו גם מאפיינים ומתודות ששוכללו ונוספו.
אוסף פקדים.
ב-VB6 יש אפשרות ליצור בטופס אוסף פקדים תחת אותו שם, באופן שיהיה אפשר להתייחס לכל הפקדים באמצעות אינדקס כמו למערך, כאשר כל פקד הוא איבר באוסף. אפשרות זו נוחה כאשר צריך לעבור באופן סדרתי על מספר רב של פקדים, לשם שינוי תכונותיהם או קריאת ערכים מהם. כאשר הפקדים בנויים באופן הזה, אפשר בלולאה אחת פשוטה לעבור על כולם. באוסף פקדים ניתן בזמן ריצה להוסיף פקדים נוספים לאוסף. בשיטה זו ניתן ליצור אירוע אחד לכל הפקדים באוסף ולהבדיל ביניהם באמצעות מספר האינדקס של הפקד, דבר שמהווה חיסכון גדול בכתיבת הקוד.
תחביר השפה.
הצהרות.
באמצעות הצהרות השפה ניתן לקבוע דרך של התייחסות הכללית לקוד, כמו למשל האם נדרשת הכרזה על משתנים. (Option Explicit), מהו הטווח של מערכים וכדומה (Option Base).
הצהרה נוספת היא הצהרה על פונקציות בקובצי DLL חיצוניים, באמצעות המילים השמורות Declare ו-Lib.
דוגמה. אם רוצים לנגן קובץ קול באמצעות API של חלונות, אפשר לעשות זאת באמצעות ההצהרה הבאה:
Public Declare Function PlaySound Lib "winmm.dll" (ByVal FileName _
As String, ByVal hmod As Integer, ByVal flags As Integer) As Long
Public Const SND_FILENAME = &amp;H20000
Public Const SND_ASYNC = &amp;H1
PlaySound("C:\App.wav",0,SND_FILENAME+SND_ASYNC)
הכרזת קבועים.
הכרזת קבועים נעשית באמצעות המילה השמורה Const, כאשר אפשר להקדים להגדרת הקבוע האם מדובר בקבוע פרטי או ציבורי.
דוגמה:
Public Const HKEY_USERS = &amp;H80000003
Const KEY As Integer = 12
הכרזת משתנים.
בהכרזת משתנים בשפה זו, שלא כפי שנהוג בשפות כמו C ופסקל, מתבצע איפוס אוטומטי שלהם: מחרוזות לערך ריק, ומספרים ל-0. "התשלום" בזמן מעבד שכרוך בפעילות עיבוד נוספת מאחורי הקלעים, משתלם מבחינה תכנותית וזמן ניפוי קוד ומונע מראש באגים שנוצרים עקב אי אתחול של משתנים. מגבלה הקיימת בשפה היא אי האפשרות לבצע הכרזה והשמת ערך באותה שורה.
בנוסף לכל המשתנים המקובלים, כמו משתנים מספריים שלמים וממשיים בגדלים שונים, משתנה מחרוזת ומשתנה בוליאני, קיימים משתנים נוספים מטיפוסים מיוחדים:
צורת הכרזה של משתנה
Dim|Private|Public VariableName As variableType
משתני מחרוזת ניתן להגדיר בגודל קבוע באמצעות התו *,
Dim String64 As String * 64
הכרזה מקוצרת.
ניתן להכריז על משתנים באמצעות כתיב מקוצר, באמצעות הצמדת סימן מיוחד בהגדרת משתנה, כאשר לכל סוג משתנה מוקצה תו מסוים. למחרוזת (String) - $, למספר שלם (Integer) - %, לשלם ארוך (LongInteger) - &amp;, לנקודה צפה יחיד (Single) - !, לנקודה צפה כפול (Double) - #, למטבע (Currency) - @.
וריאנט.
משתנה וריאנט מהווה tagged union (שיכול להיות מוגדר לכמה טיפוסי משתנים שונים) שיכול לייצג כל טיפוס נתונים (למשל, שלם, משתנה נקודה צפה - float, משתנה single או double, אובייקט וכדומה) מלבד מחרוזת באורך קבוע. ניתן להשתמש במשתנה וריאנט כאשר טיפוס המשתנה ידוע רק בזמן ריצה, כשטיפוס המשתנה צפוי להשתנות תוך כדי התוכנית, או כאשר יוצרים מתודה שמצריכה פרמטרים אופציונליים או מערך פרמטרים.
בשפת Visual Basic .NET טיפוס הווריאנט הוחלף בטיפוס "אובייקט". ישנן נקודות דמיון בקונספט בין וריאנט לאובייקט, אך גם הבדלים משמעותיים, ולא ניתן לבצע המרה ישירה בין טיפוסים אלו. כאשר נדרשת המרת טיפוסים, למשל בעת עבודה מול אובייקט Visual Basic 6 COM, המתודולוגיה המקובלת היא שימוש ב-marshaling.
ניתן להצהיר על משתנה וריאנט A בשתי צורות - מרומזת (implicit) ומפורשת (explicit):
Dim A as Variant
המרה אוטומטית.
ב-VB מתבצע בפעולות השמה המרה אוטומטית כאשר יש לדבר משמעות, כך למשל מספר מחרוזתי יהפוך למספר מסוג המשתנה אליו הושם, או אל סוג האופרטור שעליו נעשית פעולה. בדוגמה הערך שיתקבל ב-A יהיה 6, והפעולה תחשב לתקינה לגמרי.
A = "2" * 3
גם במקרה של השמה מחרוזת למערך בתים, והשמת מערך בתים למחרוזת הדבר תקין, וייתן את התוצאות המתבקשות בכל השמה.
Dim bytesArray() As Byte
bytesArray = "I am a string"
Dim str As String
str = bytesArray
מיספור - Enum.
רשימת ערכים ממוספרת נעשית באמצעות המילה השמורה Enum, הדבר כופה על משתנה או פרמטר בפונקציה להיות בערכים שנקבעו ומהווה עזרה במילוי הערך הנכון. אם קובעים ערכים הם ימוספרו בסדר עולה מהמספר 1.
Public Enum CityList
Albuquerque_nm = 10
Anchorage_AK = 22
Atlanta_GA = 31
Austin_TX = 44
Birmingham_AL = 55
Bismarck_ND = 63
End Enum
Private CityList1 As CityList
בדוגמה ברגע שנבקש לבצע השמה למשתנה CityList1, נקבל רשימה נפתחת ובו הערכים שבEnum
הגדרת משתני משתמש.