Código para fazer uma DHTMLEd controle substituir cotações com aspas curvas

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho um velho, legado VB6 aplicativo que usa o controle de edição DHTML como um editor de HTML.A Microsoft controle de edição DHTML, um.k.um.DHTMLEd, é, provavelmente, nada mais é do que um IE de controle usando o IE do próprio nativo capacidade de edição internamente.

Eu gostaria de modificar o aplicativo para implementar inglesas, como o Word.Especificamente, " é substituído com ou e ' é substituído com ou conforme apropriado, como está escrito;e se o usuário pressiona Ctrl+Z imediatamente após a substituição, ele vai voltar a ser uma linha reta citação.

Alguém tem o código que faz isso?

Se você não tem o código para DHTML/VB6, mas não tem o JavaScript, o código que funciona em um navegador com contentEditable regiões que eu poderia usar que, muito

Foi útil?

Solução

Aqui está a versão 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

Nota:esta solução insere um nível adicional no anular da cadeia.Por exemplo, digitar "Isto é um teste" dá uma cadeia de "Isto é um teste" -> "Isto é um teste" -> "Isto é um teste -> "-> " (nível extra em negrito).Para remover este nível extra que você teria para implementar algum tipo de PostMessage+subclassing solução que não envolva anulação do nativo keypress

editar:Não se esqueça de incluir o Controle de Edição DHTML redistribuível se você está direcionando o Windows Vista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top