📄 synmemo.pas
字号:
// 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 + -