2008-09-14 2 views
9

Ich habe eine alte, alte VB6-Anwendung, die das DHTML-Bearbeitungssteuerelement als HTML-Editor verwendet. Das Microsoft DHTML-Bearbeitungssteuerelement, ua DHTMLEd, ist wahrscheinlich nicht mehr als ein IE-Steuerelement, das intern die eigene native Editierfunktion von IE verwendet.Code, um ein DHTMLEd-Steuerelement ersetzen gerade Anführungszeichen mit geschweiften Anführungszeichen

Ich möchte die App ändern, um intelligente Anführungszeichen wie Word zu implementieren. Insbesondere oder " mit ersetzt wird‚‘ und oder " gegebenenfalls ' mit "ersetzt, wie es eingegeben wird, und wenn der Benutzer drückt Strg + Z unmittelbar nach dem Austausch, es geht eine gerade Zitat zu sein.

jemand Code hat das?

das tut Wenn Sie Code nicht für DHTML/VB6, aber tun Sie JavaScript-Code, der mit contentEditable regi in einem Browser funktioniert Ich konnte ons, verwenden Sie das auch

Antwort

14

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. Wenn Sie zum Beispiel "Dies ist ein Test" eingeben, erhalten Sie eine Kette von "Dies ist ein Test" -> "Dies ist ein Test" ->"Dies ist ein Test ->" -> "(zusätzliche Ebene in Fettdruck). Um diese zusätzliche Ebene zu entfernen, müssen Sie eine Art von PostMessage+subclassing Lösung implementieren, die nicht die native Tastenkombination

Bearbeitung zu implementieren: Vergessen Sie nicht, die DHTML Editing Control redistributable zu integrieren, wenn Sie auf Windows Vista ausgerichtet sind.

+1

Wow! Vielen Dank! Gut gemacht! Arbeitete das erste Mal. Ich werde es noch ein klein wenig ändern, um ein paar seltsame Fälle zu behandeln, aber das ist großartig. –

+4

Übrigens liebe ich die Implementierung von IsLetter() ... eine wahre Programmierperle! –

+1

Danke für das Lob; hätte nie gedacht, dass ich sowas von einer Programmierlegende höre :) Betreffend IsLetter: Benutze stattdessen IsCharAlphaW oder eine andere Unicode-fähige Methode. Meine Implementierung war schnell und dreckig, um das Fleisch meiner Antwort nicht zu beeinträchtigen :) – rpetrich

Verwandte Themen