📄 remain.pas
字号:
procedure TMainForm.FileSaveSelected(Sender: TObject);
begin
if SaveDialog.Execute then begin
with Editor do
try
StreamMode := [smSelection];
Lines.SaveToFile(SaveDialog.FileName);
finally
StreamMode := [];
end;
RichEditChange(nil);
end;
FocusEditor;
end;
procedure TMainForm.FilePrint(Sender: TObject);
begin
if PrintDialog.Execute then Editor.Print(FFileName);
end;
procedure TMainForm.FileExit(Sender: TObject);
begin
Close;
end;
procedure TMainForm.EditUndo(Sender: TObject);
begin
Editor.Undo;
RichEditChange(nil);
SelectionChange(nil);
end;
procedure TMainForm.EditRedo(Sender: TObject);
begin
Editor.Redo;
RichEditChange(nil);
SelectionChange(nil);
end;
procedure TMainForm.EditCut(Sender: TObject);
begin
Editor.CutToClipboard;
end;
procedure TMainForm.EditCopy(Sender: TObject);
begin
Editor.CopyToClipboard;
end;
procedure TMainForm.EditPaste(Sender: TObject);
begin
Editor.PasteFromClipboard;
end;
procedure TMainForm.EditPasteSpecialClick(Sender: TObject);
begin
try
Editor.PasteSpecialDialog;
finally
FocusEditor;
end;
end;
procedure TMainForm.HelpAbout(Sender: TObject);
begin
WinAbout('RichEdit 2.0 Control Demo', 'RX Library Demo Program');
FocusEditor;
end;
procedure TMainForm.SelectFont(Sender: TObject);
begin
FontDialog.Font.Assign(Editor.SelAttributes);
if FontDialog.Execute then CurrText.Assign(FontDialog.Font);
FocusEditor;
end;
procedure TMainForm.RulerResize(Sender: TObject);
begin
RulerLine.Width := Ruler.ClientWidth - (RulerLine.Left * 2);
end;
procedure TMainForm.FormResize(Sender: TObject);
begin
SetEditRect;
SelectionChange(Sender);
end;
procedure TMainForm.FormPaint(Sender: TObject);
begin
SetEditRect;
end;
procedure TMainForm.BoldButtonClick(Sender: TObject);
begin
if FUpdating then Exit;
if BoldBtn.Down then
CurrText.Style := CurrText.Style + [fsBold]
else
CurrText.Style := CurrText.Style - [fsBold];
end;
procedure TMainForm.ItalicButtonClick(Sender: TObject);
begin
if FUpdating then Exit;
if ItalicBtn.Down then
CurrText.Style := CurrText.Style + [fsItalic]
else
CurrText.Style := CurrText.Style - [fsItalic];
end;
procedure TMainForm.UnderlineButtonClick(Sender: TObject);
begin
if FUpdating then Exit;
if UnderlineBtn.Down then
CurrText.Style := CurrText.Style + [fsUnderline]
else
CurrText.Style := CurrText.Style - [fsUnderline];
end;
procedure TMainForm.SubscriptClick(Sender: TObject);
begin
if FUpdating then Exit;
if SuperscriptBtn.Down then
CurrText.SubscriptStyle := ssSuperscript
else if SubscriptBtn.Down then
CurrText.SubscriptStyle := ssSubscript
else
CurrText.SubscriptStyle := ssNone;
end;
procedure TMainForm.FontSizeChange(Sender: TObject);
begin
if FUpdating then Exit;
if FontSize.AsInteger > 0 then CurrText.Size := FontSize.AsInteger;
end;
procedure TMainForm.AlignButtonClick(Sender: TObject);
begin
if FUpdating then Exit;
Editor.Paragraph.Alignment := TParaAlignment(TComponent(Sender).Tag);
end;
procedure TMainForm.FontNameChange(Sender: TObject);
begin
if FUpdating then Exit;
CurrText.Name := FontName.FontName;
end;
procedure TMainForm.BulletsButtonClick(Sender: TObject);
begin
if FUpdating then Exit;
Editor.Paragraph.Numbering := TRxNumbering(BulletsBtn.Down);
end;
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
try
CheckFileSave;
except
CanClose := False;
end;
end;
{ Ruler Indent Dragging }
procedure TMainForm.CalcLineOffset(Control: TControl);
var
P: TPoint;
begin
with Control do P := ClientToScreen(Point(0, 0));
P := Editor.ScreenToClient(P);
FLineOfs := P.X + FDragOfs;
end;
procedure TMainForm.RulerItemMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDragOfs := (TControl(Sender).Width div 2);
TControl(Sender).Left := Max(0, TControl(Sender).Left + X - FDragOfs);
FLineDC := GetDCEx(Editor.Handle, 0, DCX_CACHE or DCX_CLIPSIBLINGS
or DCX_LOCKWINDOWUPDATE);
FLinePen := SelectObject(FLineDC, CreatePen(PS_DOT, 1, ColorToRGB(clWindowText)));
SetROP2(FLineDC, R2_XORPEN);
CalcLineOffset(TControl(Sender));
DrawLine;
FDragging := True;
end;
procedure TMainForm.RulerItemMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if FDragging then begin
DrawLine;
TControl(Sender).Left := Min(Max(0, TControl(Sender).Left + X - FDragOfs),
Ruler.ClientWidth - FDragOfs * 2);
CalcLineOffset(TControl(Sender));
DrawLine;
end;
end;
procedure TMainForm.FirstIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDragging := False;
Editor.Paragraph.FirstIndent := Max(0, RulerToIndent(FirstInd.Left + FDragOfs,
False));
LeftIndMouseUp(Sender, Button, Shift, X, Y);
end;
procedure TMainForm.LeftIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDragging := False;
if FLineVisible then DrawLine;
DeleteObject(SelectObject(FLineDC, FLinePen));
ReleaseDC(Editor.Handle, FLineDC);
Editor.Paragraph.LeftIndent := Max(-Editor.Paragraph.FirstIndent,
RulerToIndent(LeftInd.Left + FDragOfs, False) -
Editor.Paragraph.FirstIndent);
SelectionChange(Sender);
end;
procedure TMainForm.RightIndMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDragging := False;
if FLineVisible then DrawLine;
DeleteObject(SelectObject(FLineDC, FLinePen));
ReleaseDC(Editor.Handle, FLineDC);
Editor.Paragraph.RightIndent := Max(0, RulerToIndent(RightInd.Left + FDragOfs,
True));
SelectionChange(Sender);
end;
procedure TMainForm.UpdateCursorPos;
var
CharPos: TPoint;
begin
CharPos := Editor.CaretPos;
StatusBar.Panels[0].Text := Format('Line: %3d Col: %3d',
[CharPos.Y + 1, CharPos.X + 1]);
{ update the status of the cut and copy command }
CopyBtn.Enabled := Editor.SelLength > 0;
EditCopyItem.Enabled := CopyBtn.Enabled;
CopyItm.Enabled := CopyBtn.Enabled;
CutBtn.Enabled := EditCopyItem.Enabled;
CutItm.Enabled := CutBtn.Enabled;
FileSaveSelItem.Enabled := CopyBtn.Enabled;
EditCutItem.Enabled := EditCopyItem.Enabled;
EditObjPropsItem.Enabled := Editor.SelectionType = [stObject];
end;
procedure TMainForm.FormShow(Sender: TObject);
var
Res: TResourceStream;
begin
UpdateCursorPos;
DragAcceptFiles(Handle, True);
RichEditChange(nil);
FocusEditor;
ClipboardChanged(nil);
{ check if we should load a file from the command line }
if (ParamCount > 0) and FileExists(ParamStr(1)) then
PerformFileOpen(ParamStr(1))
else begin
StartWait;
try
Res := TResourceStream.Create(HInstance, 'RX.RTF', 'RTF');
try
Editor.Lines.LoadFromStream(Res);
SetFileName('Untitled');
Editor.Modified := False;
SetModified(False);
finally
Res.Free;
end;
except
{ ignore exceptions }
end;
StopWait;
end;
end;
procedure TMainForm.WMDropFiles(var Msg: TWMDropFiles);
var
CFileName: array[0..MAX_PATH] of Char;
begin
try
if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then begin
Application.BringToFront;
CheckFileSave;
PerformFileOpen(CFileName);
Msg.Result := 0;
end;
finally
DragFinish(Msg.Drop);
end;
end;
procedure TMainForm.RichEditChange(Sender: TObject);
begin
SetModified(Editor.Modified);
{ Undo }
UndoBtn.Enabled := Editor.CanUndo;
EditUndoItem.Enabled := UndoBtn.Enabled;
EditUndoItem.Caption := '&Undo ' + UndoNames[Editor.UndoName];
{ Redo }
EditRedoItem.Enabled := Editor.CanRedo;
RedoBtn.Enabled := EditRedoItem.Enabled;
EditRedoItem.Caption := '&Redo ' + UndoNames[Editor.RedoName];
end;
procedure TMainForm.SetModified(Value: Boolean);
begin
if Value then StatusBar.Panels[1].Text := 'Modified'
else StatusBar.Panels[1].Text := '';
end;
procedure TMainForm.ClipboardChanged(Sender: TObject);
var
E: Boolean;
begin
{ check to see if we can paste what's on the clipboard }
E := Editor.CanPaste;
PasteBtn.Enabled := E;
EditPasteItem.Enabled := E;
EditPasteSpecial.Enabled := E;
PasteItm.Enabled := E;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
{ remove ourselves from the viewer chain }
FClipboardMonitor.Free;
end;
procedure TMainForm.InsertObject(Sender: TObject);
begin
Editor.InsertObjectDialog;
end;
procedure TMainForm.EditObjPropsItemClick(Sender: TObject);
begin
Editor.ObjectPropertiesDialog;
end;
procedure TMainForm.InsertBitmap(Sender: TObject);
var
Pict: TPicture;
begin
with FOpenPictureDialog do begin
if Execute then begin
Pict := TPicture.Create;
try
Pict.LoadFromFile(FileName);
Clipboard.Assign(Pict);
Editor.PasteFromClipboard;
finally
Pict.Free;
end;
end;
end;
end;
procedure TMainForm.FormatParaAttributes(Sender: TObject);
begin
FormatParagraph(Editor.Paragraph);
FocusEditor;
end;
procedure TMainForm.EditorURLClick(Sender: TObject; const URLText: String;
Button: TMouseButton);
begin
if Button = mbLeft then
ShellExecute(Handle, nil, PChar(URLText), nil, nil, SW_SHOW);
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
FocusEditor;
end;
procedure TMainForm.EditFindClick(Sender: TObject);
begin
with Editor do FindDialog(SelText);
end;
procedure TMainForm.EditFindNextItemClick(Sender: TObject);
begin
if not Editor.FindNext then Beep;
FocusEditor;
end;
procedure TMainForm.EditReplaceClick(Sender: TObject);
begin
with Editor do ReplaceDialog(SelText, '');
end;
procedure TMainForm.EditorTextNotFound(Sender: TObject;
const FindText: string);
begin
MessageDlg(Format('Text "%s" not found.', [FindText]), mtWarning,
[mbOk], 0);
end;
procedure TMainForm.EditFindDialogClose(Sender: TObject; Dialog: TFindDialog);
begin
FocusEditor;
end;
procedure TMainForm.MainMenuGetImageIndex(Sender: TMenu; Item: TMenuItem;
State: TMenuOwnerDrawState; var ImageIndex: Integer);
begin
if Item.Tag >= 0 then ImageIndex := Item.Tag;
end;
procedure TMainForm.MainMenuMeasureItem(Sender: TMenu; Item: TMenuItem;
var Width, Height: Integer);
begin
if Item.Caption <> '-' then Height := 19;
end;
procedure TMainForm.EditPopupMenuGetImageIndex(Sender: TMenu;
Item: TMenuItem; State: TMenuOwnerDrawState; var ImageIndex: Integer);
begin
if (Item = CutItm) or (Item = CopyItm) or (Item = PasteItm) then
ImageIndex := Item.Tag;
end;
procedure TMainForm.ColorMenuPopup(Sender: TObject);
var
I: Integer;
C: TColor;
begin
C := CurrText.Color;
for I := 0 to 16 do
ColorMenu.Items[I].Checked := (C = ColorValues[I]);
end;
procedure TMainForm.BackgroundMenuPopup(Sender: TObject);
var
I: Integer;
C: TColor;
begin
C := CurrText.BackColor;
for I := 0 to 16 do
BackgroundMenu.Items[I].Checked := (C = BackValues[I]);
end;
procedure TMainForm.ColorItemClick(Sender: TObject);
begin
with Sender as TMenuItem do begin
Checked := True;
CurrText.Color := Tag;
end;
end;
procedure TMainForm.BackgroundItemClick(Sender: TObject);
begin
with Sender as TMenuItem do begin
Checked := True;
CurrText.BackColor := Tag;
end;
end;
procedure TMainForm.ColorMenuDrawItem(Sender: TMenu; Item: TMenuItem;
Rect: TRect; State: TMenuOwnerDrawState);
begin
TRxPopupMenu(Sender).DefaultDrawItem(Item, Rect, State);
Inc(Rect.Left, LoWord(GetMenuCheckMarkDimensions) + 6);
Rect.Right := Rect.Left + 20;
InflateRect(Rect, 0, -3);
with TRxPopupMenu(Sender).Canvas do begin
Brush.Color := clMenuText;
FrameRect(Rect);
InflateRect(Rect, -1, -1);
Brush.Color := Item.Tag;
FillRect(Rect);
end;
end;
procedure TMainForm.ProtectedItemClick(Sender: TObject);
begin
if FUpdating then Exit;
FProtectChanging := True;
try
CurrText.Protected := not CurrText.Protected;
ProtectedItem.Checked := CurrText.Protected;
finally
FProtectChanging := False;
end;
end;
procedure TMainForm.DisabledItemClick(Sender: TObject);
begin
if FUpdating then Exit;
CurrText.Disabled := not CurrText.Disabled;
DisabledItem.Checked := CurrText.Disabled;
end;
procedure TMainForm.HiddenItemClick(Sender: TObject);
begin
if FUpdating then Exit;
CurrText.Hidden := not CurrText.Hidden;
HiddenItem.Checked := CurrText.Hidden;
end;
procedure TMainForm.EditorProtectChange(Sender: TObject; StartPos,
EndPos: Integer; var AllowChange: Boolean);
begin
AllowChange := FProtectChanging;
end;
procedure TMainForm.EditSelectAll(Sender: TObject);
begin
Editor.SelectAll;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -