⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rm_jvrichedit.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    property AllowInPlace: Boolean read FAllowInPlace write FAllowInPlace default True;
{$ENDIF}
    property AllowObjects: Boolean read FAllowObjects write SetAllowObjects default True;
    property AutoURLDetect: Boolean read GetAutoURLDetect write SetAutoURLDetect default True;
    property AutoVerbMenu: Boolean read FAutoVerbMenu write FAutoVerbMenu default True;
    property HideSelection: Boolean read FHideSelection write SetHideSelection default True;
    property HideScrollBars: Boolean read FHideScrollBars
      write SetHideScrollBars default True;
    property Title: string read FTitle write SetTitle;
    property LangOptions: TRichLangOptions read GetLangOptions write SetLangOptions default [rlAutoFont];
    property Lines: TStrings read FRichEditStrings write SetRichEditStrings;
    property PlainText: Boolean read FPlainText write SetPlainText default False;
    property SelectionBar: Boolean read FSelectionBar write SetSelectionBar default True;
    property StreamFormat: TRichStreamFormat read GetStreamFormat write SetStreamFormat default sfDefault;
    property StreamMode: TRichStreamModes read GetStreamMode write SetStreamMode default [];
    property UndoLimit: Integer read FUndoLimit write SetUndoLimit default 100;
    property WordSelection: Boolean read GetWordSelection write SetWordSelection default True;
    property ScrollBars default ssBoth;
    property TabStop default True;
    property OnSaveClipboard: TRichEditSaveClipboard read FOnSaveClipboard
      write FOnSaveClipboard;
    property OnSelectionChange: TNotifyEvent read FOnSelChange write FOnSelChange;
    property OnProtectChange: TRichEditProtectChange read FOnProtectChange
      write FOnProtectChange; { obsolete }
    property OnProtectChangeEx: TRichEditProtectChangeEx read FOnProtectChangeEx
      write FOnProtectChangeEx;
    property OnResizeRequest: TRichEditResizeEvent read FOnResizeRequest
      write FOnResizeRequest;
    property OnURLClick: TRichEditURLClickEvent read FOnURLClick write FOnURLClick;
    property OnTextNotFound: TRichEditFindErrorEvent read FOnTextNotFound write FOnTextNotFound;
{$IFDEF COMPILER3_UP}
    property OnCloseFindDialog: TRichEditFindCloseEvent read FOnCloseFindDialog
      write FOnCloseFindDialog;
{$ENDIF}
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Clear; {$IFDEF COMPILER3_UP} override; {$ENDIF}
    procedure SetSelection(StartPos, EndPos: Longint; ScrollCaret: Boolean);
    function GetSelection: TCharRange;
    function GetTextRange(StartPos, EndPos: Longint): string;
    function LineFromChar(CharIndex: Integer): Integer;
    function GetLineIndex(LineNo: Integer): Integer;
    function GetLineLength(CharIndex: Integer): Integer;
    function WordAtCursor: string;
    function FindText(const SearchStr: string;
      StartPos, Length: Integer; Options: TRichSearchTypes): Integer;
    function GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer;
{$IFDEF COMPILER3_UP} override; {$ENDIF}
    function GetCaretPos: TPoint;
{$IFDEF COMPILER35_UP} override; {$ENDIF}
    function GetCharPos(CharIndex: Integer): TPoint;
    function InsertObjectDialog: Boolean;
    function ObjectPropertiesDialog: Boolean;
    function PasteSpecialDialog: Boolean;
    function FindDialog(const SearchStr: string): TFindDialog;
    function ReplaceDialog(const SearchStr, ReplaceStr: string): TReplaceDialog;
    function FindNext: Boolean;
    procedure Print(const Caption: string); virtual;
    class procedure RegisterConversionFormat(const AExtension: string;
      APlainText: Boolean; AConversionClass: TConversionClass);
    procedure ClearUndo;
    procedure Redo;
    procedure StopGroupTyping;
    property CanFindNext: Boolean read GetCanFindNext;
    property CanRedo: Boolean read GetCanRedo;
    property CanPaste: Boolean read GetCanPaste;
{$IFNDEF COMPILER35_UP}
    procedure Undo;
    property CanUndo: Boolean read GetCanUndo;
    property CaretPos: TPoint read GetCaretPos;
{$ENDIF}
    property RedoName: TUndoName read GetRedoName;
    property UndoName: TUndoName read GetUndoName;
    property DefaulTJvConverter: TConversionClass read FDefaultJvConverter
      write FDefaultJvConverter;
    property DefAttributes: TJvTextAttributes read FDefAttributes write SetDefAttributes;
    property SelAttributes: TJvTextAttributes read FSelAttributes write SetSelAttributes;
    property WordAttributes: TJvTextAttributes read FWordAttributes write SetWordAttributes;
    property PageRect: TRect read FPageRect write FPageRect;
    property Paragraph: TJvParaAttributes read FParagraph;
    property SelectionType: TRichSelectionType read GetSelectionType;
  end;

{$IFDEF TntUnicode}
  TRMCustomUnicodeRichEdit = class(TJvCustomRichEdit)
  private
    FRichEditStrings: TTntStrings;
    FPrintingTextLength: Integer;
    procedure WMGetTextLength(var Message: TWMGetTextLength); message WM_GETTEXTLENGTH;
    procedure SetRichEditStrings(const Value: TTntStrings);
    function GetWideSelText: WideString;
    function GetText: WideString;
    procedure SetWideSelText(const Value: WideString);
    procedure SetText(const Value: WideString);
    function GetHint: WideString;
    function IsHintStored: Boolean;
    procedure SetHint(const Value: WideString);
    procedure SetRTFText(Flags: DWORD; const Value: AnsiString);
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWindowHandle(const Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure DefineProperties(Filer: TFiler); override;
    function GetSelText: string {TNT-ALLOW string}; override;
    function CharPosToGet(RawWin32CharPos: Integer): Integer; deprecated; // use EmulatedCharPos()
    function CharPosToSet(EmulatedCharPos: Integer): Integer; deprecated; // use RawWin32CharPos()
    function GetSelStart: Integer; reintroduce; virtual;
    procedure SetSelStart(const Value: Integer); reintroduce; virtual;
    function GetSelLength: Integer; reintroduce; virtual;
    procedure SetSelLength(const Value: Integer); reintroduce; virtual;
    function LineBreakStyle: TTntTextLineBreakStyle;
    property Lines: TTntStrings read FRichEditStrings write SetRichEditStrings;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    //
    function EmulatedCharPos(RawWin32CharPos: Integer): Integer;
    function RawWin32CharPos(EmulatedCharPos: Integer): Integer;
    //
    procedure Print(const Caption: string {TNT-ALLOW string}); override;
    property SelText: WideString read GetWideSelText write SetWideSelText;
    property SelStart: Integer read GetSelStart write SetSelStart;
    property SelLength: Integer read GetSelLength write SetSelLength;
    property Text: WideString read GetText write SetText;
    function FindText(const SearchStr: WideString; StartPos,
      Length: Integer; Options: TRichSearchTypes): Integer;
  published
    property Hint: WideString read GetHint write SetHint stored IsHintStored;
  end;
{$ENDIF}

  TJvRichEdit = class({$IFDEF TntUnicode}TRMCustomUnicodeRichEdit{$ELSE}TJvCustomRichEdit{$ENDIF})
  published
    property Align;
    property Alignment;
    property AutoURLDetect;
    property AutoVerbMenu;
    property AllowObjects;
{$IFDEF COMPILER3_UP}
    property AllowInPlace;
{$ENDIF}
{$IFDEF COMPILER4_UP}
    property Anchors;
    property BiDiMode;
    property BorderWidth;
    property DragKind;
{$ENDIF}
    property BorderStyle;
    property Color;
    property Ctl3D;
    property DragCursor;
    property DragMode;
    property Enabled;
    property Font;
    property HideSelection;
    property HideScrollBars;
    property Title;
{$IFDEF COMPILER3_UP}
    property ImeMode;
    property ImeName;
{$ENDIF}
{$IFDEF COMPILER4_UP}
    property Constraints;
    property ParentBiDiMode;
{$ENDIF}
    property LangOptions;
    property Lines;
    property MaxLength;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property ParentShowHint;
    property PlainText;
    property PopupMenu;
    property ReadOnly;
    property ScrollBars;
    property SelectionBar;
    property ShowHint;
    property StreamFormat;
    property StreamMode;
    property TabOrder;
    property TabStop;
    property UndoLimit;
    property Visible;
    property WantTabs;
    property WantReturns;
    property WordSelection;
    property WordWrap;
    property OnChange;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
{$IFDEF COMPILER5_UP}
    property OnContextPopup;
{$ENDIF}
{$IFDEF COMPILER4_UP}
    property OnEndDock;
    property OnStartDock;
{$ENDIF}
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
{$IFDEF COMPILER4_UP}
    property OnMouseWheel;
    property OnMouseWheelDown;
    property OnMouseWheelUp;
{$ENDIF}
    property OnProtectChange; { obsolete }
    property OnProtectChangeEx;
    property OnResizeRequest;
    property OnSaveClipboard;
    property OnSelectionChange;
    property OnStartDrag;
    property OnTextNotFound;
{$IFDEF COMPILER3_UP}
    property OnCloseFindDialog;
{$ENDIF}
    property OnURLClick;
  end;

var
  RichEditVersion: TRichEditVersion;

implementation

uses
{$IFDEF COMPILER3_UP}
  OleCtnrs,
{$ENDIF}
  Printers, ComStrs, OleConst, OleDlg, Math,
  RM_JvTypes;

const
  CrLf = #13#10;
  Cr = #13;
  Lf = #10;
  
const
  RTFConversionFormat: TRichConversionFormat =
  (ConversionClass: TConversion; Extension: 'rtf'; PlainText: False; Next: nil);
  TextConversionFormat: TRichConversionFormat =
  (ConversionClass: TConversion; Extension: 'txt'; PlainText: True; Next: @RTFConversionFormat);

var
  ConversionFormatList: PRichConversionFormat = @TextConversionFormat;

const
  RichEdit10ModuleName = 'RICHED32.DLL';
  RichEdit20ModuleName = 'RICHED20.DLL';
{$IFNDEF COMPILER3_UP}
  RICHEDIT_CLASSA = 'RichEdit20A'; { Richedit 2.0 Window Class }
  RICHEDIT_CLASSW = 'RichEdit20W'; { Richedit 2.0 Unicode }
  RICHEDIT_CLASS10A = 'RICHEDIT'; { Richedit 1.0 }
  RICHEDIT_CLASS = RICHEDIT_CLASSA;
{$ENDIF}

{$IFNDEF COMPILER3_UP}

const
  EM_SETUNDOLIMIT = WM_USER + 82;
  EM_REDO = WM_USER + 84;
  EM_CANREDO = WM_USER + 85;
  EM_GETUNDONAME = WM_USER + 86;
  EM_GETREDONAME = WM_USER + 87;
  EM_STOPGROUPTYPING = WM_USER + 88;
  EM_SETTEXTMODE = WM_USER + 89;
  EM_GETTEXTMODE = WM_USER + 90;

  { for use with EM_GET/SETTEXTMODE }
  TM_PLAINTEXT = 1;
  TM_RICHTEXT = 2; { default behavior }
  TM_SINGLELEVELUNDO = 4;
  TM_MULTILEVELUNDO = 8; { default behavior }
  TM_SINGLECODEPAGE = 16;
  TM_MULTICODEPAGE = 32; { default behavior }

  EM_AUTOURLDETECT = WM_USER + 91;
  EM_GETAUTOURLDETECT = WM_USER + 92;
  EM_SETPALETTE = WM_USER + 93;
  EM_GETTEXTEX = WM_USER + 94;
  EM_GETTEXTLENGTHEX = WM_USER + 95;

  EM_SETLANGOPTIONS = WM_USER + 120;
  EM_GETLANGOPTIONS = WM_USER + 121;
  EM_GETIMECOMPMODE = WM_USER + 122;

  { Options for EM_SETLANGOPTIONS and EM_GETLANGOPTIONS }
  IMF_AUTOKEYBOARD = $0001;
  IMF_AUTOFONT = $0002;
  IMF_IMECANCELCOMPLETE = $0004; { high completes the comp string when aborting, low cancels. }
  IMF_IMEALWAYSSENDNOTIFY = $0008;

  { New notifications }
  EN_OLEOPFAILED = $0709;
  EN_OBJECTPOSITIONS = $070A;
  EN_LINK = $070B;
  EN_DRAGDROPDONE = $070C;

  { Event notification masks }
  ENM_SCROLLEVENTS = $00000008;
  ENM_DRAGDROPDONE = $00000010;
  ENM_LANGCHANGE = $01000000;
  ENM_OBJECTPOSITIONS = $02000000;
  ENM_LINK = $04000000;

  { New edit control styles }
  ES_NOOLEDRAGDROP = $00000008;

const
  CFM_LINK = $00000020; { Exchange hyperlink extension }

  CFM_EFFECTS = CFM_BOLD or CFM_ITALIC or CFM_UNDERLINE or CFM_COLOR or
    CFM_STRIKEOUT or CFE_PROTECTED or CFM_LINK;
  CFM_ALL = CFM_EFFECTS or CFM_SIZE or CFM_FACE or CFM_OFFSET or CFM_CHARSET;
  PFM_ALL = PFM_STARTINDENT or PFM_RIGHTINDENT or PFM_OFFSET or
    PFM_ALIGNMENT or PFM_TABSTOPS or PFM_NUMBERING or PFM_OFFSETINDENT;

  { New masks and effects -- a parenthesized asterisk indicates that
     the data is stored by RichEdit2.0, but not displayed }
  CFM_SMALLCAPS = $0040; { (*)    }
  CFM_ALLCAPS = $0080; { (*)    }
  CFM_HIDDEN = $0100; { (*)    }
  CFM_OUTLINE = $0200; { (*)    }
  CFM_SHADOW = $0400; { (*)    }
  CFM_EMBOSS = $0800; { (*)    }
  CFM_IMPRINT = $1000; { (*)    }
  CFM_DISABLED = $2000;
  CFM_REVISED = $4000;

  CFM_BACKCOLOR = $04000000;
  CFM_LCID = $02000000;
  CFM_UNDERLINETYPE = $00800000; { (*)    }
  CFM_WEIGHT = $00400000;
  CFM_SPACING = $00200000; { (*)    }
  CFM_KERNING = $00100000; { (*)    }
  CFM_STYLE = $00080000; { (*)    }
  CFM_ANIMATION = $00040000; { (*)    }
  CFM_REVAUTHOR = $00008000;

  CFE_LINK = $00000020;
  CFE_AUTOCOLOR = $40000000; { NOTE: this corresponds to CFM_COLOR, }
  { which controls it }
  CFE_SUBSCRIPT = $00010000; { Superscript and subscript are }
  CFE_SUPERSCRIPT = $00020000; { mutually exclusive            }

  CFM_SUBSCRIPT = CFE_SUBSCRIPT or CFE_SUPERSCRIPT;
  CFM_SUPERSCRIPT = CFM_SUBSCRIPT;

  CFM_EFFECTS2 = CFM_EFFECTS or CFM_DISABLED or CFM_SMALLCAPS or CFM_ALLCAPS or
    CFM_HIDDEN or CFM_OUTLINE or CFM_SHADOW or CFM_EMBOSS or
    CFM_IMPRINT or CFM_DISABLED or CFM_REVISED or
    CFM_SUBSCRIPT or CFM_SUPERSCRIPT or CFM_BACKCOLOR;

  CFM_ALL2 = CFM_ALL or CFM_EFFECTS2 or CFM_BACKCOLOR or CFM_LCID or
    CFM_UNDERLINETYPE or CFM_WEIGHT or CFM_REVAUTHOR or
    CFM_SPACING or CFM_KERNING or CFM_STYLE or CFM_ANIMATION;

  CFE_SMALLCAPS = CFM_SMALLCAPS;
  CFE_ALLCAPS = CFM_ALLCAPS;
  CFE_HIDDEN = CFM_HIDDEN;
  CFE_OUTLINE = CFM_OUTLINE;
  CFE_SHADOW = CFM_SHADOW;
  CFE_EMBOSS = CFM_EMBOSS;
  CFE_IMPRINT = CFM_IMPRINT;
  CFE_DISABLED = CFM_DISABLED;
  CFE_REVISED = CFM_REVISED;

  CFE_AUTOBACKCOLOR = CFM_BACKCOLOR;

  { Underline types }
  CFU_CF1UNDERLINE = $FF; { map charformat's bit underline to CF2. }
  CFU_INVERT = $FE; { For IME composition fake a selection.  }
  CFU_UNDERLINEDOTTED = $4; { (*) displayed as ordinary underline    }
  CFU_UNDERLINEDOUBLE = $3; { (*) displayed as ordinary underline    }
  CFU_UNDERLINEWORD = $2; { (*) displayed as ordinary underline    }
  CFU_UNDERLINE = $1;
  CFU_UNDERLINENONE = 0;

const
  { PARAFORMAT 2.0 masks and effects }
  PFM_SPACEBEFORE = $00000040;
  PFM_SPACEAFTER = $00000080;
  PFM_LINESPACING = $00000100;
  PFM_STYLE = $00000400;
  PFM_BORDER = $00000800; { (*)    }
  PFM_SHADING = $00001000; { (*)    }
  PFM_NUMBERINGSTYLE = $00002000; { (*)    }
  PFM_NUMBERINGTAB = $00004000; { (*)    }
  PFM_NUMBERINGSTART = $00008000; { (*)    }

  PFM_RTLPARA = $00010000;
  PFM_KEEP = $00020000; { (*)    }
  PFM_KEEPNEXT = $00040000; { (*)    }
  PFM_PAGEBREAKBEFORE = $00080000; { (*)    }
  PFM_NOLINENUMBER = $00100000; { (*)    }
  PFM_NOWIDOWCONTROL = $00200000; { (*)    }
  PFM_DONOTHYPHEN = $00400000; { (*)    }
  PFM_SIDEBYSIDE = $00800000; { (*)    }

  PFM_TABLE = $C0000000; { (*)    }

  { Note: PARAFORMAT has no effects }

  PFM_EFFECTS = PFM_RTLPARA or PFM_KEEP or PFM_KEEPNEXT or PFM_TABLE or
    PFM_PAGEBREAKBEFORE or PFM_NOLINENUMBER or
    PFM_NOWIDOWCONTROL or PFM_DONOTHYPHEN or PFM_SIDEBYSIDE or PFM_TABLE;

  PFM_ALL2 = PFM_ALL or PFM_EFFECTS or PFM_SPACEBEFORE or PFM_SPACEAFTER or
    PFM_LINESPACING or PFM_STYLE or PFM_SHADING or PFM_BORDER or
    PFM_NUMBERINGTAB or PFM_NUMBERINGSTART or PFM_NUMBERINGSTYLE;

  PFE_RTLPARA = PFM_RTLPARA shr 16;
  PFE_KEEP = PFM_KEEP shr 16; { (*)    }
  PFE_KEEPNEXT = PFM_KEEPNEXT shr 16; { (*)    }
  PFE_PAGEBREAKBEFORE = PFM_PAGEBREAKBEFORE shr 16; { (*)    }
  PFE_NOLINENUMBER = PFM_NOLINENUMBER shr 16; { (*)    }
  PFE_NOWIDOWCONTROL = PFM_NOWIDOWCONTROL shr 16; { (*)    }
  PFE_DONOTHYPHEN = PFM_DONOTHYPHEN shr 16; { (*)    }
  PFE_SIDEBYSIDE = PFM_SIDEBYSIDE shr 16; { (*)    }

  PFE_TABLEROW = $C000; { These 3 options are mutually   }
  PFE_TABLECELLEND = $8000; {  exclusive and each imply      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -