因为要在richEdit中显示pb源码,故写了亮显代码。因为只做显示,无需编辑,所以不想借用控件,那样升级维护比较麻烦。
图先:基本和pb中看到的效果一直,而且处理了数字(整数和小数),枚举常量。注释,字符串优先处理。
/*附属定义
const int KEYWORD_QTY = 140;
const int KEYWORD_MAXLEN = 15 ,KEYWORD_MINLEN = 2;
short KeyWordOffset[KEYWORD_MAXLEN]; //用于指示某个长度的关键字的开始处,免得从第一个关键字循环找,效率低
struct strc_KEYWORD{
int iLen;
int tcolor;
int iFont;
char szKEYWORD[20];
};
strc_KEYWORD KEYWORD_LIST[KEYWORD_QTY + 1]={ //关键字只贴若干个..
4,clPurple,1,"blob", 7,clPurple,1,"boolean", 4,clPurple,1,"char", 9,clPurple,1,"character",
4,clPurple,1,"date", 8,clPurple,1,"datetime", 7,clPurple,1,"decimal", 3,clPurple,1,"dec",
6,clPurple,1,"double", 7,clPurple,1,"integer", 3,clPurple,1,"int", 4,clPurple,1,"long",
8,clPurple,1,"longlong", 4,clPurple,1,"real", 6,clPurple,1,"string", 4,clPurple,1,"time",
15,clPurple,1,"unsignedinteger", 4,clPurple,1,"uint", 11,clPurple,1,"unsignedint",
11,clPurple,1,"unsignedlong",
5,clPurple,1,"ulong", 3,clPurple,1,"any"
}
在create事件中把KEYWORD_LIST冒泡排序,按长度从小到大。
KeyWordOffset[]用来指示某个长度的关键字的开始offset,比如KeyWordOffset[6] = 50
代表长度为6的关键字排在第50位开始的地方
*/
void __fastcall TForm1::HightLightTxtEx(TObject *Sender)
{
//高亮显示文本,提示关键字;
//显示模式分关键字,数据类型两大模式。
int iLenOfText;
int ibegin = 0,iend = 0;
TFontStyles StyleProcess;
StyleProcess = TFontStyles()<<fsBold;
bool bISdecimal;
//注意:文件最开头和 0x20,0x0D,0x0A,0x09作为词语分隔符。
iLenOfText = RichEditSource ->Text.Length();
if (iLenOfText < 20) return;
iLenOfText -=2; //最后2字符总是0D0A,所以为了防止越界。可以减少2个。
char *pText = new char[iLenOfText];
memcpy(pText,RichEditSource ->Text.c_str(),iLenOfText); //转成指针可能比较快
LockWindowUpdate(Handle); //不要这一句。
for(int i = 0;i < iLenOfText;i ++){
Application->ProcessMessages(); //******注意这里,如果代码很长比如超过5页,不释放消息的话会很卡。
//增加这一句后,看起来感觉上是刷的一下就着色好了,但只是个错觉,
//因为我们眼睛看到的是第一页,而且鼠标最开始操作的也是第一页。如果
//你迅速拉到最后一页,可以发现程序着色还是进行。但是释放消息能够提高
//响应,我们也不会一下子看到最尾的地方。基本可用。
//当然如果是代码是可编辑状态,那只需要处理从当前光标处到后面的亮显即可。
//就比如我们在编程时输入/*,后面就会全部变成蓝色。但是我们眼睛其实在3s时间
//左右,只能看到当前位置的一页左右,所以释放消息都应该可以的。
//优先是注释
//判断到一个注释,要用内循环增加指针,直到结束。这样不要靠外循环去判断。很麻烦。
//2种注释:2F 2F + 0D 0A (优先,因为 //* */ 也是//优先。谁先出现谁优先。跟字符串一起是一个道理,抢先式。
//2F 2A + 2A 2F
if(*(pText + i) == '\x2F' && *(pText + i + 1) == '\x2F'){
ibegin = i;
//循环直到行末
i +=2;
while( !(*(pText + i)== '\x0D' && *(pText + i + 1) == '\x0A')){
i ++;
}
iend = i - ibegin;
//高亮显示;
RichEditSource ->SelStart = ibegin;
RichEditSource ->SelLength = iend ;
RichEditSource ->SelAttributes->Color = clSilver;
RichEditSource ->SelAttributes->Style = StyleProcess;
continue; //不要往下检查,而应该for到下一个i值
}
if(*(pText + i) == '\x2F' && *(pText + i + 1) == '\x2A'){
ibegin = i;
//循环直到行末
i +=2;
while( !(*(pText + i)== '\x2A' && *(pText + i + 1) == '\x2F')){
i ++;
}
iend = i - ibegin;
//高亮显示;
RichEditSource ->SelStart = ibegin;
RichEditSource ->SelLength = iend ;
RichEditSource ->SelAttributes->Color = clSilver;
RichEditSource ->SelAttributes->Style = StyleProcess;
continue; //不要往下检查,而应该for到下一个i值
}
//其次是字符串
if(*(pText + i) == '\"'){
ibegin = i;
//循环直到行末
i ++;
while(true){ //如果有转义符,不算退出,还是在字符串内
if(*(pText + i)== '~'){
i +=2;
}
if(*(pText + i)== '\"'){
break;
}
i++;
}
iend = i - ibegin +1;
//高亮显示;
RichEditSource ->SelStart = ibegin;
RichEditSource ->SelLength = iend ;
RichEditSource ->SelAttributes->Color = clMaroon;
RichEditSource ->SelAttributes->Style = StyleProcess;
continue; //不要往下检查,而应该for到下一个i值
}
//捕获数字 (整数和小数,指数)
if(*(pText + i) > '\x2F' && *(pText + i) < '\x3A'){
ibegin = i;
//循环直到行末
i ++;
bISdecimal = false;
while(true){
if(*(pText + i) == '\x2E' || *(pText + i) == '\x45'){
bISdecimal = true;
i ++;
}else if(*(pText + i) > '\x2F' && *(pText + i) < '\x3A'){
i ++;
}else{
break;
}
}
iend = i - ibegin;
//高亮显示;
RichEditSource ->SelStart = ibegin;
RichEditSource ->SelLength = iend;
if(bISdecimal){
RichEditSource ->SelAttributes->Color = clGray;
}else{
RichEditSource ->SelAttributes->Color = clNavy;
}
RichEditSource ->SelAttributes->Style = StyleProcess;
continue; //不要往下检查,而应该for到下一个i值
}
//再次是一般语句
//逐个取词语,包括起始位置和长度,便于与关键字比较。
//关键字是以"_"和字母开头的。
//如何定义是一个字以内呢?1.必须是字母,而且小写(程序生成的关键字都是小写,可以保证,无需转换),只要遇到不是字母的,退出
//1.如果不是在词内,进入词状态,并直到词的结束(非小写字母,比如空格,括号,逗号,句号,回车,点符号等)
if (('\x60' < *(pText + i) &&
'\x7B' > *(pText + i)) ||
'\x5F' == *(pText + i)){
ibegin = i;
//非字母数字结束
while(('\x40' < *(pText + i) &&
'\x5B' > *(pText + i)) ||
('\x2F' < *(pText + i) &&
'\x3A' > *(pText + i)) ||
('\x60' < *(pText + i) &&
'\x7B' > *(pText + i)) ||
'\x5F' == *(pText + i)){
i ++;
}
//如果是枚举,以感叹号结束
if(*(pText + i)== '\x21'){
//设置为枚举的颜色
//高亮显示;
iend = i +1 - ibegin;
RichEditSource ->SelStart = ibegin;
RichEditSource ->SelLength = iend;
RichEditSource ->SelAttributes->Color = clNavy;
RichEditSource ->SelAttributes->Style = StyleProcess;
continue;
}
iend = i - ibegin;
//对比关键字 ,KEYWORD_LIST已排序数组
if(iend > KEYWORD_MAXLEN || iend < KEYWORD_MINLEN) continue; //上下限长度
for(int kkk=KeyWordOffset[iend -1];kkk< KEYWORD_QTY;kkk++){
if (KEYWORD_LIST[kkk].iLen > iend) break; //在排序数组内已经无法找到该长度了。
if (KEYWORD_LIST[kkk].iLen == iend){
if (memcmp(pText + ibegin,KEYWORD_LIST[kkk].szKEYWORD,iend)==0){
//高亮显示;
RichEditSource ->SelStart = ibegin;
RichEditSource ->SelLength = iend;
RichEditSource ->SelAttributes->Color = (TColor)KEYWORD_LIST[kkk].tcolor;
RichEditSource ->SelAttributes->Style = StyleProcess;
//找到后要退出循环比较。
break;
}
}
}
}
}
//取消选择
RichEditSource ->SelStart = 0;
RichEditSource ->SelLength = 0;
LockWindowUpdate(0); //不要这一句
delete [] pText;
pText = NULL;
}
分享到:
相关推荐
RichEdit控件显示BMP图片 代码示例: //在RichEdit中图文混排显示资源中位图 void CRichEditTestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 ..... } //在RichEdit中显示PNG、JPG、BMP等...
在C++中,`CRichEditCtrl`类提供了对RichEdit的封装,提供了如`InsertText`、`SetSel`、`SetParaFormat`等方便的成员函数。而在MFC之外,可以直接使用WinAPI中的`RichEdit`相关函数。 总的来说,通过熟练掌握上述...
实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例...
C++Builder精彩编程实例集锦的源代码(1,2,3部分): 第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何...
《TMS Component Pack 6.5.0.0:Delphi与C++Builder的组件宝库全源码解析》 TMS Component Pack是一款强大的组件集合,专为Delphi及C++Builder开发人员设计,旨在提高开发效率并提供丰富的功能。在6.5.0.0这个最新...
在软件中,这通常需要使用RTF控件或者特定的解析库来读写RTF文件,如Windows API中的`RichEdit`控件或开源库librtf。 3. **类QQ窗口浮动**:这种设计意味着提示窗口可以像QQ聊天窗口那样,自由地在桌面任何位置浮动...
在计算机编程领域,"设置Memo边界"通常是指在应用程序中对多行文本控件,如 Memo 或 RichEdit,进行操作以限制其显示或输入的文本范围。Memo 是一种常见的控件,尤其在 Delphi 和 C++Builder 等基于VCL(Visual ...
实现对于RichEdit控件的支持;实现对于英文,繁体中文,简体中文系统的支持,可以根据系统的语言出现相应的界面提示语言;加入了VFP的例子.提供VC++,VB,Delphi,C++ Builder,PowerBuilder,VFP的详细例程,帮助文档,帮助你...
实现对于RichEdit控件的支持;实现对于英文,繁体中文,简体中文系统的支持,可以根据系统的语言出现相应的界面提示语言;加入了VFP的例子.提供VC++,VB,Delphi,C++ Builder,PowerBuilder,VFP的详细例程,帮助文档,帮助你...
versions 5, 6, 7, 8 & 9 , Borland C++ Builder versions 5 & 6, Borland Developer Studio 2006, CodeGear Delphi 2007, CodeGear RAD Studio 2009 and Embarcadero RAD Studio 2010. TABLE OF CONTENTS -------...
通过使用`AnsiString`变量来存储`RichEdit`窗口的内容,并使用`Lines->Add()`来更新内容,避免了标题长度增长导致的性能问题。 2. **确保从串口获取整数倍数据**: 在处理串口通信时,确保读取的数据是特定数据...
Delphi/C++ Builder IDE. The program creates folders to keep EhLib binary and other requared files, copies requared files to created folders, compiles packages, register packages in IDE and write ...
found as "View | Project Resources" in the Delphi 3 and C++Builder 3 IDE menu and as "Project | Resources" in the Delphi 4 or higher IDE menu. 3. Units that provide functions and objects to work with...
B218380 - The TcxSSViewInfoData record fields in the cxSSViewInfo.hpp file generated by a C++Builder application have an invalid alignment ExpressTile Control Q432087 - cxDateEdit controls are not ...
支持Delphi 5/6/7/2005,C++Builder 5/6,BDS 2006,RAD Studio 2007/2009/2010/XE; Microsoft VisualStudio.NET 2002/2003/2005/2008/2010; 含有免费的SkinBuilder工具 IrisSkin 共有两个版本,一个是IrisSkin....
1. **组件集**:包括Grid Control(数据网格)、Chart Control(图表)、RichEdit Control(富文本编辑器)、Scheduler Control(日程安排)、Bar and Ribbon Control(工具栏和选项卡)、Docking Panes(浮动面板)...
B218380 - The TcxSSViewInfoData record fields in the cxSSViewInfo.hpp file generated by a C++Builder application have an invalid alignment ExpressTile Control Q432087 - cxDateEdit controls are not ...
B218380 - The TcxSSViewInfoData record fields in the cxSSViewInfo.hpp file generated by a C++Builder application have an invalid alignment ExpressTile Control Q432087 - cxDateEdit controls are not ...
B218380 - The TcxSSViewInfoData record fields in the cxSSViewInfo.hpp file generated by a C++Builder application have an invalid alignment ExpressTile Control Q432087 - cxDateEdit controls are not ...
B218380 - The TcxSSViewInfoData record fields in the cxSSViewInfo.hpp file generated by a C++Builder application have an invalid alignment ExpressTile Control Q432087 - cxDateEdit controls are not ...