חיזוי תוצאת ההקלדה

מה יקרה כשתלחץ על מקש תו. האם הוא יכנס למקום עליו מורה הסמן? מה יקרה כשתלחץ על המקש Del, או על Backspace?

תרחיש

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

דוגמא

בדוק כמה זמן יקח לך להכניס רווח בין האותיות C ו-a במחרוזת הבאה: C.2B.1a  

הבעיה

סימון מיקום התו הבא

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

סימון התו המיועד למחיקה

כאשר אתה לוחץ על Del או על Backspace, התו שנמחק אינו תמיד זה שאליו התכוונת.                          

הפתרון

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

 

על |Usability צריך לחשוב מראש!

 

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

 

על |Usability צריך לחשוב מראש!

 

במקרה השני, לעומת זאת, כאשר הסמן ה"לוגי" נמצא אחרי המלה Usability, הצביעה תהיה:

 

על |Usability צריך לחשוב מראש!

 

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

ישום

ניתן ליבא שני קבצי Visual Basic מאתר זה: EventClassModue.cls ו- Bidi.bas, מה עושים? פותחים מסמך MS-Word, פותחים את ה-Macro Editor בעזרת תפריט Tools/Macro ומייבאים את הקבצים בתפריט File/Import File

 

הסבר

המקרו לצביעת הטקסט הוא:

Sub ShowCursorPreview()
  If (Selection.Start > 1) And (Selection.End < ActiveDocument.Characters.Count - 1) Then
    Selection.Start = Selection.Start - 1
    Selection.Range.HighlightColorIndex = wdBrightGreen ' clear
    Selection.Start = Selection.Start + 1
    Selection.End = Selection.End + 1 '
    Selection.Range.HighlightColorIndex = wdTurquoise ' clear
    Selection.End = Selection.End - 1
  End If
End Sub

 

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

Sub app_WindowSelectionChange _
  (ByVal Sel As Selection)
  SelLenght = Selection.End - Selection.Start
  If SelLenght = 0 Then
    AdaptCursor ' change cursor direction according to the language
    ClearCursorPreview

    If ToPreview = True Then
      ShowCursorPreview
    End If
  End If
End Sub

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

Sub ClearCursorPreview()

  If (Selection.Start > 1) And (Selection.End < ActiveDocument.Characters.Count - 1) Then
    Selection.Start = Selection.Start - 2

    Selection.End = Selection.End + 2 '

    Selection.Range.HighlightColorIndex = wdNoHighlight ' clear painting

    Selection.Start = Selection.Start + 2 ' retrieve previous selection

    Selection.End = Selection.End - 2 '

  End If
End Sub

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

עד כאן תיארתי את המקרואים בקובץ EventClassModue.cls.

המקרואים שמפעילים אותם מוגדרים בקובץ Bidi.bas כדלקמן:

Sub StartPreview()

    EventModule.ToPreview = True

End Sub

Sub StopPreview()

    EventModule.ToPreview = False

End Sub

 

Sub AutoExec()

    Set EventModule.App = Application ' Event Registration

    EventModule.ToPreview = False ' do not preview

End Sub

בשלב שני, ניתן להגדיר מקשי גישה למקרואים על סרגל הכלים בעזרת קופסת הדיאלוג Tools/Customize.

חסרונות

??