2008-09-14 8 views
9

Tengo una aplicación antigua, heredada VB6 que utiliza el control de edición DHTML como editor de HTML. El control de edición DHTML de Microsoft, a .k.a. DHTMLEd, probablemente no sea más que un control de IE que usa internamente la capacidad de edición nativa de IE.Código para hacer un control DHTMLEd reemplazar citas rectas con comillas rizadas

Me gustaría modificar la aplicación para implementar citas inteligentes como Word. Específicamente, " se sustituye con o y ' se sustituye con ' o ' tan apropiado como se escribe, y si el usuario presiona Ctrl + Z inmediatamente después de la sustitución, se vuelve a ser una cita recta.

¿alguien tiene el código que hace que?

Si no tiene código de DHTML/VB6, pero sí tienen el código JavaScript que funciona en un navegador con regi contentEditable complementos, podría utilizar eso, también

Respuesta

14

Aquí está la versión de Visual Basic 6:

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 solución inserta un nivel adicional en la cadena de deshacer. Por ejemplo, escribir "Esto es una prueba" da una cadena de "Esto es una prueba" -> "Esta es una prueba" ->"Esta es una prueba ->" -> "(nivel adicional en negrita). Para eliminar este nivel adicional, deberá implementar algún tipo de solución PostMessage+subclassing que no implique la cancelación de la pulsación de tecla nativa

editar: No se olvide de incluir el DHTML Editing Control redistributable si se dirige a Windows Vista.

+1

¡Guau! ¡Gracias! ¡Bien hecho! Trabajó la primera vez. Todavía lo ajustaré un poco para manejar algunos casos extraños, pero esto es fantástico. –

+4

Por cierto, me encanta la implementación de IsLetter() ... ¡una verdadera perla de programación! –

+1

Gracias por el elogio; nunca pensé que escucharía algo así de una leyenda de la programación :) Acerca de IsLetter: use IsCharAlphaW u otro método consciente de unicode. Mi implementación fue rápida y sucia para no restar importancia a mi respuesta :) – rpetrich

Cuestiones relacionadas