语法突出显示示例?

时间:2010-09-04 00:06:44

标签: delphi delphi-7

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

欢呼声;

4 个答案:

答案 0 :(得分:14)

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

1.在SynEdit pallete

中输入表单中的TSynEdit组件

2.从SynEdit Highligthers pallete选择Highligther

3.设置TSynEdit组件的Highlighter属性。

alt text

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

答案 1 :(得分:10)

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

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

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

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

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

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

答案 2 :(得分:1)

您可以查看Gexperts源代码。基于Martin Waldenburg的Pascal Parser IIRC,有“Source Export” 但我不确定它是“简单”。

答案 3 :(得分:0)

我正在使用LMD SyntaxEdit,它非常好。它附带了示例和文档。语法高亮从不简单,但使用此组件几个小时后,您应该正常运行。