C++Builder 中synedit显示python高亮时部分关键字无法显示问题

synedit是一个优秀的代码显示控件,自带高亮等普通IDE相关功能,具体自己百度。

一、发现问题:

最近想做一个python显示小工具,synedit+SynPythonSyn在使用高亮时,部分关键字总是不行,而有些又可以,好奇怪啊。(这里注意,我安装的synedit,是玩Unigui控件里带的,反正应该也一样)

二、分析问题

于是就打开uSynHighlighterPython.pas,分析,发现关键字都在里面,并且都创建时都添加到关键字里面了。

  // List of keywords
  KEYWORDCOUNT = 29;
  KEYWORDS: array [1..KEYWORDCOUNT] of UnicodeString =
    (
    'and',
    'assert',
    'break',
    'class',
    'continue',
    'def',
    'del',
    'elif',
    'else',
    'except',
    'exec',
    'finally',
    'for',
    'from',
    'global',
    'if',
    'import',
    'in',
    'is',
    'lambda',
    'not',
    'or',
    'pass',
    'print',
    'raise',
    'return',
    'try',
    'while',
    'yield'
    );

    for f := 1 to KEYWORDCOUNT do
      GlobalKeywords.AddObject(KEYWORDS[f], Pointer(Ord(tkKey)));

并在控件创建时已经加载,也没少

于是,检查匹配代码

  SetString(s, fToIdent, fStringLen);
  if FKeywords.Find(s, i) then

//下断点,追进去,可能是控件内,C++Builder在显示控件内变量时不是很准确,不过代码还是能看到。

function TStringList.Find(const S: string; var Index: Integer): Boolean;
var
  L, H, I, C: Integer;
begin
  Result := False;
  L := 0;
  H := FCount - 1;
  while L <= H do
  begin
    I := (L + H) shr 1;
    C := CompareStrings(FList[I].FString, S);
    if C < 0 then L := I + 1 else
    begin
      H := I - 1;
      if C = 0 then
      begin
        Result := True;
        if Duplicates <> dupAccept then L := I;
      end;
    end;
  end;
  Index := L;
end;

分析这个函数,这个函数不是一条条查询,而是二分查找法,但这种查找法需要一个前提条件,就是被查找列表必须是一个有序列表,前面都没有排序啊

看来时漏了一个排序函数Sort()

三、验证问题

怎么验证呢?想办法把列表内容显示出,看看有无相关接口。

打开 uSynEditHighlighter.hpp,

protected:

__property System::Classes::TStringList* Keywords = {read=FKeywords};

看看,能否在C++Builder里

TStringLIst *slt=USynPythonSyn1->Keywords;

提示,protected模式不行,于是就剪切到public下,结果编译通过了,运行显示所有关键字都在,不过顺序时输入顺序(没排序)

四、解决问题

如果不怕麻烦,在源文件里增加一个排序函数

GlobalKeywords.Sort();

可能本人比较懒,不想重新编译安装,既然关键字列表可以引出来,那是否可以在程序初始化时,给他排下顺序,于是说干就干,结果通过了。

USynPythonSyn1->Keywords->Sort();

五、解决小结

uSynEditHighlighter.hpp里将Keywords属性放在public里

__property System::Classes::TStringList* Keywords = {read=FKeywords};

然后在自己程序的初始化里增加一个排序语句

USynPythonSyn1->Keywords->Sort();

========== SynEdit Studio Readme==========谢谢使用SynEdit Studio;此控件包基于基于SynEdit加强,增加了一些第三方的SynEdit控件和自己写的控件;原SynEdit控件包开发者:Pieter Zijlstra;增强修改包作者:姚乔锋 yaoqiaofeng@sohu.com最近的版本请关注www.delphibox.com和www.delphifans.com;========== SynEdit Studio History==========修改版本 2005.05.20 01.TSynAutoCorrect,改正控件原先不支持中文输入的特点; 02.TSynEdit,增加一个属性ActiveLine,类属性,具体参考TSynActiveLine; 03.TSynEdit,增加一个属性LineDivider,类属性,具体参考TSynLineDivider; 04.TSynEdit,增加一个属性WordWrap,类属性,具体参考TSynWordWrap; 05.TSynEdit,增加一个属性RightEdge,类属性,具体参考TSynRightEdge; 06.TSynEdit,修改高亮当前行的方式,在自动换行的情况也只高亮一行; 07.TSynEdit,当行间距大于零,原本文本会显示于靠上,现修改于垂直中间对齐; 08.TSynEdit,增加一个属性LineSpacing,可指定行间距; 09.TSynEdit,增加一个属性LineSpacingRule,可指定行间距类型; 10.TSynEdit,修正当控件是在一个子窗口上,若是焦点转回到主窗口中某个控件后再转回来会不能显示光标的BUG; 11.TSynEdit,修正当第一列显示的字符是双字节字符的第二个字节,在高亮当前行情况下会把第一个字节显示在行号区上的BUG; 12.TSynEdit,修正了DoCaseChange,加快转换字母大小写的处理速度和精简代码,也避免出现一些双字节字符的丢失; 13.TSynEdit,修正画右边线的代码,避免有右边线颜色显示出错; 14.TSynEdit,修正了改变属性TEXT后不能UNDO的特性; 15.TSynEditSource,新添加的自己写的控件,用于存储Synedit的属性,详细请查看单元SynEditSource; 16.TSynEditSearcher,新添加的自己写的类,用于简化Synedit搜索,详细请查看单元SynEditSearcher; 17.TSynUniSyn,新添加的修改过的第三方控件,一个通用的Highlighter,详细请查看单元SynUniHighlighter; 18.TSynSpellCheck,新添加的第三方控件,一个拼写检查控件,详细请查看单元SynSpellCheck; 19.TSynEditor,新增加的TSynEdit的继承控件,增加对编辑文档管理的支持和一些增强型功能 20.SynMsgDialog,一个消息框单元,参照Dialogs中MessageDlg的代码进行改进并重写; 21.SynEditStrRes,一个字符串常量声明单元,存储增加的自定义的控件中用到的字符串;未来期待 下一版本中我将会加入一系列的Action,以方便大家编写程序. 若大家还想增加什么功能的话,请给我写信,当然不要用英文写了,英文我不是很好.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值