亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? richeditviewer.pas

?? 源代碼
?? PAS
字號(hào):
unit RichEditViewer;

{ TRichEditViewer v1.11 by Jordan Russell

  Known problem:
  If, after assigning rich text to a TRichEditViewer component, you change
  a property that causes the component's handle to be recreated, all text
  formatting will be lost. In the interests of code size, I do not intend
  to work around this.

  Rich Edit 2.0 and > 64 kb support added by Martijn Laan for My Inno Setup Extensions
  See http://isx.wintax.nl/ for more information

  $jrsoftware: issrc/Components/RichEditViewer.pas,v 1.5 2004/09/22 16:57:26 jr Exp $
}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TRichEditViewer = class(TMemo)
  private
    FUseRichEdit: Boolean;
    FRichEditLoaded: Boolean;
    procedure SetRTFTextProp(const Value: String);
    procedure SetUseRichEdit(Value: Boolean);
    procedure UpdateBackgroundColor;
    procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;
    procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE;
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function SetRTFText(const Value: String): Integer;
    property RTFText: String write SetRTFTextProp;
  published
    property UseRichEdit: Boolean read FUseRichEdit write SetUseRichEdit default True;
  end;

procedure Register;

implementation

uses
  RichEdit, ShellApi;

const
  RICHEDIT_CLASS10A = 'RICHEDIT';
  RICHEDIT_CLASSA = 'RichEdit20A';
  RICHEDIT_CLASS = RICHEDIT_CLASSA;
  EM_AUTOURLDETECT = WM_USER + 91;
  ENM_LINK = $04000000;
  EN_LINK = $070b;

type
  PEnLink = ^TEnLink;
  TENLink = record
    nmhdr: TNMHdr;
    msg: UINT;
    wParam: WPARAM;
    lParam: LPARAM;
    chrg: TCharRange;
  end;

  TTextRange = record
    chrg: TCharRange;
    lpstrText: PAnsiChar;
  end;

var
  RichEditModule: HMODULE;
  RichEditUseCount: Integer = 0;
  RichEditVersion: Integer;

procedure LoadRichEdit;
begin
  if RichEditUseCount = 0 then begin
    RichEditVersion := 2;
    RichEditModule := LoadLibrary('RICHED20.DLL');
    if RichEditModule = 0 then begin
      RichEditVersion := 1;
      RichEditModule := LoadLibrary('RICHED32.DLL');
    end;
  end;
  Inc(RichEditUseCount);
end;

procedure UnloadRichEdit;
begin
  if RichEditUseCount > 0 then begin
    Dec(RichEditUseCount);
    if RichEditUseCount = 0 then begin
      FreeLibrary(RichEditModule);
      RichEditModule := 0;
    end;
  end;
end;

{ TRichEditViewer }

constructor TRichEditViewer.Create(AOwner: TComponent);
begin
  inherited;
  FUseRichEdit := True;
end;

destructor TRichEditViewer.Destroy;
begin
  inherited;
  { First do all other deinitialization, then decrement the DLL use count }
  if FRichEditLoaded then begin
    FRichEditLoaded := False;
    UnloadRichEdit;
  end;
end;

