Code eine DHTMLEd Steuerung ersetzen gerade Anführungszeichen durch typografische Anführungszeichen zu machen

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine alte, ältere VB6-Anwendung, die die DHTML-Bearbeitungssteuer als HTML-Editor verwendet. Die Microsoft DHTML-Bearbeitungssteuerung, auch bekannt als DHTMLEd, ist wahrscheinlich nichts mehr als eine IE-Kontrolle mit IE eigener native Bearbeitung Fähigkeit intern.

Ich möchte die App ändern typografische Anführungszeichen wie Word zu implementieren. Insbesondere " wird ersetzt mit oder und wird ersetzt mit oder gegebenenfalls wie es geschrieben wird;., und wenn der Benutzer drückt Strg + Z unmittelbar nach dem Austausch, es geht zurück ein gerades Zitat zu sein

Hat Code jemand, der das tut?

Wenn Sie DHTML haben Code nicht / VB6, aber tun Sie JavaScript-Code, der mit contentEditable Regionen in einem Browser funktioniert, ich verwenden könnte, zu

War es hilfreich?

Lösung

Hier ist die VB6-Version:

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

Hinweis: Diese Lösung fügt eine zusätzliche Ebene in der Undo-Kette. Zum Beispiel der Eingabe von "Dies ist ein Test" gibt eine Kette von „Dies ist ein Test“ -> „Dies ist ein Test“ -> „Dies ist ein Test ->„-> "(extra Ebene in fett). Um diese zusätzliche Ebene entfernen müssten Sie irgendeine Art von PostMessage+subclassing Lösung implementieren, beinhaltet nicht die native keypress Cancelling

edit: Vergessen Sie nicht die verteilbare DHTML-Bearbeitungssteuer , wenn Sie Windows Vista ausgerichtet sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top