代码即时高亮源码,delphi实现

本文介绍了一个使用Delphi编写的代码高亮编辑器组件,该组件能够实现代码的即时高亮显示。文章详细阐述了配置文件、事件处理、核心编辑器类以及XML映射类的实现,展示了如何通过配置文件设置不同编程语言的高亮规则,并提供了加载、显示和编辑代码的功能。
摘要由CSDN通过智能技术生成

1、配置文件

 

< ? x m l version="1.0" encoding="utf-8"?>
< Classify>
  < Language Name="Delphi">
    < Item Name="注释">
      < Color>255</Color>
      < Words>AND</Words>
    < /Item>
    < Item Name="注释">
      < Color>8388608</Color>
      < Words>UNIT;FOR;ELSE;SENDER;TOBJECT;TO;NOT;IF;THEN;DO;APPLICATION;PROCEDURE;FUNCTION;IMPLEMENTATION;BEGIN;END;PRIVATE;VAR;USES;TYPE;INTERFACE;PUBLIC;OR;OF;INHERITED;CLASS;PROTECTED;PUBLISHED;READ;WRITE;STRING;INTEGER;CHAR;FLOAT;DOUBLE;CARDINAL;NIL;CONST;WITH;RAISE;EXCEPT;TRY;EXCEPTION;PROPERTY;CONTRUCTOR;DESTRUCTOR;OVERRIDE;RECORD;DIV</Words>
    < /Item>
  < /Language>
< /Classify>

2、EventMessages.pas

unit EventMessages;

interface
Const
  FileNotFound:String='文件 %s 未找到,请重新确认文件路径。  ';
  XmlNodeNotFound:String='Xml结点 %s 未找到,请检查Xml文件的正确性。  ';
  XmlReadError:String='读取Xml配置文件 %s 时发生错误,请检查文件的正确性。  ';
  LanguageNil:String='要添加的新程序设计语言名称不能为空白!  ';
  LanguageExist:String='要添加的程序设计语言 %s 已经存在。  ';
implementation

end.

3、HighLightEditor.pas

unit HighLightEditor;

interface

uses
  Windows,Messages,Classes,StdCtrls,Forms,SyntaxHighlighter,Graphics,SysUtils,
  XmlMapper;

type
  THighLightEditor = class(TMemo)
  private
    FProgramLanguage: String;
    FXmlFile:String;//配置文件路径
    FRect,MaskRect:TRect;
    FDC:HDC;
    FHighLightor:TSyntaxHighlighter;
    FXmlMapper:TXmlMapper;
    Flanguages:TStrings;
    procedure SetProgramLanguage(const Value: String);
    Function FirstVisibleLine():Integer;
    Function VisibledLines():Integer;
    procedure SetXmlFile(const Value: String);
  protected
    procedure WndProc(var message:Tmessage);override;
    Procedure CreateWnd();Override; //Create与Destrly要成对出现
    Procedure DestroyWnd;Override;
  public
    { Public declarations }
  published
    Constructor Create(AOwner:TComponent);Override;//Create与Destrly要成对出现
    Destructor Destroy;Override;
    Property ProgramLanguage:String read FProgramLanguage write SetProgramLanguage;
    Property XmlFile:String read FXmlFile write SetXmlFile;
    Property Languages:TStrings read Flanguages;//这是个集合
    Procedure ShowSchemaEditor();
  end;

procedure Register;

implementation
uses EventMessages,SchemaEditor,unit1;
procedure Register;
begin
  RegisterComponents('HighLightEditor', [THighLightEditor]);
end;

{ THighLightEditor }

constructor THighLightEditor.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  BorderStyle:=bsNone;
  Font.Name:='Courier New';
  Font.Size:=10;
  Scrollbars:=ssBoth;
end;

procedure THighLightEditor.CreateWnd;
begin
  inherited;
  FDC:=GetDc(Handle);
  FHighLightor:=TSyntaxHighlighter.Create(Handle,FDC);
end;

destructor THighLightEditor.Destroy;
begin
  Parent:=nil;
  //ReleaseDC(Handle,FDC);
  FreeAndNil(FHighLightor);
  FreeAndNil(FXmlMapper);
  //Flanguages.Free; //这个没有显示创建,所以不用手动释放
  inherited;
end;

procedure THighLightEditor.DestroyWnd;
begin
  //ReleaseDC(Handle,FDC);
  inherited;
end;

function THighLightEditor.FirstVisibleLine: Integer;
begin
  Result:=SendMessage(Handle,EM_GETFIRSTVISIBLELINE,0,0);
end;

procedure THighLightEditor.SetProgramLanguage(const Value: String);
begin
  FProgramLanguage := Value;
  FXmlMapper.Language:=FProgramLanguage;
  Repaint;
end;

procedure THighLightEditor.SetXmlFile(const Value: String);
begin
  if not FileExists(Value) then
    Raise Exception.Create(Format(FileNotFound,[Value]))//到这里后就不会再运行
  else
  begin
    FXmlFile := Value;
    if Assigned(FXmlMapper) then
      FreeAndNil(FXmlMapper);
    FXmlMapper:=TXmlMapper.Create(FXmlFile);
    Flanguages:=FXmlMapper.Languages;
    FHighLightor.HighLightSchema:=FXmlMapper.Schema;
  end;
end;

procedure THighLightEditor.ShowSchemaEditor;
begin
  //SchemaEditorFrm:=TSchemaEditorFrm.Create(Self,FProgramLanguage);
  //SchemaEditorFrm.ShowModal;
end;

function THighLightEditor.VisibledLines: Integer;
Var
  OldFont:HFont;
  TM:TTextMetric;
begin
  OldFont:=SelectObject(FDC,Font.Handle);
  GetTextMetrics(FDC,TM);
  Result:=(FRect.Bottom-FRect.Top) div (TM.tmHeight + TM.tmExternalLeading);
  SelectObject(Handle,OldFont);
end;

procedure THighLightEditor.WndProc(var Message: TMessage);
Var
  FirstLine,CharIndex,LastLine,I:Integer;
  TokenArray

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值