我靠,RICH TEXTBOX的速度你知道么?我曾经用过他来作过语法高亮显示的功能,速度我实在是不敢恭维

解决方案 »

  1.   

    Eastunfail(东方不败):那又该如何?
      

  2.   

    ActiveBar 2.0 里面有一个 HTML 编辑器 Sample 有类似功能的代码,可以去看一下。
      

  3.   

     DevilXelloss(傑洛仕):请具体点,在哪?
      

  4.   

    RichTextBox 提供了一些属性,对于本控件文本的任何部分,用这些属性都可以指定格式。为了改变文本的格式,首先要选定它。只有选定的文本才能赋予字符和段落格式。使用这些属性,可把文本改为粗体或斜体,或改变其颜色,以及创建上标和下标。利用 TextBox 的 SelStart、SelLength 和 SelText 属性,可以控制 TextBox 的插入点和选择行为。这些属性仅能在运行时使用。当一个 TextBox 首次得到焦点时,TextBox 缺省的插入点和光标位置在文本的最左边。用户可以用键盘和鼠标移动它们。当 TextBox 失去焦点而后再得到时,插入点位置与用户最后设置的位置一样。在有些情况下,它可能与用户设置不一致。如:在字处理应用程序中,用户会希望新字符出现在已有文本后面;在数据项应用程序中,用户会希望他的输入替换原有条目。使用 SelStart 和 SelLength 属性,用户可以根据需要改变 TextBox 的行为。SelStart 属性是一个数字,指示文本串内的插入点,其中 0 表示最左边的位置。如果 SelStart 属性值大于或等于文本中的字符数,那么插入点将被放在最后一个字符之后
      

  5.   

    不要幻想用richtext了!不可能的!
      

  6.   

    问题:如何编程使文本框中文本的某一特定字符或字符串同时高亮显示?   答:由于普通TextBox控件不支持不连续字符串的同时高亮显示,所以我们选择RichTextBox控件。单击工程(Project)选单项,在弹出的下拉选单中单击组件(Components)选单项,从弹出的对话框中选择Microsoft Rich Textbox Control 5.0复选框,确定加载RichTextBox控件。   新建(New)一个工程,在窗体(Form)上添加一个RichTextBox控件和两个Command(按钮)控件,都采用系统默认的Name属性值;设置RichTextBox的Text属性值为空,Command1和Command2的Caption属性值分别设为“输入文本”和“选择字符串”。最后,添加如下VB代码:   Private Sub Command1—Click()    Dim str As String    Dim Text As String    str=″输入文本″    Text=InputBox(str)    RichTextBox1.Text=Text   End Sub   Private Sub Command2—Click()   Dim str As String   Dim Text As String   Dim Position As Integer   Dim Lenth As Integer   str=″输入要高亮显示的字符串″   Text=InputBox(str)   If Text 〈〉 ″″ Then    Position=InStr(RichTextBox1.Text, Text)-1    Lenth=Len(Text)    RichTextBox1.SelStart=Position    RichTextBox1.SelLength=Lenth    RichTextBox1.SelColor=RGB(255,0,0)    Do While InStr(Position+Lenth+1, RichTextBox1.Text, Text) 〈〉 0      Position=InStr(Position+Lenth+1, RichTextBox1.Text, Text)-1      RichTextBox1.SelStart=Position      RichTextBox1.SelLength=Lenth      RichTextBox1.SelColor=RGB(255,0,0)    Loop   End If   End Sub   按F5执行程序,单击“输入文本”按钮,在弹出的对话框中输入一些文本,确定后,刚刚输入的文本将显示在RichTextBox中;再单击“选择字符串”按钮,在弹出的对话框中输入你希望高亮显示的字符串,确定后,RichTextBox中相应的字符串将以红色高亮显示
      

  7.   

    Do While ?可怕的速度啊!
      

  8.   

    可是微软的VB、VC编辑环境怎么速度不会慢还有UltraEdit等软件,它们是用什么方法实现?
      

  9.   

    wilddragon(帅帅):那你在这里用一下啊!:)兄弟们,能提供语法敏感的控件或语法文本都行!
      

  10.   

    这是在网上找到的一段代码
    Option Explicit
    '------- Colorize Module ------'
    '                              '
    '      By: M. Schweighauser    '
    '       Date: 24.06. 2000      '
    '    E-Mail: [email protected]  '
    '                              '
    '------- Colorize Module ------''------ Code Information ------'
    '                              '
    'The First/LastVisible Code is '
    '    from a German-Newsgroup   '
    '                              '
    '------ Code Information ------''// Examples for the KeyWords-Variables (VB):
    '   |#Const|#Else|#ElseIf|#End|#If|Alias|Alias|And|As|Base|Binary|Boolean|Byte|ByVal|Call|Case|CBool|CByte|CCur|CDate|CDbl|CDec|CInt|CLng|Close|Compare|Const|CSng|CStr|Currency|CVar|CVErr|Decimal|Declare|DefBool|DefByte|DefCur|DefDate|DefDbl|DefDec|DefInt|DefLng|DefObj|DefSng|DefStr|DefVar|Dim|Do|Double|Each|Else|ElseIf|End|Enum|Eqv|Erase|Error|Exit|Explicit|False|For|Function|Get|Global|GoSub|GoTo|If|Imp|In|Input|Input|Integer|Is|LBound|Let|Lib|Like|Line|Lock|Long|Loop|LSet|Name|New|Next|Not|Object|On|Open|Option|Or|Output|Print|Private|Property|Public|Put|Random|Read|ReDim|Resume|Return|RSet|Seek|Select|Set|Single|Spc|Static|String|Stop|Sub|Tab|Then|Then|True|Type|UBound|Unlock|Variant|Wend|While|With|Xor|Nothing|To|'// Win API
    Public Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
    Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Function SendMessageByNum Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
    Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Public Declare Function GetTextMetrics Lib "gdi32" Alias "GetTextMetricsA" (ByVal hdc As Long, lpMetrics As TEXTMETRIC) As Long
    Public Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
    '// Win API Const
    Private Const EM_GETFIRSTVISIBLELINE = &HCE
    Private Const EM_LINEINDEX = &HBB
    Private Const EM_GETRECT = &HB2
    Private Const WM_GETFONT = &H31'// Variables
    Public KeyWords'//Variables for FirstVisible/LastVisibles
    Dim FirstVisibleLine As Long
    Dim LastVisibleLine As Long
    Private Type RECT
      Left As Long
      Top As Long
      Right As Long
      Bottom As Long
    End TypePrivate Type TEXTMETRIC
      tmHeight As Long
      tmAscent As Long
      tmDescent As Long
      tmInternalLeading As Long
      tmExternalLeading As Long
      tmAveCharWidth As Long
      tmMaxCharWidth As Long
      tmWeight As Long
      tmOverhang As Long
      tmDigitizedAspectX As Long
      tmDigitizedAspectY As Long
      tmFirstChar As Byte
      tmLastChar As Byte
      tmDefaultChar As Byte
      tmBreakChar As Byte
      tmItalic As Byte
      tmUnderlined As Byte
      tmStruckOut As Byte
      tmPitchAndFamily As Byte
      tmCharSet As Byte
    End Type
    Public Sub Colorize(RTFBox As RichTextBox, CommentColor, StringColor, KeysColor)    Dim lTextSelPos As Long, lTextSelLen As Long
        '// Save the cursor position
        lTextSelPos = RTFBox.SelStart
        lTextSelLen = RTFBox.SelLength
        
        '// Lock the WindowUpdate of the ReichTextBox
        LockWindowUpdate RTFBox.hWnd
        
        'On Error GoTo ErrHandler
        
        Dim i As Long
        Dim sBuffer As String, lBufferLen As Long
        Dim lSelPos As Long, lSelLen As Long
        Dim sTempBuffer As String
        Dim sSearchChar As String, lSearchCharLen As Long
        
        With RTFBox
        sBuffer = .Text & " "
        lBufferLen = Len(sBuffer)
        sTempBuffer = ""
        
        For i = FirstVisibleChar(RTFBox) To LastVisibleChar(RTFBox, lBufferLen)
        
          Select Case Asc(Mid(sBuffer, i, 1))
          
            Case 34 '// Stringtexts -> " ... "
              .SelStart = i - 1
              i = InStr(i + 1, sBuffer, """", 1)
              .SelLength = i - .SelStart
              .SelColor = StringColor
            
            Case 47, 39, 60 '// Comments              Examples:
              
              If Mid(sBuffer, i, 2) = "//" Then       '// C    Comment
                sSearchChar = vbCrLf
                lSearchCharLen = 0
              ElseIf Mid(sBuffer, i, 2) = "/*" Then   '// C++  Comment
                sSearchChar = "*/"
                lSearchCharLen = 2
              ElseIf Mid(sBuffer, i, 4) = "<!--" Then '// HTML Comment
                sSearchChar = "//-->"
                lSearchCharLen = 5
              ElseIf Mid(sBuffer, i, 1) = "'" Then    '// VB   Comment
                sSearchChar = vbCrLf
                lSearchCharLen = 0
              Else                                    '// No   Comment
                GoTo ExitComment
              End If
              
              '// Kill TempBuffer
              sTempBuffer = ""
              
              '// Colorize the comment string
              .SelStart = i - 1
              lSelLen = InStr(i, sBuffer, sSearchChar) + lSearchCharLen
              If lSelLen <> lSearchCharLen Then '// FileEnd ?
                lSelLen = lSelLen - i
              Else
                lSelLen = lBufferLen - i
              End If
              .SelLength = lSelLen
              .SelColor = CommentColor
              i = .SelStart + .SelLength
              
    ExitComment:
        
            Case 97 To 122, 65 To 90, 35
              '// a to  z ,  A to Z , #
              '// Only this char can be colorize
              If sTempBuffer = "" Then lSelPos = i
              sTempBuffer = sTempBuffer & Mid(sBuffer, i, 1)
              
            Case Else
              If Trim(sTempBuffer) <> "" Then
                .SelStart = lSelPos - 1
                .SelLength = Len(sTempBuffer)
                If InStr(1, KeyWords, "|" & sTempBuffer & "|", 1) <> 0 Then
                 .SelColor = KeysColor
                End If
              End If
            
              sTempBuffer = ""
            End Select
          Next
        End With
        
    ErrHandler:
        
        '// Set the Cursor to the old position
        RTFBox.SelStart = lTextSelPos
        RTFBox.SelLength = lTextSelLen
        
        '// Unlock the WindoUpdate-Lock
        LockWindowUpdate 0
        
        End Sub
        
        Private Function FirstVisibleChar(RTFBox As RichTextBox) As Long
        FirstVisibleLine = SendMessage(RTFBox.hWnd, EM_GETFIRSTVISIBLELINE, 0, 0&)
        FirstVisibleChar = SendMessageByNum(RTFBox.hWnd, EM_LINEINDEX, FirstVisibleLine, 0&)
        If FirstVisibleChar = 0 Then FirstVisibleChar = 1
    End Function
    Private Function LastVisibleChar(RTFBox As RichTextBox, LenFile As Long) As Long
        Dim rc As RECT
        Dim tm As TEXTMETRIC
        Dim hdc As Long
        Dim lFont As Long
        Dim OldFont As Long
        Dim di As Long
        Dim lc As Long
        Dim VisibleLines As Long
        
        lc = SendMessage(RTFBox.hWnd, EM_GETRECT, 0, rc)
        lFont = SendMessage(RTFBox.hWnd, WM_GETFONT, 0, 0)
        hdc = GetDC(RTFBox.hWnd)
        If lFont <> 0 Then OldFont = SelectObject(hdc, lFont)
        di = GetTextMetrics(hdc, tm)
        If lFont <> 0 Then lFont = SelectObject(hdc, OldFont)
        VisibleLines = (rc.Bottom - rc.Top) / tm.tmHeight
        di = ReleaseDC(RTFBox.hWnd, hdc)
        
        LastVisibleLine = SendMessage(RTFBox.hWnd, EM_GETFIRSTVISIBLELINE, 0, 0&)
        LastVisibleLine = LastVisibleLine + VisibleLines
        
        LastVisibleChar = SendMessageByNum(RTFBox.hWnd, EM_LINEINDEX, LastVisibleLine, 0&)
        If LastVisibleChar = -1 Or LastVisibleChar = 0 Then LastVisibleChar = LenFile
      
    End Function这样调用:
    Private Sub Text1_KeyPress(KeyAscii As Integer)
     '// Only Colorize-Keywords, when the user press the ReturnKey
     '// --> So whe save time
     If KeyAscii = vbKeyReturn Then Colorize frmMain.Text1, vbGreen, vbRed, vbBlue
     Text1.SelColor = vbBlack
    End Sub
    其中的Text1其实是一个RichTextBox
      

  11.   

    ozw(沧浪客) :能否指出代码下载地址,让我来个彻底的COPY!没时间了
      

  12.   

    用RICHEDIT搞语法加亮做个玩具是可以的,要真做事不敢想象。
    VC、VB、ULTRAEDIT、PLUSEDIT等的编辑控件是自己特制的并非RICHEDIT(不信把RICHED.dll、riched32.dll、riched20.dll删掉看看他们能否工作)。
    在www.winmain.com下有个CODEMAX可用。
      

  13.   

    我下载了,可是只能注册cmax20.ocx而类cmax20.dll不能注册
      

  14.   

    我给你的代码几乎已经全了
    KeyWords="&brvbar;#Const&brvbar;#Else&brvbar;#ElseIf&brvbar;#End&brvbar;#If&brvbar;Alias&brvbar;Alias&brvbar;And&brvbar;As&brvbar;Base&brvbar;Binary&brvbar;Boolean&brvbar;Byte&brvbar;ByVal&brvbar;Call&brvbar;Case&brvbar;CBool&brvbar;CByte&brvbar;CCur&brvbar;CDate&brvbar;CDbl&brvbar;CDec&brvbar;CInt&brvbar;CLng&brvbar;Close&brvbar;Compare&brvbar;Const&brvbar;CSng&brvbar;CStr&brvbar;Currency&brvbar;CVar&brvbar;CVErr&brvbar;Decimal&brvbar;Declare&brvbar;DefBool&brvbar;DefByte&brvbar;DefCur&brvbar;DefDate&brvbar;DefDbl&brvbar;DefDec&brvbar;DefInt&brvbar;DefLng&brvbar;DefObj&brvbar;DefSng&brvbar;DefStr&brvbar;DefVar&brvbar;Dim&brvbar;Do&brvbar;Double&brvbar;Each&brvbar;Else&brvbar;ElseIf&brvbar;End&brvbar;Enum&brvbar;Eqv&brvbar;Erase&brvbar;Error&brvbar;Exit&brvbar;Explicit&brvbar;False&brvbar;For&brvbar;Function&brvbar;Get&brvbar;Global&brvbar;GoSub&brvbar;GoTo&brvbar;If&brvbar;Imp&brvbar;In&brvbar;Input&brvbar;Input&brvbar;Integer&brvbar;Is&brvbar;LBound&brvbar;Let&brvbar;Lib&brvbar;Like&brvbar;Line&brvbar;Lock&brvbar;Long&brvbar;Loop&brvbar;LSet&brvbar;Name&brvbar;New&brvbar;Next&brvbar;Not&brvbar;Object&brvbar;On&brvbar;Open&brvbar;Option&brvbar;Or&brvbar;Output&brvbar;Print&brvbar;Private&brvbar;Property&brvbar;Public&brvbar;Put&brvbar;Random&brvbar;Read&brvbar;ReDim&brvbar;Resume&brvbar;Return&brvbar;RSet&brvbar;Seek&brvbar;Select&brvbar;Set&brvbar;Single&brvbar;Spc&brvbar;Static&brvbar;String&brvbar;Stop&brvbar;Sub&brvbar;Tab&brvbar;Then&brvbar;Then&brvbar;True&brvbar;Type&brvbar;UBound&brvbar;Unlock&brvbar;Variant&brvbar;Wend&brvbar;While&brvbar;With&brvbar;Xor&brvbar;Nothing&brvbar;To&brvbar;"Colorize frmMain.RichText1, vbGreen, vbRed, vbBlue马上就能看到效果
      

  15.   

    |怎么全变成&brvbar;了,应该是
    |#Const|#Else|#ElseIf|#End|#If|Alias|Alias|And|As|Base|Binary|Boolean|Byte|ByVal|Call|Case|CBool|CByte|CCur|CDate|CDbl|CDec|CInt|CLng|Close|Compare|Const|CSng|CStr|Currency|CVar|CVErr|Decimal|Declare|DefBool|DefByte|DefCur|DefDate|DefDbl|DefDec|DefInt|DefLng|DefObj|DefSng|DefStr|DefVar|Dim|Do|Double|Each|Else|ElseIf|End|Enum|Eqv|Erase|Error|Exit|Explicit|False|For|Function|Get|Global|GoSub|GoTo|If|Imp|In|Input|Input|Integer|Is|LBound|Let|Lib|Like|Line|Lock|Long|Loop|LSet|Name|New|Next|Not|Object|On|Open|Option|Or|Output|Print|Private|Property|Public|Put|Random|Read|ReDim|Resume|Return|RSet|Seek|Select|Set|Single|Spc|Static|String|Stop|Sub|Tab|Then|Then|True|Type|UBound|Unlock|Variant|Wend|While|With|Xor|Nothing|To|
      

  16.   

    DELPHI好象有这样的代码,一个叫极地苍狼的软件公布了源代码。http://www.chinaasp.com/download/
      

  17.   

    "类cmax20.dll不能注册 "
    不可能吧,我在C++里用的好好的。
      

  18.   

    我用Regsvr32.ext进行注册,说找不到入口
      

  19.   

    Delphi有一个这样的控件,巨牛,功能超强和Delphi自带的编辑器一样,速度飞快。叫mwEdit,在程序员大本营里搜索一下可以找到,要解决刷新速度的问题,主要是要只刷新需要刷新的区域,有辕马,要是能把人家的辕马都学会,真是胜读十年书啊
      

  20.   

    to progame(呵呵呵(傻笑中):cmax20.dll不用什么注册的,你看看maxcode自带的例子(C++和VB都有,我只看C++的)
      

  21.   


    自带的例子在装载时就出错了:class not registered.Looking for object with CLSID:{..............................
      

  22.   

    VB我没看,C++的没问题,看来你得改学VC了...
    看你的出错信息,在VB的例子里应该是用OCX而非DLL的,那得注册。
      

  23.   

    我提供的程序没试通吗?简单一点吧
    把Colorize过程有关的代码放在一个bas中
    在你的窗口当中放一个Richtext控件RichText1
    输入Hello World
    然后
    KeyWords="&brvbar;Hello&brvbar;"
    Colorize RichText1, vbGreen, vbRed, vbBlue
    看看Hello是不是变色了(蓝色)?
    这个Colorrize过程还是相当不错的,颜色的顺序依次是注释,字符串,关键字
      

  24.   

    KeyWords=" &brvbar;Hello&brvbar; "
      

  25.   

    TO progame(呵呵呵(傻笑中):我想试一试,可惜我没有VB :(
      

  26.   

    ozw(沧浪客):谢谢,试通了,可是我想要的是编辑时即时高亮显示,就像SQL SERVER的查询分析器一样,我到网上找了几个VB的相关代码,速度慢得惊人CMAX是VC的,MWEDIT是DELPHI的,VB真是没前途了吗:(
      

  27.   

    progame(呵呵呵(傻笑中):你自己编一个不就有了?
      

  28.   

    我写了一个,当有1000行时在VB环境下进行高亮显示的时间要
    18S,比网上的相关例子快两S左右
    怎么也难以提速了
    我想可能的话就只有两个方法了
    一种是多重链表存放关键词(现在关键词为257个)
    可惜这个VB是没法做的,我现在用的是两维数组
    再一个就是对RichEdit的取词以用高亮提速了
    但现在已经存在字符串中进行查找了不知Delphi和VC是如何做的:(