אתה כותב מסמך בעברית. במקביל, אתה מתכתב עם אנשים אחרים באימייל באנגלית, מכין מצגת הכוללת אנגלית, או מוסיף בגוף המסמך הפניות באנגלית. אתה חוזר למקום במסמך בו כתבת עברית, ובמקום עברית, יוצא אותיות אנגליות: במקום "שלום" יוצא לך "akuo". כמה זמן אתה מבזבז מפני ששכחת לחזור למוד עברית?
אתה כותב
פיסקה בעברית,
ובתוך הפיסקה
אתה מכניס
מילה באנגלית.
לאחר מכן, אתה
מבקש להמשיך בעריכת
טקסט בעברית,
אבל שוכח
לחזור למוד
עברית. מה
קורה?
על טעויות
צריך להיענש.
לא? כך נוהגים
לטעון תכנתי
מחשב רבים,
במיקרוסופט ובשאר
העולם. לא אני
המצאתי את זה.
מי שלא מאמין,
יכול לקרוא את
הספר הקלאסי
של Weinberg, משנת 1971.
http://www.dorsethouse.com/books/psy.html . כך,
לטענתו, נוהגים
תכנתים
להצדיק את
העובדה שלא
מנעו ממך את
הטעות
מלכתחילה.
כיצד ניתן
למנוע את
הטעות? על ידי
ניתוח תרחישים.
ב-90% (הערכה)
מהמקרים,
כשאתה מצביע
לתוך טקסט, אתה
מתכוון
להקליד באותה
שפה בה כתוב
הטקסט. נדיר
מאוד שתרצה
לשבור מלה
בעברית ולשלב
בתוכה ספרות
או אותיות
לועזיות.
וכשאתה מצביע
בין מלים בעברית,
בדרך כלל
הטקסט שתוסיף
בין המלים יהיה
אף הוא
בעברית. אם
תרצה להחליף
לאנגלית, תהיה
מודע לכך, ולא
תשכח בדרך כלל
להחליף למוד
אנגלית. פתרון
הבעיה הוא על
ידי התאמת
השפה אוטומטית
לקונטקסט.
כתבת אנגלית,
הצבעת לתוך
טקסט בעברית,
השפה עוברת
אוטומטית
למוד עברית.
מספר
גירסאות של MS-Word
כוללות
אופציה
להתאמה
אוטומטית של
המקלדת לשפה.
הפתרון הפשוט
הוא על ידי
בחירה
באופציה Auto-keyboard switching שנמצאת
במסך
האופציות
(זמין באמצעות
תפריט Tools/Options). משום מה,
אופציה זו
אינה נמצאת
בדף Complex Scripts,
שכולל
אופציות
אחרות בנושא
שפות
דו-כיווניות,
אלא בדף ,Edit ולכן
לא כל כך שמים
לב אליה. כאשר
שינוי השפה נעשה
אוטומטית על
פי הקונטקסט,
הצורך לשנות
את השפה ידנית
יורד עשרות
מונים, והשיטה
של מיקרוסופט,
ככל שהיא
מעצבנת, כבר
לא כל כך
מציקה.
טוב לדעת
שמישהו
במיקרוסופט
חשב על הבעיה
והציע פתרון,
אבל חבל שהוא
לא הצליח
לשכנע את מקבלי
ההחלטות שם
שהאופציה הזו
תהיה ברירת
המחדל, ולכן
אנחנו נאלצים
לחפש בעצמנו
את האופציה
שתקל את חיינו.
אם גירסת MS-Word שברשותך
אינה כוללת
אופציה זו,
עדיין ניתן לפתור
אל הבעיה
בעזרת שני
קבצי Visual Basic אותם
ניתן ליבא ל-Macro Editor,
לאחר שהורדו
מאתר זה: EventClassModue.cls
ו- Bidi.bas, מה
עושים? פותחים
מסמך MS-Word, פותחים
את ה-Macro
Editor בעזרת
תפריט Tools/Macro
ומייבאים את
הקבצים
בתפריט File/Import File
באופיס,
קוד ה-ASCII של
האותיות
העבריות הוא 63.
למה? אין לי
מושג. למרות
שקראתי כבר
מספר מאמרים
על היוניקוד,
עדיין לא
הבנתי מה
ולמה. נשגב
מבינתי. מכל
מקום, בהנחה
שהתצפית הזו
מהמחשב האישי
שלי ישימה גם
למחשב שלכם,
המקרו שעושה
את העבודה זהו
המקרו הבא:
Sub AdaptCursor()
Context = Selection.Characters(1).Text
If Asc(Context) = 63 Then ' Hebrew
Application.Keyboard (1037)
ElseIf (Context >= "A") And (Context <= "Z")
Then
Application.Keyboard (1033)
ElseIf (Context >= "a") And (Context <= "z")
Then
Application.Keyboard (1033)
ElseIf (Context >= "0") And (Context <= "9")
Then
Application.Keyboard (1033)
End If
End Sub
הביטוי Selection.Characters(1).Text מתייחס לתו שמקומו אחרי הסמן (משמאל לו בעברית, מימין לו במספרים ובאנגלית). לכן המקרו בוחר את השפה על פי קוד ה-ASCII של ביטוי זה.
הקטע
הבעייתי הוא
להפעיל את
המקרו. הדרך
הפשוטה
להפעיל
מקרואים, כפי
שהודגמה
בדוגמאות הקודמות,
היא על ידי
הפעלה במפורש,
בעזרת מקש בסרגל
הכלים או
בעזרת מקש
קיצור. במקרה
שלנו, אנחנו
מעוניינים
שהמקרו יופעל
אוטומטית בכל
מקרה של הצבעה
בעזרת העכבר,
וכן במקרה של
הזזת הסמן
בעזרת לוח
המקשים. הדרך
של Visual Basic לזהות
ארועים כאלו
היא על ידי
איבחון
שינויים במצב
של האובייקט Selection.
ולמזלנו,
Visual Basic
מאפשר
לנו להגיב
לשינויים
הללו, ולהפעיל
מקרואים
מתוצרת בית
כתגובה
לפעילות
הקשורה לעריכת
טקסט.
ויז'ואל
בייסיק מאפשר
לנו להפעיל
פונקציה
משלנו בכל פעם
שהמשתמש משנה
את הטקסט
שנבחר על גבי
המסך. זאת, על ידי
הפונקציה WindowSelectionChange.
בפועל, כל
שינוי במיקום
הסמן נחשב
כשינוי בטקסט
שנבחר, ולכן
כל שינוי
במיקום הסמן
יכול להפעיל
פונקציה זו. הדרך
של Visual Basic להפעלת
פונקציות
בתגובה
לפעולה של
המשתמש היא על
ידי הפרדת קוד
המקרואים
לשני קבצים.
כדי שויז'ואל
בייסיק יוכל
להפעיל
פונקציה זו
בשינוי טקסט,
אנחנו צריכים
להגדיר אותה
ב-Class Module
שנקרא EventClassModule, ולהכריז
(ולשריין
מקום) על
משתנה ממחלקה
זו. קטע הקוד
הבא עושה את
העבודה:
Private Sub
app_WindowSelectionChange _
(ByVal Sel As Selection)
SelLenght = Selection.End - Selection.Start
If SelLenght = 0 Then
AdaptCursor
End If
End Sub
מקרו זה מופעל אוטומטית בכל ארוע של המשתמש. בכל מקרה שהמשתמש הצביע מבלי לסמן קטוע, המקרו מפעיל את הפונקציה שמבצעת את החלפת השפה לכעיל.
כעת, מה
שנשאר זה
להגיד ל-Visual
Basic מתי
לאפשר למקרו
זה לפעול,
ומתי למנוע
ממנו לפעול. Visual Basic מחייב תהליך
של רישום.
בכדי להתחיל
בתהליך המעקב,
עלינו
"לרשום" את
המשתנה בעזרת
הפקודה Set.
לדוגמא, אם
הכרזנו על
המשתנה בשם EventModule, אז
פקודת הרישום
תהיה:
Set EventModule.App =
Application
פקודת
הרישום היא:
Set EventModule.App =
Application ' Event Registration
כאשר EventModue זהו השם שאנחנו בחרנו להעניק למודול התוכנה שקולט את הארועים ומגיב להם. ההכרזה על שם המודול היא בפקודה הבאה:
Public WithEvents App As
Word.Application
ההגדרות של EventModule מופיעות בקובץ (EventClassModue.cls)באתר. ניתן ליבא קובץ זה ו-Visual Basic יודע לשמור אותו במקום.
כעת, מה
שנשאר לנו זה
להפעיל את
פונקצית
הרישום (Set).
בדרך
כלל נרצה
שהרישום יהיה
אוטומטי, בכל
פעם שאנחנו
פותחים מסמך.
(אלא אם כן יש
באג בקוד שמשגע
אותנו). הדרך
להפעלה
אוטומטית של
מקרואים היא
על ידי מקרו
עם שם יחודי - AutoExec.
עלינו
לבנות מקרו עם
שם זה, ולבקש
ממנו לרשום
עבורנו את
תהליך ניהול
הארועים. מקרו
זה נמצא אף
הוא בקובץ
(Bidi.bas) באתר
זה.