📄 editor.pas
字号:
unit editor;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls, ComCtrls;
type
TEditForm = class(TForm)
MainMenu: TMainMenu;
EditMdiEdit: TMenuItem;
CutMdiEdit: TMenuItem;
CopyMdiEdit: TMenuItem;
PasteMdiEdit: TMenuItem;
DeleteMdiEdit: TMenuItem;
N3: TMenuItem;
SelectallMdiEdit: TMenuItem;
Character1: TMenuItem;
LeftMdiEdit: TMenuItem;
RightMdiEdit: TMenuItem;
CenterMdiEdit: TMenuItem;
N4: TMenuItem;
WordwrapMdiEdit: TMenuItem;
N5: TMenuItem;
FontMdiEdit: TMenuItem;
Editor: TRichEdit;
PopupMenuMdiEdit: TPopupMenu;
CutPopup: TMenuItem;
CopyPopup: TMenuItem;
PastePopup: TMenuItem;
FontDialogMdiEdit: TFontDialog;
PrintDialogMdiEdit: TPrintDialog;
FindDialogMdiEdit: TFindDialog;
ReplaceDialogMdiEdit: TReplaceDialog;
FindMdiEdit: TMenuItem;
ReplaceMdiEdit: TMenuItem;
N1: TMenuItem;
SaveFileDialogMdiEdit: TSaveDialog;
Save1: TMenuItem;
FileMdiEdit: TMenuItem;
NewMdiEdit: TMenuItem;
OpenMdiEdit: TMenuItem;
CloseMdiEdit: TMenuItem;
SaveMdiEdit: TMenuItem;
SaveAsMdiEdit: TMenuItem;
N2: TMenuItem;
PrintMdiEdit: TMenuItem;
PrinterSetupMdiEdit: TMenuItem;
N6: TMenuItem;
ExitMdiEdit: TMenuItem;
PrinterSetupDialogMdiEdit: TPrinterSetupDialog;
procedure AlignClick(Sender: TObject);
procedure WordwrapMdiEditClick(Sender: TObject);
procedure CutMdiEditClick(Sender: TObject);
procedure CopyMdiEditClick(Sender: TObject);
procedure PasteMdiEditClick(Sender: TObject);
procedure SelectallMdiEditClick(Sender: TObject);
procedure DeleteMdiEditClick(Sender: TObject);
procedure EditMdiEditClick(Sender: TObject);
procedure SaveasMdiEditClick(Sender: TObject);
procedure SaveMdiEditClick(Sender: TObject);
procedure FontMdiEditClick(Sender: TObject);
procedure CloseMdiEditClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure PrintMdiEditClick(Sender: TObject);
procedure FindMdiEditClick(Sender: TObject);
procedure ReplaceMdiEditClick(Sender: TObject);
procedure FindDialogMdiEditFind(Sender: TObject);
procedure ReplaceDialogMdiEditReplace(Sender: TObject);
procedure ReplaceDialogMdiEditFind(Sender: TObject);
procedure PrinterSetupMdiEditClick(Sender: TObject);
procedure NewMdiEditClick(Sender: TObject);
procedure OpenMdiEditClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
CurrentFileName: string;
procedure Open(const AFileName: string);
end;
var
EditForm: TEditForm;
const
DefaultFileName = 'Untitled';
implementation
uses Clipbrd, Printers, Main;
{$R *.DFM}
procedure TEditForm.AlignClick(Sender: TObject);
begin
LeftMdiEdit.Checked := False;
RightMdiEdit.Checked := False;
CenterMdiEdit.Checked := False;
with Sender as TMenuItem do Checked := True;
with Editor.Paragraph do
if LeftMdiEdit.Checked then
Alignment := taLeftJustify
else if RightMdiEdit.Checked then
Alignment := taRightJustify
else if CenterMdiEdit.Checked then
Alignment := taCenter;
end;
procedure TEditForm.WordwrapMdiEditClick(Sender: TObject);
begin
with Editor do
begin
WordWrap := not WordWrap; { toggle word wrapping }
if WordWrap then
ScrollBars := ssVertical
else
ScrollBars := ssBoth;
WordWrapMdiEdit.Checked := WordWrap; { set menu item check }
end;
end;
procedure TEditForm.CutMdiEditClick(Sender: TObject);
begin
Editor.CutToClipboard;
end;
procedure TEditForm.CopyMdiEditClick(Sender: TObject);
begin
Editor.CopyToClipboard;
end;
procedure TEditForm.PasteMdiEditClick(Sender: TObject);
begin
Editor.PasteFromClipboard;
end;
procedure TEditForm.SelectallMdiEditClick(Sender: TObject);
begin
Editor.SelectAll;
end;
procedure TEditForm.DeleteMdiEditClick(Sender: TObject);
begin
Editor.ClearSelection;
end;
procedure TEditForm.EditMdiEditClick(Sender: TObject);
var
HasSelection: Boolean;
begin
PasteMdiEdit.Enabled := Clipboard.HasFormat(CF_TEXT);
PastePopup.Enabled := PasteMdiEdit.Enabled;
HasSelection := Editor.SelLength > 0;
CutMdiEdit.Enabled := HasSelection;
CutPopup.Enabled := HasSelection;
CopyMdiEdit.Enabled := HasSelection;
CopyPopup.Enabled := HasSelection;
DeleteMdiEdit.Enabled := HasSelection;
end;
procedure TEditForm.Open(const AFileName: string);
begin
CurrentFileName := AFileName;
Caption := ExtractFileName(AFileName);
with Editor do
begin
Lines.LoadFromFile(CurrentFileName);
SelStart := 0;
Modified := False;
end;
end;
procedure TEditForm.SaveasMdiEditClick(Sender: TObject);
begin
SaveFileDialogMdiEdit.FileName := CurrentFileName;
if SaveFileDialogMdiEdit.Execute then
begin
CurrentFileName := SaveFileDialogMdiEdit.FileName;
Caption := ExtractFileName(CurrentFileName);
SaveMdiEditClick(Sender);
end;
end;
procedure TEditForm.SaveMdiEditClick(Sender: TObject);
begin
if CurrentFileName = DefaultFileName then
SaveAsMdiEditClick(Sender)
else
begin
Editor.Lines.SaveToFile(CurrentFileName);
Editor.Modified := False;
end;
end;
procedure TEditForm.FontMdiEditClick(Sender: TObject);
begin
FontDialogMdiEdit.Font := Editor.Font;
if FontDialogMdiEdit.Execute then
Editor.SelAttributes.Assign(FontDialogMdiEdit.Font);
end;
procedure TEditForm.CloseMdiEditClick(Sender: TObject);
begin
Close;
end;
procedure TEditForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TEditForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
const
SWarningText = 'Save changes to %s?';
begin
if Editor.Modified then
begin
case MessageDlg(Format(SWarningText, [CurrentFileName]), mtConfirmation,
[mbYes, mbNo, mbCancel], 0) of
idYes: SaveMdiEditClick(Self);
idCancel: CanClose := False;
end;
end;
end;
procedure TEditForm.FormCreate(Sender: TObject);
begin
CurrentFileName := DefaultFileName;
end;
procedure TEditForm.PrintMdiEditClick(Sender: TObject);
var
DistanceLine,Line:Integer;
begin
if PrintDialogMdiEdit.Execute then
begin
Printer.Canvas.font:=Editor.Font;
DistanceLine:=Trunc(1.5*FontDialogMdiEdit.font.size);
Printer.BeginDoc;
for line:=0 to Editor.Lines.Count-1 do
begin
Printer.canvas.textout(0,DistanceLine*Line,Editor.lines[Line]);
end;
Printer.EndDoc;
end;
end;
procedure TEditForm.FindMdiEditClick(Sender: TObject);
begin
FindDialogMdiEdit.Execute;
end;
procedure TEditForm.ReplaceMdiEditClick(Sender: TObject);
begin
ReplaceDialogMdiEdit.Execute;
end;
procedure TEditForm.FindDialogMdiEditFind(Sender: TObject);
var
FoundAt:LongInt;
StartPos, ToEnd:Integer;
begin
with Sender as TFindDialog do
with Editor do
begin
if (SelLength <> 0) Then
if AnsiCompareStr(SelText,FindDialogMdiEdit.FindText)=0 Then
begin
StartPos := SelStart + SelLength;
ToEnd := Length(Text) - StartPos;
end
Else
begin
StartPos := SelStart;
ToEnd := SelLength;
End
else
begin
StartPos := 0;
ToEnd := Length(Text);
end;
if (frMatchCase in FindDialogMdiEdit.Options) And (frWholeWord in FindDialogMdiEdit.Options) Then
FoundAt := FindText(FindDialogMdiEdit.FindText, StartPos, ToEnd, [stWholeWord, stMatchCase])
else if (frMatchCase in FindDialogMdiEdit.Options) Then
FoundAt := FindText(FindDialogMdiEdit.FindText, StartPos, ToEnd, [stMatchCase])
else if (frWholeWord in FindDialogMdiEdit.Options) Then
FoundAt := FindText(FindDialogMdiEdit.FindText, StartPos, ToEnd, [stWholeWord])
else
FoundAt := FindText(FindDialogMdiEdit.FindText, StartPos, ToEnd, []);
if FoundAt <> -1 then
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length(FindDialogMdiEdit.FindText);
end
else
ShowMessage('Cannot Find This String');
end;
end;
procedure TEditForm.ReplaceDialogMdiEditReplace(Sender: TObject);
var
FoundAt:LongInt;
StartPos, ToEnd: Integer;
begin
with ReplaceDialogMdiEdit do
with Editor do
begin
if SelLength <> 0 then
begin
StartPos := SelStart;
ToEnd := SelLength;
end
else
begin
StartPos := 0;
ToEnd := Length(Text);
End;
if (frMatchCase in ReplaceDialogMdiEdit.Options) And (frWholeWord in FindDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stWholeWord, stMatchCase])
else if (frMatchCase in ReplaceDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stMatchCase])
else if (frWholeWord in ReplaceDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stWholeWord])
else
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, []);
If (FoundAt<>-1) and (frReplace in ReplaceDialogMdiEdit.Options) Then
begin
SelStart := FoundAt;
SelLength := Length(ReplaceDialogMdiEdit.FindText);
SelText:=ReplaceDialogMdiEdit.ReplaceText;
end;
while (FoundAt<>-1) and (frReplaceAll in ReplaceDialogMdiEdit.Options) do
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length(ReplaceDialogMdiEdit.FindText);
SelText:=ReplaceDialogMdiEdit.ReplaceText;
ToEnd :=ToEnd - FoundAt + StartPos-Length(ReplaceDialogMdiEdit.ReplaceText)+Length(ReplaceDialogMdiEdit.FindText);
StartPos := FoundAt+Length(ReplaceDialogMdiEdit.ReplaceText);
if (frMatchCase in ReplaceDialogMdiEdit.Options) And (frWholeWord in FindDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stWholeWord, stMatchCase])
else if (frMatchCase in ReplaceDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stMatchCase])
else if (frWholeWord in ReplaceDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stWholeWord])
else
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [])
end;
if (FoundAt=-1) and ( (frReplace in ReplaceDialogMdiEdit.Options) or (frReplaceAll in ReplaceDialogMdiEdit.Options) ) then
ShowMessage('Cannot Find This String');
end;
end;
procedure TEditForm.ReplaceDialogMdiEditFind(Sender: TObject);
Var
FoundAt:LongInt;
StartPos, ToEnd:Integer;
begin
with Sender as TReplaceDialog do
with Editor do
begin
if (SelLength <> 0) Then
if AnsiCompareStr(SelText,ReplaceDialogMdiEdit.FindText)=0 Then
begin
StartPos := SelStart + SelLength;
ToEnd := Length(Text) - StartPos;
end
Else
begin
StartPos := SelStart;
ToEnd := SelLength;
End
else
begin
StartPos := 0;
ToEnd := Length(Text);
end;
if (frMatchCase in ReplaceDialogMdiEdit.Options) And (frWholeWord in FindDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stWholeWord, stMatchCase])
else if (frMatchCase in ReplaceDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stMatchCase])
else if (frWholeWord in ReplaceDialogMdiEdit.Options) Then
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [stWholeWord])
else
FoundAt := FindText(ReplaceDialogMdiEdit.FindText, StartPos, ToEnd, [])
end;
if FoundAt <> -1 then
begin
SetFocus;
Editor.SelStart := FoundAt;
Editor.SelLength := Length(ReplaceDialogMdiEdit.FindText);
end
else
ShowMessage('Cannot Find This String');
end;
procedure TEditForm.PrinterSetupMdiEditClick(Sender: TObject);
begin
PrinterSetupDialogMdiEdit.Execute
end;
procedure TEditForm.NewMdiEditClick(Sender: TObject);
begin
MainForm.FileNew(EditForm);
end;
procedure TEditForm.OpenMdiEditClick(Sender: TObject);
begin
MainForm.FileOpen(EditForm);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -