2008-09-14 14 views
9

के साथ सीधे उद्धरणों को प्रतिस्थापित करता है मेरे पास एक पुराना, विरासत वीबी 6 एप्लिकेशन है जो HTML संपादक के रूप में DHTML संपादन नियंत्रण का उपयोग करता है। माइक्रोसॉफ्ट डीएचटीएम संपादन नियंत्रण, ए.के.ए. डीएचटीएमएलडी, आईई की आंतरिक मूल क्षमता क्षमता का उपयोग कर आईई नियंत्रण से अधिक कुछ नहीं है।डीएचटीएमएलडी नियंत्रण बनाने के लिए कोड घुंघराले उद्धरण

मैं वर्ड जैसे स्मार्ट कोट्स को लागू करने के लिए ऐप को संशोधित करना चाहता हूं। , और उपयोगकर्ता तुरंत प्रतिस्थापन के बाद Ctrl + Z प्रेस अगर यह; विशेष रूप से, या "साथ बदल दिया है" " और या ' के रूप में उपयुक्त'साथ बदल दिया है 'के रूप में यह लिखा गया एक सीधे उद्धरण होने के लिए वापस चला जाता है।

है किसी को भी करता है कोड है?

आप DHTML/VB6 के लिए कोड नहीं है, तो है, लेकिन JavaScript कोड contenteditable regi के साथ एक ब्राउज़र में काम करता है ऑन, मैं इस्तेमाल कर सकते हैं कि, भी

उत्तर

14

यहाँ 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 

नोट: इस समाधान पूर्ववत श्रृंखला में एक अतिरिक्त स्तर सम्मिलित करता है। उदाहरण के लिए, "यह एक परीक्षण है" टाइप करना "यह एक परीक्षण है" -> "यह एक परीक्षण है" ->"यह एक परीक्षण ->" -> "(बोल्ड में अतिरिक्त स्तर) है। इस अतिरिक्त स्तर को हटाने के लिए आपको कुछ प्रकार के PostMessage+subclassing समाधान को कार्यान्वित करना होगा जिसमें मूल कुंजीपटल

संपादित करना शामिल नहीं है: यदि आप Windows Vista को लक्षित कर रहे हैं तो DHTML Editing Control redistributable को शामिल करना न भूलें।

+1

वाह! धन्यवाद! बहुत बढ़िया! पहली बार काम किया। मैं अभी भी कुछ अजीब मामलों को संभालने के लिए इसे एक छोटा सा ट्विक कर दूंगा, लेकिन यह बहुत ही भयानक है। –

+4

वैसे, मुझे IsLetter() के कार्यान्वयन से प्यार है ... एक असली प्रोग्रामिंग मोती! –

+1

प्रशंसा के लिए धन्यवाद; कभी सोचा नहीं कि मैं प्रोग्रामिंग किंवदंती से ऐसा कुछ सुनूंगा :) IsLetter के बारे में: IsCharAlphaW या किसी अन्य यूनिकोड-जागरूक विधि का उपयोग करें। मेरा कार्यान्वयन त्वरित और गंदा था ताकि मेरे जवाब के मांस से अलग न हो :) – rpetrich