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

📄 synmemo.pas

📁 一个mwEdit控件原码,比mwCuuEdit0.92a功能先进.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    // BiDi specific messages
    procedure EMSETBIDIOPTIONS(var Message: TMessage); message EM_SETBIDIOPTIONS;
    procedure EMGETBIDIOPTIONS(var Message: TMessage); message EM_GETBIDIOPTIONS;

    procedure EMSETTYPOGRAPHYOPTIONS(var Message: TMessage); message EM_SETTYPOGRAPHYOPTIONS;
    procedure EMGETTYPOGRAPHYOPTIONS(var Message: TMessage); message EM_GETTYPOGRAPHYOPTIONS;

    // Extended edit style specific messages
    procedure EMSETEDITSTYLE(var Message: TMessage); message EM_SETEDITSTYLE;
    procedure EMGETEDITSTYLE(var Message: TMessage); message EM_GETEDITSTYLE;
    }
{$ENDIF NOT SYN_CLX}
  end;

implementation

uses
{$IFDEF SYN_CLX}
  QSynEditMiscProcs;
{$ELSE}
  SynEditMiscProcs;
{$ENDIF}

{$IFNDEF SYN_CLX}

{ TSynMemo }

procedure TSynMemo.EMGetSel(var Message: TMessage);
var
  s, e: integer;
begin
  // EM_GETSEL
  // wParam = (WPARAM) (LPDWORD) lpdwStart;      // receives starting position
  // lParam = (LPARAM) (LPDWORD) lpdwEnd;        // receives ending position
  s := GetSelStart;
  e := GetSelEnd;
  if Message.wParam <> 0 then PDWORD(Message.wParam)^ := s;
  if Message.lParam <> 0 then PDWORD(Message.lParam)^ := e;
  Message.result := MakeLong(s, e)
end;

procedure TSynMemo.EMSetSel(var Message: TMessage);
begin
  // EM_SETSEL
  // wParam = (WPARAM) (INT) nStart;             // starting position
  // lParam = (LPARAM) (INT) nEnd;               // ending position
  SetSelStart(Message.wParam);
  SetSelEnd(Message.lParam);
end;

procedure TSynMemo.EMSetModify(var Message: TMessage);
begin
  Modified := Message.wParam <> 0;
end;

procedure TSynMemo.EMGetModify(var Message: TMessage);
begin
  Message.result := integer(Modified);
end;

procedure TSynMemo.EMGetLineCount(var Message: TMessage);
begin
  //(WPARAM) wParam,      // not used; must be zero
  //(LPARAM) lParam       // not used; must be zero
  Message.Result := Lines.Count;
end;

procedure TSynMemo.EMGetSelText(var Message: TMessage);
var
  s: string;
begin
  if Message.lParam <> 0 then begin
    s := SelText;
    StrLCopy(PChar(Message.lParam), PChar(s), length(s));
    Message.Result := length(s);
  end;
end;

procedure TSynMemo.EMReplaceSel(var Message: TMessage);
var
  StartOfBlock: TBufferCoord;
  EndOfBlock: TBufferCoord;
begin
  // EM_REPLACESEL
  // fCanUndo = (BOOL) wParam ;                  // flag that specifies whether replacement can be undone
  // lpszReplace = (LPCTSTR) lParam ;            // pointer to replacement text string
  // see PasteFromClipboard CF_TEXT - use common function ?
  // or use SetSelText/SetSelTextPrimitive (no undo)

  if ReadOnly then exit;
  DoOnPaintTransient(ttBefore);
  BeginUndoBlock;
  try
    if SelAvail and (Message.WParam <> 0){???} then begin
      UndoList.AddChange(crDelete, BlockBegin, BlockEnd, SelText, SelectionMode);
    end;
    StartOfBlock := BlockBegin;
    EndOfBlock := BlockEnd;
    BlockBegin := StartOfBlock;
    BlockEnd := EndOfBlock;
    LockUndo;
    try
      SelText := PChar(Message.lParam);
    finally
      UnlockUndo;
    end;
    if (Message.WParam <> 0){???} then begin
      UndoList.AddChange(crPaste, StartOfBlock, BlockEnd, SelText, smNormal);
    end;
  finally
    EndUndoBlock;
  end;
  EnsureCursorPosVisible;
  // Selection should have changed...
  StatusChanged([scSelection]); 

  DoOnPaintTransient(ttAfter);
end;

procedure TSynMemo.EMGetLine(var Message: TMessage);
var
  dest: PChar;
begin
  //(WPARAM) wParam,      // line number
  //(LPARAM) lParam       // line buffer (LPCTSTR)
  // other than Editcontrol with terminating #0
  if (Message.WParam >= 0) and (Message.WParam < Lines.Count) then begin
    dest := PChar(Message.LParam);
    StrLCopy(dest, PChar(Lines[Message.WParam]), PWord(Message.LParam)^);
    Message.result := StrLen(dest);
  end else begin
    Message.result := 0;
  end;
end;

procedure TSynMemo.EMCanUndo(var Message: TMessage);
begin
  //(WPARAM) wParam,    // not used; must be zero
  //(LPARAM) lParam     // not used; must be zero
  Message.Result := integer(CanUndo);
end;

procedure TSynMemo.EMUndo(var Message: TMessage);
begin
  //(WPARAM) wParam,    // not used; must be zero
  //(LPARAM) lParam     // not used; must be zero
  Message.Result := integer(CanUndo);
  Undo;
end;

procedure TSynMemo.EMGetFirstVisibleLine(var Message: TMessage);
begin
  //(WPARAM) wParam,          // not used; must be zero
  //(LPARAM) lParam           // not used; must be zero
  Message.Result := TopLine;
end;

procedure TSynMemo.EMCharFromPos(var Message: TMessage);
var
  vPos: TBufferCoord;
  i: integer;
begin
  //(WPARAM) wParam,    // not used; must be zero
  //(LPARAM) lParam     // point coordinates
  // ???
  vPos := DisplayToBufferPos(PixelsToRowColumn(Message.LParamLo, Message.LParamHi));

  Dec(vPos.Line);
  if vPos.Line >= Lines.Count then 
    vPos.Char := 1
  else if vPos.Char > Length(Lines[vPos.Line]) then
    vPos.Char := Length(Lines[vPos.Line]) +1; // ???

  i := vPos.Line;
  while i > 0 do begin
    dec(i);
    inc(vPos.Char, length(Lines[i])+2);
  end;

  //todo: this can't be right, CharIndex can easily overflow
  Message.Result := MakeLong(vPos.Char{CharIndex}, vPos.Line{Line zero based});
end;

{$ENDIF NOT SYN_CLX}

end.

⌨️ 快捷键说明

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