📄 unotepad.pas
字号:
unit uNotepad;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ComCtrls;
type
TFrmNotepad = class(TForm)
MainMenu1: TMainMenu;
Mn01File: TMenuItem;
Mn02Edit: TMenuItem;
Mn03Format: TMenuItem;
Mn04View: TMenuItem;
Mn05Help: TMenuItem;
Mn11_1New: TMenuItem;
Mn11_2Open: TMenuItem;
Mn11_3Save: TMenuItem;
Mn11_4Saveto: TMenuItem;
Mn11_5: TMenuItem;
Mn11_6Page: TMenuItem;
Mn11_7Print: TMenuItem;
Mn11_8: TMenuItem;
Mn11_9Exit: TMenuItem;
Mn12_1Cancel: TMenuItem;
Mn12_2: TMenuItem;
Mn12_3Cut: TMenuItem;
Mn12_4Copy: TMenuItem;
Mn12_5Plaster: TMenuItem;
Mn12_6Del: TMenuItem;
Mn12_7: TMenuItem;
Mn12_8Lookup: TMenuItem;
Mn12_9LookupNext: TMenuItem;
Mn12_10Replace: TMenuItem;
Mn12_11Goto: TMenuItem;
Mn12_12: TMenuItem;
Mn12_13All: TMenuItem;
Mn12_14Date: TMenuItem;
Mn13_1Newline: TMenuItem;
Mn13_2Font: TMenuItem;
Mn14_1Status: TMenuItem;
Mn15_1Motif: TMenuItem;
Mn15_2: TMenuItem;
Mn15_3About: TMenuItem;
StatusBar: TStatusBar;
RichEdit: TRichEdit;
SaveDialog: TSaveDialog;
OpenDialog: TOpenDialog;
PMnRichEdit: TPopupMenu;
PMnRE01: TMenuItem;
PMnRE02: TMenuItem;
PMnRE03: TMenuItem;
PMnRE04: TMenuItem;
PMnRE05: TMenuItem;
PMnRE06: TMenuItem;
PMnRE07: TMenuItem;
PMnRE08: TMenuItem;
PMnRE09: TMenuItem;
PMnRE010: TMenuItem;
PMnRE011: TMenuItem;
PMnRE012: TMenuItem;
PMnRE112_1: TMenuItem;
PMnRE112_2: TMenuItem;
PMnRE112_3: TMenuItem;
PMnRE112_4: TMenuItem;
PMnRE112_5: TMenuItem;
PMnRE112_6: TMenuItem;
PMnRE112_7: TMenuItem;
PMnRE112_8: TMenuItem;
PMnRE112_9: TMenuItem;
PMnRE112_10: TMenuItem;
PMnRE112_11: TMenuItem;
PMnRE112_12: TMenuItem;
PMnRE112_13: TMenuItem;
PMnRE112_14: TMenuItem;
PMnRE112_15: TMenuItem;
PMnRE112_16: TMenuItem;
PMnRE112_17: TMenuItem;
FontDialog: TFontDialog;
FindDialog: TFindDialog;
ReplaceDialog: TReplaceDialog;
PrinterSetupDialog: TPrinterSetupDialog;
PrintDialog: TPrintDialog;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Mn11_1NewClick(Sender: TObject);
procedure Mn11_2OpenClick(Sender: TObject);
procedure Mn11_3SaveClick(Sender: TObject);
procedure Mn11_4SavetoClick(Sender: TObject);
procedure Mn11_6PageClick(Sender: TObject);
procedure Mn11_7PrintClick(Sender: TObject);
procedure Mn11_9ExitClick(Sender: TObject);
procedure Mn12_1CancelClick(Sender: TObject);
procedure Mn12_3CutClick(Sender: TObject);
procedure Mn12_4CopyClick(Sender: TObject);
procedure Mn12_5PlasterClick(Sender: TObject);
procedure Mn12_6DelClick(Sender: TObject);
procedure Mn12_8LookupClick(Sender: TObject);
procedure Mn12_9LookupNextClick(Sender: TObject);
procedure Mn12_10ReplaceClick(Sender: TObject);
procedure Mn12_11GotoClick(Sender: TObject);
procedure Mn12_13AllClick(Sender: TObject);
procedure Mn12_14DateClick(Sender: TObject);
procedure Mn13_1NewlineClick(Sender: TObject);
procedure Mn13_2FontClick(Sender: TObject);
procedure Mn14_1StatusClick(Sender: TObject);
procedure Mn15_1MotifClick(Sender: TObject);
procedure Mn15_3AboutClick(Sender: TObject);
procedure FindDialogFind(Sender: TObject);
procedure RichEditKeyPress(Sender: TObject; var Key: Char);
procedure Mn02EditClick(Sender: TObject);
procedure ReplaceDialogFind(Sender: TObject);
procedure RichEditMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure RichEditKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
FileStatus : integer;//标志文件是否已经存在,0为不存在或者新建,1为已存在或者编辑
FileIndex : TextFile; //文件指针,有关本文本文件的相关信息
FilePath : string;//文件路径
FileName : string;//文件名
procedure SetCaRichEdit(RichEdit : TRichEdit;var row,col : integer);
public
{ Public declarations }
row : integer;//获得转到的行数
end;
var
FrmNotepad: TFrmNotepad;
implementation
uses uNtpdAboutbox,ShellAPI, uGotorow, search;
{$R *.dfm}
procedure TFrmNotepad.SetCaRichEdit(RichEdit : TRichEdit;var row,col : integer);//将行数转化为具体位置
var
i, iStopLine, iSelStart:integer;
begin
if (RichEdit = nil) then close;
if Row = 0 then Row := 1;
if Col = 0 then Col := 1;
iStopLine := Row - 1;
iSelStart := 0;
for i := 0 to RichEdit.Lines.Count - 1 do
begin
if i = iStopLine then
begin
if Length(RichEdit.Lines[i]) >= Col then
Inc(iSelStart, Col)
else
Inc(iSelStart, Length(RichEdit.Lines[i]) + 2);
Break;
end;
Inc(iSelStart, Length(RichEdit.Lines[i]) + 2);
end;
if iSelStart > 0 then
Dec(iSelStart);
SendMessage(RichEdit.Handle, EM_SETSEL, iSelStart, iSelStart);
Row := SendMessage(RichEdit.Handle, EM_LINEFROMCHAR, RichEdit.SelStart, 0);
Col := RichEdit.SelStart - SendMessage(RichEdit.Handle, EM_LINEINDEX, Row, 0);
SendMessage(RichEdit.Handle, EM_SCROLLCARET, 0, 0);
end;
function LastPos(SubStr,S : string):Integer; //搜索子串在母串中的最后出现的地址
var
Found,SbLen,SLen : integer;//返回的子串位置,子串大小,母串大小
begin
SLen := Length(S);
SbLen := Length(SubStr);
Found := 0;
if SLen<SbLen then
begin
result := 0;
exit;
end;
SLen := SLen-SbLen+1;
while (SLen>0) and (Found=0) do
begin
if Copy(S,SLen,SbLen)=SubStr then
Found := SLen;
Dec(SLen);
end;
LastPos := Found;
end;
function Ntpd_GetFileName(FilePath : string):string; //传入一个文件路径,返回文件名
begin
result := copy(FilePath,LastPos('\',FilePath)+1,length(FilePath)-LastPos('\',FilePath));
end;
procedure TFrmNotepad.FormCreate(Sender: TObject);
begin
FilePath := '无标题';
FileName := '无标题';
end;
procedure TFrmNotepad.FormShow(Sender: TObject);
begin
//
end;
procedure TFrmNotepad.FormClose(Sender: TObject; var Action: TCloseAction);
var
ret : integer;//接收返回值
begin
if RichEdit.Modified = true then
begin
ret := application.MessageBox(pchar('文件 '+FilePath+' 的文字已经改变。'+#13#13+'想保存文件吗?'),'记事本',MB_ICONEXCLAMATION+MB_YESNOCANCEL);
case ret of
6 : if SaveDialog.Execute then
begin
RichEdit.Lines.SaveToFile(SaveDialog.FileName);
exit;
end;
7 : begin
RichEdit.Clear;
exit;
end;
else
exit;
end;
end
else
exit;
end;
procedure TFrmNotepad.Mn11_1NewClick(Sender: TObject); //新建
var
ret : integer;//接收返回值
begin
if RichEdit.Modified = true then
begin
ret := application.MessageBox(pchar('文件 '+FilePath+' 的文字已经改变。'+#13#13+'想保存文件吗?'),'记事本',MB_ICONEXCLAMATION+MB_YESNOCANCEL);
case ret of
6 : if SaveDialog.Execute then
RichEdit.Lines.SaveToFile(SaveDialog.FileName);
7 : RichEdit.Clear;
else
exit;
end;
end;
RichEdit.Clear;
FileName := '无标题';
FilePath := '无标题';
self.Caption := FileName + ' - 记事本';
FileStatus := 0;
end;
procedure TFrmNotepad.Mn11_2OpenClick(Sender: TObject); //打开
var
ret : integer;
begin
if RichEdit.Modified = true then
begin
ret := application.MessageBox(pchar('文件 '+FilePath+' 的文字已经改变。'+#13#13+'想保存文件吗?'),'记事本',MB_ICONEXCLAMATION+MB_YESNOCANCEL);
case ret of
6 : if SaveDialog.Execute then
begin
RichEdit.Lines.SaveToFile(SaveDialog.FileName);
RichEdit.Clear;
end;
7 : begin
RichEdit.Clear;
end;
else
exit;
end;
end
else
RichEdit.Clear;
if OpenDialog.Execute then
begin
RichEdit.Lines.LoadFromFile(OpenDialog.FileName);
RichEdit.Modified := false;
FilePath := OpenDialog.FileName;
FileName := Ntpd_GetFileName(FilePath);
self.Caption := FileName + ' - 记事本';
end;
end;
procedure TFrmNotepad.Mn11_3SaveClick(Sender: TObject);//保存
begin
if FileStatus = 0 then //文件不存在时
begin
if SaveDialog.Execute then //且确认保存
begin
RichEdit.Lines.SaveToFile(SaveDialog.FileName);
FilePath := SaveDialog.FileName;
FileName := Ntpd_GetFileName(FilePath);
FileStatus := 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -