604
社区成员
发帖
与我相关
我的任务
分享
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
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,"select", 7,clPurple,1,"from", 4,clPurple,1,"charindex", 9,clPurple,1,"where",
4,clPurple,1,"between", 8,clPurple,1,"and", 7,clPurple,1,"or", 3,clPurple,1,"order",
6,clPurple,1,"by", 7,clPurple,1,"desc", 3,clPurple,1,"char", 4,clPurple,1,"long",
8,clPurple,1,"group", 4,clPurple,1,"having", 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"
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::HighLightTxtEx(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); //转成指针可能比较快
for(int i = 0;i < iLenOfText;i ++)
{
Application->ProcessMessages();
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) > '\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;
}
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;
delete [] pText;
pText = NULL;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
KeyWordOffset[6] = 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichEditSourceChange(TObject *Sender)
{
HighLightTxtEx(this);
}
//---------------------------------------------------------------------------