欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

第三方控件 SynEdit

最编程 2024-04-23 09:06:01
...
然后直接运行程序。输入比如下图的代码。如果SynCppSyn1没有设置颜色的话是这个效果:

 

 


保留字是加粗的,注释是倾斜的(Delphi编辑器的风格)。
--显示多个高亮
这种情况在HTML居多,因为一部分人在写HTML代码的时候把CSS层叠样式也写在HTML文件里面。如果直接用一个SynHTMLSyn,CSS层叠样式部分是不能显示出高亮的,所以这里就需要SynMultiSyn了。
SynMultiSyn的用法和其他的高亮一样,在SynEdit或者SynMemo设置Highlighter属性之外,还需要至少两个不同的高亮,比如HTML和CSS(分别是SynHTMLSyn和SynCssSyn)。
先添加SynEdit或者SynMemo,然后依次添加SynMultiSyn,SynHTMLSyn和SynCssSyn(注意和SynCsSyn区分,SynCsSyn是C#的高亮);再将SynEdit或SynMemo的Highlighter设置为SynMultiSyn1。
回到SynMultiSyn1,将DefaultHighlighter设置为SynHTMLSyn1,然后找到Schemes属性然后单击“...”,再单击“Add”。其中:
CaseSensitive:区分大小写
Highlighter:在StartExpr和EndExpr中间显示的高亮
EndExpr:作为Highlighter指定的高亮的结束部分
MarkerAttri:标记部分颜色,字体设置
SchemeName:用于区分
StartExpr:作为Highlighter指定的高亮的开始部分
把Highlighter设置为SynCssSyn1,然后设置StartExpr为“”,然后直接运行程序,编写HTML代码,效果如下:

 

 


颜色默认设置。
如果想多个高亮也可以,一个SynMultiSyn就搞定,还是在Schemes添加,修改。
--自动换行
SynEdit和SynMemo默认是遇到#13 + #10的时候才会换行,如果打开一个文件只有一行,比如用MsXml生成的xml文件,在SynEdit或者SynMemo只显示一行!!而且内容很多的时候看不到后面的内容。如果文件更大,程序可能会没有响应。
在设计界面中把WordWrap改为True即可。如果不想显示换行标记的话,把WordWrapGlyph的Visible改为False。

 

 


自动换行不影响CaretX和CaretY的值。
重要:自动换行的效率不高,打开内容较多(70KB以上)的文本文件就需要等很长时间。
此外,WordWrap和WordWrapGlyph.Visible可以通过代码实现。
--Bookmark的添加,跳转和清除
Bookmark的添加,跳转已经在KeyStrokes设置好,所以就不用我们自己写代码了。就算是用代码创建的SynEdit或者SynMemo也是如此。设置/取消设置的快捷键是Ctrl+Shift+数字,跳转是Ctrl+数字。也可以在Keystrokes自定义快捷键。

 

 



当然也可以用代码实现,主要用到以下方法:
跳转到Bookmark:procedure TCustomSynEdit.GotoBookMark(BookMark: Integer);
清除Bookmark:procedure TCustomSynEdit.ClearBookMark(BookMark: Integer);
设置Bookmark:procedure TCustomSynEdit.SetBookMark(BookMark: Integer; X: Integer; Y: Integer);
这三个过程的BookMark都是输入0到9的值,但实际通过Keystrokes设置还是代码设置Bookmark 0都不起作用。其实在过程内部就判断输入的数是否在0..9之间,所以就不用我们if了。对于SetBookMark,第二个参数X的值和第一个一致,第三个参数Y是行号,使用CaretY就可以了。
不过,这通常和菜单一起使用,为了方便我自己写了3个过程:
procedure TForm8.GoToBMark(BMark: Integer);
begin
 SynMemo1.GotoBookMark(BMark);
end;
 
procedure TForm8.ToggleBMark(BMark: Integer);
begin
  with SynMemo1 do
   SetBookMark(BMark, BMark, CaretY);
end;
 
procedure TForm8.L3Click(Sender: TObject); //直接写在菜单里的
begin
  with SynMemo1 do begin
   ClearBookMark(1);
   ClearBookMark(2);
   ClearBookMark(3);
   ClearBookMark(4);
   ClearBookMark(5);
   ClearBookMark(6);
   ClearBookMark(7);
   ClearBookMark(8);
   ClearBookMark(9);
 end;
end;
除了清除之外,剩下的就直接调用过程即可。
--列出成员
实现这个操作,就需要另一个控件了——SynCompletionProposal。之前我已经写了关于SynCompletionProposal的日志,可以在第三方控件系列找到。
链接:http://blog.163.com/zom1995@126/blog/static/168096132201411755617589/
在原来的基础上(HTML+CSS)添加一个SynCompletionProposal,更名为ScpHTML。然后在Columns添加一个Column,接下来设置Editor属性,设置之前的SynEdit或者SynMemo。
TriggerChars改成“<”。
EndOfTokenChr改成“<> ”。
Options属性里面的scoUseInsertList, scoUsePrettyText, scoBuiltInTimer设置为True,其他的不改。
TimerInterval改为100或更少。
InsertList和ItemList分别输入填充和提示文字,然后运行程序,输入HTML代码试试。
--Keystrokes的使用
其实在添加SynEdit或者SynMemo之后就已经设置好Keystrokes了,可以在运行时直接使用。动态创建的SynEdit或者SynMemo也可以直接使用。
一般情况下这里是不用修改的。修改很简单,在SynEdit或者SynMemo中找到Keystrokes,然后单击"...",如图:

 

 


选择要修改的一项,单击“Edit”,后面有两个Keystroke,意思是可以使用两个快捷键。

 

 




Ctrl和Alt是不可以单独使用的,上图是因为截图的时候按了Alt+PrintScreen...所以是这个结果
单击文本框然后,按组合键之后单击OK完成设置。
===================================================================================================
其实,只有上面的一些是远远不够的,要实现一些高级的功能,就需要代码实现了。
下面就是通过代码实现的几个实用功能:
打开与保存
打开和保存文件的方法和Memo是一样的,使用Lines.LoadFromFile和Lines.SaveToFile就可以。只不过在Delphi 2009以后的版本保存文件的默认编码为Unicode。使用Lines.LoadFromFile可以打开ANSI和Unicode编码的文本文件,但打开UTF-8编码的文本文件会乱码。如果想支持多种编码的文本文件,自己去写一个过程吧。
在不同的SynHighlighter和SynCompletionProposal之间切换
设置SynEdit或者SynMemo的Highlighter属性即可,另外,SynMultiSyn的用法和SynXXXSyn是一样的。如果不使用任何一个:
属性窗口:Highlighter留空;
编辑代码:使用nil。
示例:
SynMemo1.Highlighter := SynCppSyn1; //使用C++的高亮
SynMemo1.Highlighter := nil; //不使用任何高亮
SynCompletionProposal和SynHighlighter的用法不同,SynCompletionProposal需要修改其Editor属性,如果不需要的情况下,修改Editor属性为nil即可。
示例:
SynCompletionProposal1.Editor := SynMemo1; //使用这个SynCompletionProposal在SynMemo1上
SynCompletionProposal1.Editor := nil; //不使用这个SynCompletionProposal在任何SynEdit或者SynMemo中
光标位置
在编写“记事本”的时候,最头痛的也就是光标位置了。但现在,有了SynEdit之后,就不用担心这个问题了。SynEdit或SynMemo有两个变量:CaretX和CaretY。在OnStatusChange把这两个变量的值显示出来,就知道光标的位置了。在窗体添加一个StatusBar,然后添加至少一个面板(Panel),最后在OnStatusChange中编写代码,搞定。
procedure TForm1.SynMemo1StatusChange(Sender: TObject;
  Changes: TSynStatusChanges);
begin
 StatusBar1.Panels[1].Text := IntToStr(SynMemo1.CaretX) + ': ' + IntToStr(SynMemo1.CaretY);
end;
输入
SynEdit或SynMemo的ReadOnly属性和Memo相同,当ReadOnly为True的时候,是不可以编辑文字的,也不能通过拖拽更改内容,而且不能剪切和粘贴而VB在只读(Locked)状态下仍然可以剪切和粘贴。
用法:SynMemo1.ReadOnly := True;
SynEdit和SynMemo没有右键菜单,用起来没有Memo方便,所以我们就得自己使用一个PopupMenu了。
Modified属性也很重要,当内容修改的时候Modified自动变为True,也可以手动修改Modified属性为False。