Codice per fare in modo che un controllo DHTMLEd sostituisca le virgolette semplici con virgolette inglesi

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

  •  09-06-2019
  •  | 
  •  

Domanda

Ho una vecchia applicazione VB6 legacy che utilizza il controllo di modifica DHTML come editor HTML.Il controllo di modifica DHTML di Microsoft, a.k.a.DHTMLEd, probabilmente non è altro che un controllo di IE che utilizza internamente la capacità di modifica nativa di IE.

Vorrei modificare l'app per implementare le virgolette intelligenti come Word.Nello specifico, " è sostituito con O E ' è sostituito con O appropriato così come è stato digitato;e se l'utente preme Ctrl+Z subito dopo la sostituzione, torna ad essere una citazione semplice.

Qualcuno ha un codice che lo fa?

Se non disponi di codice per DHTML/VB6, ma disponi di codice JavaScript che funziona in un browser con aree modificabili dal contenuto, potrei utilizzare anche quello

È stato utile?

Soluzione

Ecco la versione 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:questa soluzione inserisce un ulteriore livello nella catena di annullamento.Ad esempio, digitando "Questo è un test" si ottiene una catena di "Questo è un test" -> "Questo è un test" -> "Questa è una prova -> “ -> " (livello extra in grassetto).Per rimuovere questo livello extra dovresti implementare una sorta di PostMessage+subclassing soluzione che non comporta l'annullamento della pressione dei tasti nativa

modificare:Non dimenticare di includere il Controllo di modifica DHTML ridistribuibile se stai prendendo di mira Windows Vista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top