关于语法高亮,有什么快速的办法?

fxy_2002 2005-11-24 12:24:08
用 RichTextBox 做 vb 语法高亮处理,只处理关键字与注释行,不做语法检查。已写出代码可以处理,但速度不理想。

哪位大虾有好的做法或优化建议?

这是我的代码:

Private Const vbKeyWords As String = "And,Call,Case,Const,Dim,Do,Each,Else,ElseIf,Empty,End,Eqv,Erase,Error,Exit,Explicit,False,For,Function,Imp," _
& "In,Is,Loop,Mod,Next,Not,Nothing,Null,On,Option,Or,Private,Property,Public,Randomize,ReDim,Resume,Select,Set,Step," _
& "Sub,Then,To,True,Until,Wend,While,With,Xor,Anchor,Array,Asc,Atn,CBool,CByte,CCur,CDate,CDbl,Chr,CInt," _
& "CLng,Cos,CreateObject,CSng,CStr,DateAdd,DateDiff,DatePart,DateSerial,DateValue,Day,Dictionary,Document,Element,Err,Exp,FileSystemObject,Filter,Fix,Form," _
& "FormatCurrency,FormatDateTime,FormatNumber,FormatPercent,GetObject,Hex,History,Hour,IIf,InputBox,InStr,InstrRev,IsArray,IsDate,IsEmpty,IsNull,IsNumeric,IsObject,Join,LBound," _
& "LCase,Left,Len,Link,LoadPicture,Location,Log,LTrim,RTrim,Mid,Minute,Month,MonthName,MsgBox,Navigator,Now,Oct,Replace,Right,Rnd," _
& "Round,ScriptEngine,ScriptEngineBuildVersion,ScriptEngineMajorVersion,ScriptEngineMinorVersion,Second,Sgn,Sin,Space,Split," _
& "Sqr,StrComp,String,StrReverse,Tan,TextStream,TimeSerial,TimeValue,TypeName,UBound,UCase,VarType,Weekday,WeekDayName,Window,Year,Let,New,Static,Module," _
& "Variant,IsError,IsMissing,Me,Deftype,Like,Clear,Raise,CVErr,Collection,Remove,Item,DDB,SLN,SYD,FV,Rate,IRR,MIRR,NPer," _
& "IPmt,PPmt,NPV,GoSub,GoTo,Return,DoEvents,Stop,Choose,Switch,Get,ChDir,ChDrive,FileCopy,MkDir,RmDir,CurDir,FileDateTime,GetAttr,FileLen," _
& "SetAttr,Timer,Open,Close,Reset,Format,Print,PrintSpc,Tab,Width,EOF,FileAttr,FreeFile,Loc,LOF,Seek,Kill,Lock,Unlock,Input," _
& "InputLine,PrintPut,Write,CDec,CVar,Boolean,Double,Integer,Long,Single,Abs,Base,AppActivate,Shell,SendKeys,Beep,Environ,Command,MacID,MacScript," _
& "QBColor,RGB,DeleteSetting,GetSetting,GetAllSettings,SaveSetting,Val,StrConv,LSet,RSet,Compare,Enum,Declare,Alias,Lib,AddressOf,VarPtr,Any,Load,LoadResData," _
& "LoadResPicture,LoadResString,Access,Append,Binary,Output,Random,Read,Shared,As,If,ByRef,ByVal,Optional,Enum,Type"
...全文
302 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxy_2002 2005-11-28
  • 打赏
  • 举报
回复
结了!
hpygzhx520 2005-11-25
  • 打赏
  • 举报
回复
同意Chengs_bbs(盛实) 的观点,只高亮显示的部分。以前见过讨论,秘密就在这里。
fxy_2002 2005-11-25
  • 打赏
  • 举报
回复
to: cuizm(射天狼)

谢谢。我不是做专业编辑器,而是改个开源的vb代码收集软件,想对语法进行一下加亮,它原本没有此功能。
fxy_2002 2005-11-25
  • 打赏
  • 举报
回复
将枕善居下载的代码进行了修改,
抛掉语法文件和生成临时文件,
增加了许多VB关键字,
效果还不错,速度可以接受。

代码较长,就不贴在这里了。
想要的朋友可发短消息给我,下周一结贴。
fxy_2002 2005-11-24
  • 打赏
  • 举报
回复
'(接上)

Private Const KeyWordColor As Long = &H800000 '关键字颜色
Private Const NotesColor As Long = &H8000& '注释颜色

Sub vbCodeSTX(ByRef RTF1 As RichTextBox)

Dim vks() As String
Dim i As Long, l As Long
Dim mloc As Long, mloc2 As Long
Dim oloc As Long, olen As Long

l = LenB(RTF1.Text)
If l = 0 Then Exit Sub

oloc = RTF1.SelStart
olen = RTF1.SelLength
RTF1.Visible = False

'处理vb关键字
vks = Split(vbKeyWords, ",")
For i = 0 To UBound(vks)
mloc = RTF1.Find(vks(i), 0, , rtfWholeWord)
Do While mloc >= 0
With RTF1
.SelStart = mloc
.SelLength = Len(vks(i))
.SelColor = KeyWordColor
.SelStart = mloc + Len(vks(i)) + 1
End With
mloc = RTF1.Find(vks(i), , l, rtfWholeWord)
Loop
Next

'处理注释
mloc = RTF1.Find("'", 0)
Do While mloc >= 0
RTF1.SelStart = mloc + 1
mloc2 = RTF1.Find(vbCrLf, , l)
If mloc2 > mloc Then
With RTF1
.SelStart = mloc
.SelLength = mloc2 - mloc
If InStr(RTF1.SelText, Chr(34)) = 0 Then
.SelColor = NotesColor '是注释行
End If
.SelStart = mloc2 + 1
End With
End If
mloc = RTF1.Find("'", , l)
Loop

RTF1.SelStart = oloc
RTF1.SelLength = olen
RTF1.Visible = True

End Sub

(用法):
在窗体上放一个 RichTextBox1,然后调用:
vbCodeSTX RichTextBox1
射天狼 2005-11-24
  • 打赏
  • 举报
回复
如果学习一下倒是可以用VB做,如果是做专业的编辑器的话,VB不适合于做这个!

我的网站上有VC写的“语法着色程序”;

http://www.j2soft.cn/

VC资料->查询“语法着色程序”;

=================
学习技巧与源码下载站:
http://www.j2soft.cn/
http://j2soft.008.net/
fxy_2002 2005-11-24
  • 打赏
  • 举报
回复
枕善居下载的代码速度不错,不过要用到临时RTF文件。原理是先生成 RTF 格式的文件,再用 RichTextBox.loadfile()
Chengs_bbs 2005-11-24
  • 打赏
  • 举报
回复
不容易是不容易,但可以获得。你可以网上找一下。
fxy_2002 2005-11-24
  • 打赏
  • 举报
回复
是个办法。
但获取和控制在显示区域中的内容好象也不容易。
Chengs_bbs 2005-11-24
  • 打赏
  • 举报
回复
用只加亮显示部分的文本.
fxy_2002 2005-11-24
  • 打赏
  • 举报
回复
to: Chengs_bbs(盛实)

是的,速度不理想。一个10K的.bas模块,在 p3 600 上要处理 6 秒钟,不能接受。

你有什么好建议?
Chengs_bbs 2005-11-24
  • 打赏
  • 举报
回复
你这种方法是不行的,特别是速度.
Chengs_bbs 2005-11-24
  • 打赏
  • 举报
回复
本人也正在做这个东西?
fxy_2002 2005-11-24
  • 打赏
  • 举报
回复
:(

7,787

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