Code pour qu'un contrôle DHTMLEd remplace les guillemets droits par des guillemets bouclés

StackOverflow https://stackoverflow.com/questions/61598

  •  09-06-2019
  •  | 
  •  

Question

J'ai une ancienne application VB6 héritée qui utilise le contrôle d'édition DHTML en tant qu'éditeur HTML. Le contrôle d'édition Microsoft DHTML, a.k.a. DHTMLEd, n'est probablement rien de plus qu'un contrôle IE utilisant la capacité d'édition native de IE en interne.

J'aimerais modifier l'application pour implémenter des citations intelligentes comme Word. Plus précisément, "" est remplacé par " ou " et ' est remplacé par " ou ', selon le type de saisie; et si l'utilisateur appuie sur Ctrl + Z immédiatement après le remplacement, cela revient à être un guillemet simple.

Quelqu'un a-t-il un code qui le fait?

Si vous n'avez pas de code pour DHTML / VB6, mais avez du code JavaScript qui fonctionne dans un navigateur avec des régions contentEditable, je pourrais aussi l'utiliser aussi

Était-ce utile?

La solution

Voici la version VB6:

Private Sub DHTMLEdit1_onkeypress()
    Dim e As Object
    Set e = DHTMLEdit1.DOM.parentWindow.event
    'Perform smart-quote replacement'
    Select Case e.keyCode
    Case 34: 'Double-Quote'
        e.keyCode = 0
        If IsAtWordEnd Then
            InsertDoubleUndo ChrW$(8221), ChrW$(34)
        Else
            InsertDoubleUndo ChrW$(8220), ChrW$(34)
        End If
    Case 39: 'Single-Quote'
        e.keyCode = 0
        If IsAtWordEnd Then
            InsertDoubleUndo ChrW$(8217), ChrW$(39)
        Else
            InsertDoubleUndo ChrW$(8216), ChrW$(39)
        End If
    End Select
End Sub

Private Function IsLetter(ByVal character As String) As Boolean
    IsLetter = UCase$(character) <> LCase$(character)
End Function

Private Sub InsertDoubleUndo(VisibleText As String, HiddenText As String)
    Dim selection As Object
    Set selection = DHTMLEdit1.DOM.selection.createRange()
    selection.Text = HiddenText
    selection.moveStart "character", -Len(HiddenText)
    selection.Text = VisibleText
End Sub

Private Function IsAtWordEnd() As Boolean

    Dim ch As String
    ch = PreviousChar
    IsAtWordEnd = (ch <> " ") And (ch <> "")

End Function

Private Function PreviousChar() As String

    Dim selection As Object
    Set selection = m_dom.selection.createRange()
    selection.moveStart "character", -1
    PreviousChar = selection.Text

End Function

Remarque: cette solution insère un niveau supplémentaire dans la chaîne d'annulation. Par exemple, en tapant " Ceci est un test " donne une chaîne de & # 8220; Ceci est un test & # 8221; - > & # 8220; Ceci est un test " - > & # 8220; Ceci est un test - > & # 8220; - > " (niveau supplémentaire en gras). Pour supprimer ce niveau supplémentaire, vous devez implémenter une sorte de solution PostMessage + sous-classe n'impliquant pas l'annulation de la frappe au clavier native

modifier: n'oubliez pas d'inclure Contrôle de modification DHTML redistribuable si vous ciblez Windows Vista.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top