Board logo

Subject: 给Cnpack的过程列表和工程组单元列表增加正则表达式功能 [Print This Page]

Author: 吕不为    Time: 2009-8-22 17:44     Subject: 给Cnpack的过程列表和工程组单元列表增加正则表达式功能

在使用Cnpack的过程中。由于我们的一个项目的单元很多,为了快速打开一个窗体或者单元。我们经常需要按Ctrl+F12打开工程组单元列表。但是。很多时间我们只记的部分的单元名称。如
多行属性编辑器。我可能不知道他具体叫什么名子。但我想,它一定包括mul(多行)和edit(编辑).于是。我希望我只输入支言片语,就能找到这个单元。于是
我输入mu.*edit.这是一个正则表达式。意思是说mu后面跟任意多个字符,然后后面跟edit.结果没找出来。怎么办。优秀的开源专家框架给我们可以很方便的增加这个功能的机会。
于是以下的操作只需要增加几行代码,就可以实现这个方便而且减轻大脑负担而且很酷的功能。
在Cnpack中好象没有好很的支持正则表达式的单元。于是我就引入了一个正则表达式的单元。这个单元我用了很长时间了。感觉还是很稳定和强大的。当然。选用别的单元也没有问题。
正则表达式的语法都是一样的。

第一步,我们把RegExpr.pas单元引入到CnWizard工程中。
第二步,我们需要修改CnProjectViewBaseFrm.pas单元,这是一个工程扩展工具窗体列表单元列表基类窗体,我们在这里加了上创建和销毁正则表达式对象的功能。
这样我们的所有的子类窗体就可以有正则表达式支持的功能了。包括《函数过程列表窗体》和《工程组单元列表窗体》。
在窗体的FormCreate里我们加上
[@
  Expr :=  TRegExpr.Create;
  Expr.ModifierI := True;
@]
第二行是大小写不敏感的属性设置。
然后我们在protected下面增加一个函数
    function RegExpContainsText(aText,Pattern: string): Boolean;
函数的内容为
function TCnProjectViewBaseForm.RegExpContainsText(aText,Pattern: string): Boolean;
begin
  Expr.Expression := Pattern;
  try
    Result := Expr.Exec(aText);
  except
  end;
end;
然后我们把CnProjectViewUnitFrm.pas单元的第435 行和436行改为如下
//      if (MatchSearchText = '') or (AnsiStartsText(MatchSearchText, UnitInfo.Name)) or
//        (IsMatchAny and RegExpContainsText(UnitInfo.Name, MatchSearchText)) then
      if (MatchSearchText = '') or RegExpContainsText(UnitInfo.Name, MatchSearchText) then
这样,我们的工程组单元列表就支持正则表达式了。
呵呵,用了一下,发现查找效率明显比以前高多了。只要记得一点点的东西。就可以查到想到的东西。
比如。我想找出以List结尾的单元。只要输入list$就好了。想找以ABC开头的窗体。输入^abc就可以了。
更强大的功能还需要你自己多多挖掘。

第三步。给过程列表增加表达式功能。
修改CnProcListWizard.pas单元。在第2663行和下面的一行。注释掉。改成这样的
//            Idx := Pos(MatchStr, UpperCase(ProcName));
//            if (Idx = 1) or (IsMatchAny and (Idx > 1)) then
              if RegExpContainsText(ProcName,MatchStr) then
呵呵,现在编译后,再按快键盘打开过程列表专家。
我记的有一个函数叫查找过程名称。好象叫 search后面跟一个别的东西。然后后面是name
于是我输入 sea.*name,哈哈。我们的找出来了。回车。定位到当前过程。方便了不少。

Attachment: [正则表达式单元] RegExpr.pas (2009-8-22 17:44, 141.71 K) / Download count 502
http://bbs.cnpack.org/attachment.php?aid=679
Author: Passion    Time: 2009-8-22 23:13

感谢如此详细的修改。我们验证一下看看。
Author: jAmEs_    Time: 2009-8-22 23:19

希望快点增加:)
Author: Passion    Time: 2009-8-23 12:40

另外,楼主是否可以确认RegExpr单元支持D2009或以上的Unicode字符串?
Author: Passion    Time: 2009-8-24 21:31

经过验证,Unicode也支持。
541版本已经集成此功能,烦请下载验证?

http://www.cnpack.org/downbuilds.php




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0