给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 609
|