procedure TRichEditViewer.CreateParams(var Params: TCreateParams);
{ Based on code from TCustomRichEdit.CreateParams }
begin
  if UseRichEdit and not FRichEditLoaded then begin
    { Increment the DLL use count when UseRichEdit is True, load the DLL }
    FRichEditLoaded := True;
    LoadRichEdit;
  end;
  inherited;
  if UseRichEdit then begin
    if RichEditVersion = 2 then
      CreateSubClass(Params, RICHEDIT_CLASS)
    else
      CreateSubClass(Params, RICHEDIT_CLASS10A);
  end else
    { Inherited handler creates a subclass of 'EDIT'.
      Must have a unique class name since it uses two different classes
      depending on the setting of the UseRichEdit property. }
    StrCat(Params.WinClassName, '/Text');  { don't localize! }
end;

procedure TRichEditViewer.CreateWnd;
var
  Mask: LongInt;
begin
  inherited;
  UpdateBackgroundColor;
  if FUseRichEdit and (RichEditVersion = 2) then begin
    Mask := ENM_LINK or SendMessage(Handle, EM_GETEVENTMASK, 0, 0);
    SendMessage(Handle, EM_SETEVENTMASK, 0, LPARAM(Mask));
    SendMessage(Handle, EM_AUTOURLDETECT, WPARAM(True), 0);
  end;
end;

procedure TRichEditViewer.UpdateBackgroundColor;
begin
  if FUseRichEdit and HandleAllocated then
    SendMessage(Handle, EM_SETBKGNDCOLOR, 0, ColorToRGB(Color));
end;

procedure TRichEditViewer.SetUseRichEdit(Value: Boolean);
begin
  if FUseRichEdit <> Value then begin
    FUseRichEdit := Value;
    RecreateWnd;
    if not Value and FRichEditLoaded then begin
      { Decrement the DLL use count when UseRichEdit is set to False }
      FRichEditLoaded := False;
      UnloadRichEdit;
    end;
  end;
end;

type
  PStreamLoadData = ^TStreamLoadData;
  TStreamLoadData = record
    Buf: PByte;
    BytesLeft: Integer;
  end;

function StreamLoad(dwCookie: Longint; pbBuff: PByte;
  cb: Longint; var pcb: Longint): Longint; stdcall;
begin
  Result := 0;
  with PStreamLoadData(dwCookie)^ do begin
    if cb > BytesLeft then
      cb := BytesLeft;
    Move(Buf^, pbBuff^, cb);
    Inc(Buf, cb);
    Dec(BytesLeft, cb);
    pcb := cb;
  end;
end;

function TRichEditViewer.SetRTFText(const Value: String): Integer;

  function StreamIn(AFormat: WPARAM): Integer;
  var
    Data: TStreamLoadData;
    EditStream: TEditStream;
  begin
    Data.Buf := @Value[1];
    Data.BytesLeft := Length(Value);
    EditStream.dwCookie := Longint(@Data);
    EditStream.dwError := 0;
    EditStream.pfnCallback := @StreamLoad;
    SendMessage(Handle, EM_STREAMIN, AFormat, LPARAM(@EditStream));
    Result := EditStream.dwError;
  end;

begin
  if not FUseRichEdit then begin
    Text := Value;
    Result := 0;
  end
  else begin
    SendMessage(Handle, EM_EXLIMITTEXT, 0, LParam($7FFFFFFE));
    Result := StreamIn(SF_RTF);
    if Result <> 0 then
      Result := StreamIn(SF_TEXT);
  end;
end;

procedure TRichEditViewer.SetRTFTextProp(const Value: String);
begin
  SetRTFText(Value);
end;

procedure TRichEditViewer.CMColorChanged(var Message: TMessage);
begin
  inherited;
  UpdateBackgroundColor;
end;

procedure TRichEditViewer.CMSysColorChange(var Message: TMessage);
begin
  inherited;
  UpdateBackgroundColor;
end;

procedure TRichEditViewer.CNNotify(var Message: TWMNotify);
var
  EnLink: PEnLink;
  CharRange: TCharRange;
  TextRange: TTextRange;
  Length: Integer;
  URL: String;
begin
  case Message.NMHdr^.code of
    EN_LINK: begin
      EnLink := PEnLink(Message.NMHdr);
      if EnLink.msg = WM_LBUTTONDOWN then begin
        CharRange := EnLink.chrg;
        if (CharRange.cpMin = 0) and (CharRange.cpMax = -1) then
          Length := SendMessage(Handle, WM_GETTEXTLENGTH, 0, 0)
        else
          Length := CharRange.cpMax-CharRange.cpMin+1;
        SetLength(URL, Length);
        TextRange.chrg := CharRange;
        TextRange.lpstrText := PChar(Url);
        SetLength(URL, SendMessage(Handle, EM_GETTEXTRANGE, 0, LParam(@TextRange)));
        if URL <> '' then
          ShellExecute(Handle, 'open', PChar(Url), nil, nil, SW_SHOWNORMAL);
      end;
    end;
  end;
end;

procedure Register;
begin
  RegisterComponents('JR', [TRichEditViewer]);
end;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩国产欧美视频| 亚洲综合色视频| 在线观看不卡视频| 国产成人午夜99999| 亚洲综合一区二区| 精品久久国产老人久久综合| av男人天堂一区| 美女脱光内衣内裤视频久久影院| 久久久99久久精品欧美| 欧美男男青年gay1069videost| 国产曰批免费观看久久久| 亚洲一区二区高清| 亚洲视频一二三| 国产精品欧美一区二区三区| 欧美一区二区三区免费观看视频| 99视频精品在线| 不卡视频免费播放| 国产成人亚洲综合a∨猫咪| 久久99精品久久久久久| 日本伊人精品一区二区三区观看方式| 国产精品高清亚洲| 国产精品久久久久久久久免费樱桃| 日韩欧美国产午夜精品| 欧美一区二区三区性视频| 色综合久久88色综合天天| av一区二区三区四区| 97久久超碰国产精品电影| 99麻豆久久久国产精品免费| 成人免费看片app下载| 高清国产一区二区| 91色|porny| 欧美三区在线观看| 4hu四虎永久在线影院成人| 欧美肥胖老妇做爰| 精品动漫一区二区三区在线观看| 欧美一区二区三区免费在线看| 日韩欧美高清在线| 国产精品色哟哟网站| 成人免费小视频| 亚洲成人先锋电影| 久久不见久久见中文字幕免费| 国产成人高清在线| 91久久精品网| 精品国产一区二区三区不卡 | 制服丝袜中文字幕一区| 日韩三级伦理片妻子的秘密按摩| 久久久久国产免费免费| 亚洲一区二区在线播放相泽| 老司机精品视频线观看86| 成人天堂资源www在线| 欧美日韩一区二区在线视频| 北条麻妃一区二区三区| 国产亚洲精品aa| 日韩欧美一级精品久久| 日韩一区二区在线免费观看| 国产丝袜美腿一区二区三区| 玉米视频成人免费看| 精品影视av免费| 欧美日韩视频在线一区二区| 久久亚洲综合色一区二区三区| 一区二区三区精品在线| 国产成人精品一区二| 日韩欧美国产一二三区| 五月天中文字幕一区二区| 成人午夜视频网站| 国产午夜精品久久久久久久| 激情成人综合网| 日韩视频一区二区| 日韩高清欧美激情| 欧美丝袜丝交足nylons| 亚洲女同一区二区| 菠萝蜜视频在线观看一区| 国产日韩欧美麻豆| 粉嫩aⅴ一区二区三区四区 | 精品久久久久一区| 秋霞成人午夜伦在线观看| 日韩一区二区在线免费观看| 日本91福利区| 久久久久久久电影| 国产老妇另类xxxxx| 久久精品人人做人人综合| 国产麻豆视频一区| 国产精品久久久久久户外露出 | 久久精工是国产品牌吗| 日韩欧美国产午夜精品| 岛国一区二区三区| 亚洲卡通欧美制服中文| 欧美日本一区二区在线观看| 日韩精品福利网| 久久亚区不卡日本| 波多野结衣欧美| 午夜国产不卡在线观看视频| 欧美tickle裸体挠脚心vk| 国产成人综合精品三级| 一区二区三区欧美日韩| 欧美一区二区三区婷婷月色| 国产精一品亚洲二区在线视频| 国产免费成人在线视频| 欧美色图12p| 国内精品免费**视频| 亚洲男人的天堂av| 亚洲精品一线二线三线| 在线观看精品一区| 国产91富婆露脸刺激对白| 日韩精品视频网站| 亚洲日本在线a| 精品国产一区二区三区久久影院| 成人动漫中文字幕| 九九在线精品视频| 香蕉久久一区二区不卡无毒影院| 国产欧美日韩久久| 欧美精品第1页| 青娱乐精品视频| 亚洲色图在线播放| 久久综合久久综合九色| 欧美日韩一区在线| 懂色av一区二区夜夜嗨| 免费一级片91| 夜夜嗨av一区二区三区四季av | 欧美少妇性性性| 国产成人欧美日韩在线电影| 婷婷久久综合九色国产成人| 国产精品免费看片| 久久美女艺术照精彩视频福利播放| 色婷婷精品久久二区二区蜜臀av | 亚洲激情av在线| 国产精品久久久久久久久果冻传媒 | 精品国产91久久久久久久妲己| 色婷婷综合久久久久中文| 国产suv精品一区二区883| 亚洲成人动漫在线观看| 国产精品乱码一区二三区小蝌蚪| xnxx国产精品| 欧美精品一区二区三区蜜臀| 在线不卡免费欧美| 欧美最猛黑人xxxxx猛交| 成人aa视频在线观看| 成人精品鲁一区一区二区| 国产精品自拍av| 九九精品一区二区| 国产一区二区三区av电影| 国产精品一区二区你懂的| 国产精品小仙女| 成人高清伦理免费影院在线观看| 国产自产高清不卡| 成人午夜av影视| 97久久精品人人爽人人爽蜜臀| 成人av影院在线| 91网站最新网址| 91国内精品野花午夜精品| 色哟哟在线观看一区二区三区| 欧美在线视频全部完| 欧美日韩国产一级二级| 精品国产91久久久久久久妲己| www成人在线观看| 夜夜精品浪潮av一区二区三区| 日韩中文字幕av电影| 国产69精品久久99不卡| 色久优优欧美色久优优| 日韩你懂的在线观看| 中文字幕一区二区日韩精品绯色| 国产精品视频线看| 亚洲成av人片www| 成人一级视频在线观看| 精品视频在线免费看| 久久精品视频一区二区三区| 夜夜夜精品看看| 奇米色777欧美一区二区| 99久久伊人精品| 亚洲精品一区二区精华| 亚洲精品中文在线观看| 老司机精品视频导航| 欧美日韩亚洲综合| 成人欧美一区二区三区黑人麻豆 | 精品一区二区免费视频| 91国偷自产一区二区三区成为亚洲经典 | 91色porny蝌蚪| 日本一区二区三区在线观看| 日本美女一区二区三区视频| 欧美综合亚洲图片综合区| 国产亚洲综合色| 国产专区欧美精品| 日韩一区二区三区观看| 日本亚洲欧美天堂免费| 欧美三级中文字幕| 欧美国产亚洲另类动漫| 国产福利精品一区| 久久美女艺术照精彩视频福利播放 | 亚洲成人一区在线| 日韩一区国产二区欧美三区| 欧美高清精品3d| 欧美日本国产视频| 欧美tickling网站挠脚心| 亚洲最大色网站| 在线亚洲人成电影网站色www| 26uuu亚洲婷婷狠狠天堂| 极品尤物av久久免费看| 欧美刺激午夜性久久久久久久| 视频一区二区中文字幕| 欧美丰满少妇xxxxx高潮对白|