语法突出显示示例?

kil*_*ode 3 delphi delphi-7

是否有任何简单的代码示例或如何使richedit控件做如何做语法 - 突出显示?我尝试过SynEdit,但它对我来说非常复杂,我想知道是否有一个小代码片段可供我使用?或者只是想知道如何像IDE那样快速地完成它?

干杯;

RRU*_*RUZ 14

我认为使用SynEdit组件工作比基于TRichEdit构建自己的语法高亮显示器要容易得多.

1.从SynEdit托盘中输入表单中的TSynEdit组件

2.从SynEdit Highligthers托盘中选择Highligther

3.将Highlighter属性设置为TSynEdit组件.

替代文字

无论如何,如果你坚持使用RichEdit,请尝试这些链接.


mgh*_*hie 11

SynEdit(或者更确切地说是它的前身mwEdit)项目的启动正是因为标准的富编辑控件非常不适合语法高亮.

丰富的编辑控件的工作原理是将包含的文本存储在块中,并使用每个文本块的格式信息.现在想象一下语法高亮显示Pascal的控件,它建立在它之上.插入一个{作为文本的第一个字符将需要扫描整个文本,直到第一个}不在字符串中,并循环遍历所有块,直到包含}该文本的块,将文本的格式更改为多行注释的格式,然后重新突出显示文本的其余部分.删除插入的字符或撤消编辑同样需要重新突出显示整个文本.现在,在九十年代后期的机器上以快速无闪烁的方式进行快速打字几秒钟.

因此,所有快速语法突出显示编辑控件都实现为自定义编辑控件,而不是Windows标准控件的后代.他们为自己实现所有文本存储,文本绘制和编辑.通常使用许多预定义的文本属性(用于关键字,注释,符号,数字等),并且对于每个可见字符,确定要使用的文本属性,然后对于绘图文本,设置字体和颜色属性,并且绘制具有相同属性的字符.

基本上有两种方法可以做到这一点,第一种方法是计算突出显示信息一次并存储文本中每个字符的信息(例如Scintilla文本控件的工作方式),另一种方法是每次需要时重新扫描文本要画(这就是SynEdit的工作原理).SynEdit通过存储每条线的初始状态来优化它,因此为了绘制线1000到1010,它不需要从第一行重新扫描,它使用线1000的保存状态初始化当前语法高亮显示并从那里扫描.

存储有关每个角色的信息需要更多空间,但有几个好处.即使无法仅从文本中确定突出显示信息,也可以突出显示第一个文本,例如带有时间戳的日志消息; 第二,每个字符数据可用于存储附加信息,例如用于文本折叠,或用于存储或改变字符的信息.

我认为今天从头开始实现语法高亮控制,任意文本大小,完整的Unicode支持,完全撤消/重做,多视图,代码折叠等作为一个人的努力是不现实的.或者也许它可以完成,但是这个人需要熟悉现有突出显示控件的内部,如果只是为了不犯错误或在创建它们时做出的次优决策.