Code pour qu'un contrôle DHTMLEd remplace les guillemets droits par des guillemets bouclés
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
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.