分享

RichEdit 中实现代码着色

 aaie_ 2011-12-31
贴给你好了,我找到的,试过,很好使。
--------------------------------------
在   RichEdit   中实现代码着色

下面的代码将以指定颜色对一些指定单词着色,就象delphi中的代码编辑器那样。  

procedure   CodeColors(Form   :   TForm;Style   :   String;   RichE   :   TRichedit;
                                                  InVisible   :   Boolean);  
const  
    //   符号...  
    CodeC1:   array[0..20]   of   String   =   ( '# ', '$ ', '( ', ') ', '* ', ', ',  
                    '. ', '/ ', ': ', '; ', '[ ', '] ', '{ ', '} ', ' < ', '> ',  
                    '- ', '= ', '+ ', ' ' ' ', '@ ');  
    //   保留字...  
    CodeC2:   array[0..44]   of   String   =   ( 'and ', 'as ', 'begin ',  
                    'case ', 'char ', 'class ', 'const ', 'downto ',  
                    'else ', 'end ', 'except ', 'finally ', 'for ',  
                    'forward ', 'function ', 'if ', 'implementation ', 'interface ',  
                    'is ', 'nil ', 'or ', 'private ', 'procedure ', 'public ', 'raise ',  
                    'repeat ', 'string ', 'to ', 'try ', 'type ', 'unit ', 'uses ', 'var ',  
                    'while ', 'external ', 'stdcall ', 'do ', 'until ', 'array ', 'of ',  
                    'in ', 'shr ', 'shl ', 'cos ', 'div ');  
var  
    FoundAt   :   LongInt;  
    StartPos,   ToEnd,   i   :   integer;  
    OldCap,T   :   String;  
    FontC,   BackC,   C1,   C2   ,C3   ,strC,   strC1   :   TColor;  
begin  
    OldCap   :=   Form.Caption;  
    with   RichE   do  
    begin  
        Font.Name   :=   'Courier   New ';  
        Font.Size   :=   10;  
        if   WordWrap   then   WordWrap   :=   false;  
        SelectAll;  
        SelAttributes.color   :=   clBlack;  
        SelAttributes.Style   :=   [];  
        SelStart   :=   0;  
        if   InVisible   then  
        begin  
            Visible   :=   False;  
            Form.Caption   :=   'Executing   Code   Coloring... ';  
        end;  
    end;  

    BackC   :=   clWhite;   FontC   :=   clBlack;  
    C1   :=   clBlack;   C2   :=   clBlack;   C3   :=   clBlack;  
    strC   :=   clBlue;   strC1   :=   clSilver;  

    if   Style   =   'Twilight '   then  
    begin  
        BackC   :=   clBlack;   FontC   :=   clWhite;  
        C1   :=   clLime;   C2   :=   clSilver;   C3   :=   clAqua;  
        strC   :=   clYellow;   strC1   :=   clRed;  
    end  
    else  
    if   Style   =   'Default '   then  
    begin  
        BackC   :=   clWhite;   FontC   :=   clBlack;  
        C1   :=   clTeal;   C2   :=   clMaroon;   C3   :=   clBlue;  
        strC   :=   clMaroon;   strC1   :=   clSilver;  
    end  
    else  
    if   Style   =   'Ocean '   then  
    begin  
        BackC   :=   $00FFFF80;   FontC   :=   clBlack;  
        C1   :=   clMaroon;   C2   :=   clBlack;   C3   :=   clBlue;  
        strC   :=   clTeal;   strC1   :=   clBlack;  
    end  
    else  
    if   Style   =   'Classic '   then  
    begin  
        BackC   :=   clNavy;   FontC   :=   clYellow;  
        C1   :=   clLime;   C2   :=   clSilver;   C3   :=   clWhite;  
        strC   :=   clAqua;   strC1   :=   clSilver;  
    end  
    else  
    begin  
        with   RichE   do  
        begin  
            T   :=   '{ '+Style+ '   =   Invalid   Style   [Default,Classic,Twilight,Ocean]   ONLY!   } ';  
            Lines.Insert(0,T);  
            StartPos   :=   0;  
            ToEnd   :=   Length(Text)   -   StartPos;  
            FoundAt   :=   FindText(T,   StartPos,   ToEnd,   [stWholeWord]);  
            SelStart   :=   FoundAt;  
            SelLength   :=   Length(T);  
            SelAttributes.Color   :=   clRed;  
            SelAttributes.Style   :=   [fsBold];  
            StartPos   :=   0;  
            ToEnd   :=   Length(Text)   -   StartPos;  
            FoundAt   :=   FindText( 'ONLY! ',   StartPos,   ToEnd,   [stWholeWord]);  
            SelStart   :=   FoundAt;  
            SelLength   :=   4;  
            SelAttributes.Color   :=   clRed;  
            SelAttributes.Style   :=   [fsBold,fsUnderLine];  
        end;  
    end;  

    RichE.SelectAll;  
    RichE.color   :=   BackC;  
    RichE.SelAttributes.color   :=   FontC;  

    for   i   :=   0   to   100   do  
    begin  
        with   RichE   do  
        begin  
            StartPos   :=   0;  
            ToEnd   :=   Length(Text)   -   StartPos;  
            FoundAt   :=   FindText(IntToStr(i),   StartPos,   ToEnd,   [stWholeWord]);  
            while   (FoundAt   <>   -1)   do  
            begin  
                SelStart   :=   FoundAt;  
                SelLength   :=   Length(IntToStr(i));  
                SelAttributes.Color   :=   C1;  
                SelAttributes.Style   :=   [];  
                StartPos   :=   FoundAt   +   Length(IntToStr(i));  
                FoundAt   :=   FindText(IntToStr(i),   StartPos,   ToEnd,   [stWholeWord]);  
            end;  
        end;  
    end;  
    for   i   :=   0   to   20   do  
    begin  
        with   RichE   do  
        begin  
            StartPos   :=   0;  
            ToEnd   :=   Length(Text)   -   StartPos;  
            FoundAt   :=   FindText(CodeC1[i],   StartPos,   ToEnd,   []);  
            while   (FoundAt   <>   -1)   do  
            begin  
                SelStart   :=   FoundAt;  
                SelLength   :=   Length(CodeC1[i]);  
                SelAttributes.Color   :=   C2;  
                StartPos   :=   FoundAt   +   Length(CodeC1[i]);  
                FoundAt   :=   FindText(CodeC1[i],   StartPos,   ToEnd,   []);  
            end;  
        end;  
    end;  
    for   i   :=   0   to   44   do  
    begin  
        with   RichE   do  
        begin  
            StartPos   :=   0;  
            ToEnd   :=   Length(Text)   -   StartPos;  
            FoundAt   :=   FindText(CodeC2[i],   StartPos,   ToEnd,   [stWholeWord]);  
            while   (FoundAt   <>   -1)   do  
            begin  
                SelStart   :=   FoundAt;  
                SelLength   :=   Length(CodeC2[i]);  
                SelAttributes.Color   :=   C3;  
                SelAttributes.Style   :=   [fsBold];  
                StartPos   :=   FoundAt   +   Length(CodeC2[i]);  
                FoundAt   :=   FindText(CodeC2[i],   StartPos,   ToEnd,   [stWholeWord]);  
            end;  
        end;  
    end;  
    Startpos   :=   0;  
    with   RichE   do  
    begin  
        FoundAt   :=   FindText( ' ' ' ',   StartPos,   Length(Text),   []);  
        while   FoundAt   <>   -1   do  
        begin  
            SelStart   :=   FoundAt;  
            Startpos   :=   FoundAt+1;  
            FoundAt   :=   FindText( ' ' ' ',   StartPos,   Length(Text),   []);  
            if   FoundAt   <>   -1   then  
            begin  
                SelLength   :=   (FoundAt   -   selstart)+1;  
                SelAttributes.Style   :=   [];  
                SelAttributes.Color   :=   strC;  
                StartPos   :=   FoundAt+1;  
                FoundAt   :=   FindText( ' ' ' ',   StartPos,   Length(Text),   []);  
            end;  
        end;  
    end;  

    Startpos   :=   0;  
    with   RichE   do  
    begin  
        FoundAt   :=   FindText( '{ ',   StartPos,   Length(Text),   []);  
        while   FoundAt   <>   -1   do  
        begin  
            SelStart   :=   FoundAt;  
            Startpos   :=   FoundAt+1;  
            FoundAt   :=   FindText( '} ',   StartPos,   Length(Text),   []);  
            if   FoundAt   <>   -1   then  
            begin  
                SelLength   :=   (FoundAt   -   selstart)+1;  
                SelAttributes.Style   :=   [];  
                SelAttributes.Color   :=   strC1;  
                StartPos   :=   FoundAt+1;  
                FoundAt   :=   FindText( '{ ',   StartPos,   Length(Text),   []);  
            end;  
        end;  
    end;      

    if   InVisible   then  
    begin  
        RichE.Visible   :=   True;  
        Form.Caption   :=   OldCap;  
    end;  
    RichE.SelStart   :=   0;  
end;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多