📄 synedit.pas
字号:
end;
procedure TCustomSynEdit.DoCopyToClipboard(const SText: string);
{$IFDEF SYN_CLX}
begin
Clipboard.AsText := SText;
end;
{$ELSE}
var
Mem: HGLOBAL;
P: PChar;
SLen: integer;
Failed: boolean;
begin
if SText <> '' then begin
Failed := TRUE; // assume the worst.
SLen := Length(SText);
// Open and Close are the only TClipboard methods we use because TClipboard
// is very hard (impossible) to work with if you want to put more than one
// format on it at a time.
Clipboard.Open;
try
// Clear anything already on the clipboard.
EmptyClipboard;
// Put it on the clipboard as normal text format so it can be pasted into
// things like notepad or Delphi.
Mem := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, SLen + 1);
if Mem <> 0 then begin
P := GlobalLock(Mem);
try
if P <> nil then begin
Move(PChar(SText)^, P^, SLen + 1);
// Put it on the clipboard in text format
Failed := SetClipboardData(CF_TEXT, Mem) = 0;
end;
finally
GlobalUnlock(Mem);
end;
end;
// Don't free Mem! It belongs to the clipboard now, and it will free it
// when it is done with it.
if not Failed then begin
// Copy it in our custom format so we know what kind of block it is.
// That effects how it is pasted in.
Mem := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, SLen +
SizeOf(TSynSelectionMode) + 1);
P := GlobalLock(Mem);
try
if P <> nil then begin
// Our format: TSynSelectionMode value followed by text.
PSynSelectionMode(P)^ := SelectionMode;
inc(P, SizeOf(TSynSelectionMode));
Move(PChar(SText)^, P^, SLen + 1);
Failed := SetClipboardData(SynEditClipboardFormat, Mem) = 0;
end;
finally
GlobalUnlock(Mem);
end;
// Don't free Mem! It belongs to the clipboard now, and it will free it
// when it is done with it.
end;
finally
Clipboard.Close;
if Failed then
raise ESynEditError.Create('Clipboard copy operation failed');
end;
end;
end;
{$ENDIF}
procedure TCustomSynEdit.CopyToClipboard;
var
SText: string;
ChangeTrim: boolean;
begin
if SelAvail then
begin
ChangeTrim := (SelectionMode = smColumn) and (eoTrimTrailingSpaces in Options);
try
if ChangeTrim then
Exclude( fOptions, eoTrimTrailingSpaces );
SText := SelText;
finally
if ChangeTrim then
Include( fOptions, eoTrimTrailingSpaces );
end;
DoCopyToClipboard(SText);
end;
end;
procedure TCustomSynEdit.CutToClipboard;
{$IFDEF CODEFOLDING}
//### Code Folding ###
var
FoldRange : TSynEditFoldRange;
//### End Code Folding ###
{$ENDIF}
begin
if not ReadOnly and SelAvail then
begin
BeginUndoBlock;
try
{$IFDEF CODEFOLDING}
//### Code Folding ###
if (CodeFolding.Enabled) then
begin
FoldRange := CollapsableFoldRangeForLine(CaretY);
if (FoldRange <> nil) and (FoldRange.Collapsed) then
exit;
end;
//### End Code Folding ###
{$ENDIF}
DoCopyToClipboard(SelText);
SelText := '';
finally
EndUndoBlock;
end;
end;
end;
constructor TCustomSynEdit.Create(AOwner: TComponent);
begin
fPaintLock := 0;
inherited Create(AOwner);
{$IFDEF CODEFOLDING}
//### Code Folding ###
fAllFoldRanges := TSynEditAllFoldRanges.Create;
fCodeFoldingPlugin := TSynEditCodeFoldingPlugin.Create(Self);
fCodeFolding := TSynCodeFolding.Create;
fCodeFolding.OnChange := CodeFoldingOnChange;
fNeedToReScan := 0;
//### End Code Folding ###
{$ENDIF}
fLines := TSynEditStringList.Create;
fOrigLines := fLines;
(* 初始化 *)
FBufferBmp := Graphics.TBitmap.Create;
fScrollBars := TSynScrollBars.Create;
fScrollBars.OnChange := ScrollBarChanged;
FBlockWidth := 2;
fRightEdge := TSynRightEdge.create;
fRightEdge.OnChange := RightEdgeChanged;
fMoveRightEdgeBitmap := Graphics.TBitmap.Create;
fLineDivider := TSynLineDivider.create;
fLineDivider.OnChange := LineDividerChanged;
fActiveLine := TSynActiveLine.create;
fActiveLine.OnChange := ActiveLineChanged;
fWordWrap := TSynWordWrap.create;
fWordWrap.OnChange := WordWrapChanged;
FBackground := TSynEditBackground.Create;
FBackground.OnChange := BackgroundChanged;
(* end *)
with TSynEditStringList(fLines) do
begin
OnChange := LinesChanged;
OnChanging := LinesChanging;
OnCleared := ListCleared;
OnDeleted := ListDeleted;
OnInserted := ListInserted;
OnPutted := ListPutted;
OnBeforePutted := ListBeforePutted;
OnBeforeDeleted := ListBeforeDeleted;
OnBeforeInserted := ListBeforeInserted;
end;
fFontDummy := TFont.Create;
fUndoList := TSynEditUndoList.Create;
fUndoList.OnAddedUndo := UndoRedoAdded;
fOrigUndoList := fUndoList;
fRedoList := TSynEditUndoList.Create;
fRedoList.OnAddedUndo := UndoRedoAdded;
fOrigRedoList := fRedoList;
{$IFDEF SYN_COMPILER_4_UP}
{$IFDEF SYN_CLX}
{$ELSE}
DoubleBuffered := false;
{$ENDIF}
{$ENDIF}
fSelectedColor := TSynSelectedColor.Create;
fSelectedColor.OnChange := SelectedColorsChanged;
fBookMarkOpt := TSynBookMarkOpt.Create(Self);
fBookMarkOpt.OnChange := BookMarkOptionsChanged;
// fRightEdge has to be set before FontChanged is called for the first time
// fRightEdge := 80;
fGutter := TSynGutter.Create;
fGutter.OnChange := GutterChanged;
fGutterWidth := fGutter.Width;
fTextOffset := fGutterWidth + 2;
{$IFDEF SYN_COMPILER_7_UP}
{$IFNDEF SYN_CLX}
ControlStyle := ControlStyle + [csOpaque, csSetCaption, csNeedsBorderPaint];
{$ELSE}
ControlStyle := ControlStyle + [csOpaque, csSetCaption];
{$ENDIF}
{$ELSE}
ControlStyle := ControlStyle + [csOpaque, csSetCaption];
{$ENDIF}
Height := 150;
Width := 200;
Cursor := crIBeam;
Color := clWindow;
{$IFDEF SYN_WIN32}
fFontDummy.Name := 'Courier New';
fFontDummy.Size := 10;
{$ENDIF}
{$IFDEF SYN_KYLIX}
fFontDummy.Name := 'adobe-courier';
if fFontDummy.Name = 'adobe-courier' then
fFontDummy.Size := 12
else begin
fFontDummy.Name := 'terminal';
fFontDummy.Size := 14;
end;
{$ENDIF}
{$IFDEF SYN_COMPILER_3_UP}
fFontDummy.CharSet := DEFAULT_CHARSET;
{$ENDIF}
fTextDrawer := TheTextDrawer.Create([fsBold], fFontDummy);
Font.Assign(fFontDummy);
Font.OnChange := SynFontChanged;
ParentFont := False;
ParentColor := False;
TabStop := True;
fInserting := True;
fMaxScrollWidth := 1024;
fBorderStyle := bsSingle;
fInsertCaret := ctVerticalLine;
fOverwriteCaret := ctBlock;
FSelectionMode := smNormal;
fFocusList := TList.Create;
fKbdHandler := TSynEditKbdHandler.Create;
fKeystrokes := TSynEditKeyStrokes.Create(Self);
fMarkList := TSynEditMarkList.Create();
fMarkList.OnChange := MarkListChange;
SetDefaultKeystrokes;
{$IFDEF SYN_MBCSSUPPORT}
fImeCount := 0;
fMBCSStepAside := False;
{$ENDIF}
fWantReturns := True;
fWantTabs := False;
fTabWidth := 8;
fLeftChar := 1;
fTopLine := 1;
fCaretX := 1;
fLastCaretX := 1;
fCaretY := 1;
fBlockBegin.Char := 1;
fBlockBegin.Line := 1;
fBlockEnd := fBlockBegin;
fOptions := SYNEDIT_DEFAULT_OPTIONS;
fScrollTimer := TTimer.Create(Self);
fScrollTimer.Enabled := False;
fScrollTimer.Interval := 100;
fScrollTimer.OnTimer := ScrollTimerHandler;
{$IFDEF SYN_CLX}
InputKeys := [ikArrows, ikChars, ikReturns, ikEdit, ikNav, ikEsc];
FHScrollBar := TSynEditScrollbar.Create(self);
FHScrollBar.Kind := sbHorizontal;
FHScrollBar.Height := CYHSCROLL;
FHScrollBar.OnScroll := ScrollEvent;
FVScrollBar := TSynEditScrollbar.Create(self);
FVScrollBar.Kind := sbVertical;
FVScrollBar.Width := CXVSCROLL;
FVScrollBar.OnScroll := ScrollEvent;
// Set parent after BOTH scrollbars are created.
FHScrollBar.Parent := Self;
FHScrollBar.Color := clScrollBar;
FVScrollBar.Parent := Self;
FVScrollBar.Color := clScrollBar;
{$ENDIF}
SynFontChanged(nil);
{$IFDEF CODEFOLDING}
//### Code Folding ###
fHint := TSynCompletionProposal.Create(nil);
with TSynCompletionProposal(fHint) do
begin
DisplayType := ctHint;
TimerInterval := 500;
ClBackground := clInfoBk;
end;
//### End Code Folding ###
{$ENDIF}
end;
{$IFDEF SYN_CLX}
{$ELSE}
procedure TCustomSynEdit.CreateParams(var Params: TCreateParams);
const
BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER);
ClassStylesOff = CS_VREDRAW or CS_HREDRAW;
begin
// Clear WindowText to avoid it being used as Caption, or else window creation will
// fail if it's bigger than 64KB. It's useless to set the Caption anyway.
StrDispose(WindowText);
WindowText := nil;
inherited CreateParams(Params);
with Params do
begin
WindowClass.Style := WindowClass.Style and not ClassStylesOff;
Style := Style or BorderStyles[fBorderStyle] or WS_CLIPCHILDREN;
if NewStyleControls and Ctl3D and (fBorderStyle = bsSingle) then
begin
Style := Style and not WS_BORDER;
ExStyle := ExStyle or WS_EX_CLIENTEDGE;
end;
end;
end;
{$ENDIF}
procedure TCustomSynEdit.DecPaintLock;
var
vAuxPos: TDisplayCoord;
begin
if fPaintLock > 0 then
begin
Dec(fPaintLock);
if (fPaintLock = 0) and HandleAllocated then
begin
if sfScrollbarChanged in fStateFlags then
UpdateScrollbars;
// Locks the caret inside the visi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -