`
buliedian
  • 浏览: 1254346 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

c++builder RichEdit的源码显示之亮显(附代码)

阅读更多

因为要在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插入并显示PNG、JPG、BMP等图片及图文混排完整示例代码

    RichEdit控件显示BMP图片 代码示例: //在RichEdit中图文混排显示资源中位图 void CRichEditTestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 ..... } //在RichEdit中显示PNG、JPG、BMP等...

    RichEdit中插入图片,文字以及美化设置

    在C++中,`CRichEditCtrl`类提供了对RichEdit的封装,提供了如`InsertText`、`SetSel`、`SetParaFormat`等方便的成员函数。而在MFC之外,可以直接使用WinAPI中的`RichEdit`相关函数。 总的来说,通过熟练掌握上述...

    C++Builder精彩编程实例集锦的源代码后3部分.rar

    实例117 如何设置RichEdit组件的存盘格式 实例118 如何在WIN.INI文件中保存程序信息 实例119 如何将数据转换成Word文档格式 实例120 如何直接从Excel文件导入数据 实例121 如何直接将数据导入到Excel文件 实例...

    C++Builder精彩编程实例集锦的源代码(1,2,3部分).rar

    C++Builder精彩编程实例集锦的源代码(1,2,3部分): 第一部分 界面设计 实例001 如何实现程序闪屏效果 实例002 如何实现程序窗口闪烁 实例003 如何制作吸附窗口程序 实例004 如何制作透明程序窗口 实例005 如何...

    TMS Component Pack 6.5.0.0 for Delphi & C++Builder 5-XE3 Full Source

    《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边界.zip

    在计算机编程领域,"设置Memo边界"通常是指在应用程序中对多行文本控件,如 Memo 或 RichEdit,进行操作以限制其显示或输入的文本范围。Memo 是一种常见的控件,尤其在 Delphi 和 C++Builder 等基于VCL(Visual ...

    smartread 2.7 破解

    实现对于RichEdit控件的支持;实现对于英文,繁体中文,简体中文系统的支持,可以根据系统的语言出现相应的界面提示语言;加入了VFP的例子.提供VC++,VB,Delphi,C++ Builder,PowerBuilder,VFP的详细例程,帮助文档,帮助你...

    smartread 2.8

    实现对于RichEdit控件的支持;实现对于英文,繁体中文,简体中文系统的支持,可以根据系统的语言出现相应的界面提示语言;加入了VFP的例子.提供VC++,VB,Delphi,C++ Builder,PowerBuilder,VFP的详细例程,帮助文档,帮助你...

    EhLib5.0.13 最新的ehlib源码

    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 -------...

    编程问题及解决方法[参考].pdf

    通过使用`AnsiString`变量来存储`RichEdit`窗口的内容,并使用`Lines-&gt;Add()`来更新内容,避免了标题长度增长导致的性能问题。 2. **确保从串口获取整数倍数据**: 在处理串口通信时,确保读取的数据是特定数据...

    RxLib控件包内含RxGIF,全部源码及DEMO

    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...

    DevExpress VCL 2012 vol 1.6源码、例子、帮助-Part1

    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....

    DevExpress VCL v13.1.4 for XE5-XE6 Full Source

    1. **组件集**:包括Grid Control(数据网格)、Chart Control(图表)、RichEdit Control(富文本编辑器)、Scheduler Control(日程安排)、Bar and Ribbon Control(工具栏和选项卡)、Docking Panes(浮动面板)...

    DevExpress VCL 2012 vol 1.6源码、例子、帮助-Part2

    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 ...

    DevExpress VCL v2012 vol 1.6源码、例子、帮助-Part1

    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 ...

    DevExpress VCL v2012 vol 1.6源码-例子-帮助-part2

    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 ...

    DevExpress VCL v2012 vol 1.6源码-例子-帮助-part1

    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 ...

    DevExpress VCL v2012 vol 1.6源码、例子、帮助

    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 ...

Global site tag (gtag.js) - Google Analytics