文本编辑器,代码:
unit Unit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,Menus,StdCtrls,ComCtrls,ImgList,ToolWin,ExtCtrls;
type
TfrmMainForm = class(TForm)
mmMenuBar: TMainMenu;
dlgOpenFile: TOpenDialog;
dlgSaveFile: TSaveDialog;
dlgColor: TColorDialog;
dlgFont: TFontDialog;
dlgFindText: TFindDialog;
dlgReplaceText: TReplaceDialog;
dlgPnt: TPrintDialog;
PrinterSetupDialog1: TPrinterSetupDialog;
mniFile: TMenuItem;
mniFileOpen: TMenuItem;
mniFileSave: TMenuItem;
N1: TMenuItem;
mniFileExit: TMenuItem;
mniFormat: TMenuItem;
mniEditFormatAlign: TMenuItem;
mniEditFormatBold: TMenuItem;
mniTool: TMenuItem;
mniToolHide: TMenuItem;
mniToolOption: TMenuItem;
mniEdit: TMenuItem;
mniEditUndo: TMenuItem;
N4: TMenuItem;
mniEditCut: TMenuItem;
mniEditCopy: TMenuItem;
mniEditPaste: TMenuItem;
mniEditDelete: TMenuItem;
N5: TMenuItem;
mniEditFind: TMenuItem;
mniEditFindNext: TMenuItem;
mniEditReplace: TMenuItem;
mniEditGoto: TMenuItem;
N8: TMenuItem;
mniEditSelectAll: TMenuItem;
mniEditTimeDate: TMenuItem;
mniFileNew: TMenuItem;
mniFileSaveAs: TMenuItem;
N12: TMenuItem;
mniFilePageSet: TMenuItem;
mniFilePrint: TMenuItem;
mniHelp: TMenuItem;
mniHelpHelp: TMenuItem;
mniHelpAbout: TMenuItem;
mmoEditArea: TMemo;
stat: TStatusBar;
mniAlignLeft: TMenuItem;
mniAlignRight: TMenuItem;
mniAlignCenter: TMenuItem;
N2: TMenuItem;
mniFormartFont: TMenuItem;
mniFormartAutoWrap: TMenuItem;
V1: TMenuItem;
mniViewBackColor: TMenuItem;
mniViewLarger: TMenuItem;
mniViewSmaller: TMenuItem;
ilButton: TImageList;
tlbToolBar: TToolBar;
btnFileNew: TToolButton;
btnFileOpen: TToolButton;
btnFileSave: TToolButton;
btnEditCut: TToolButton;
btnEditCopy: TToolButton;
btnEditPaste: TToolButton;
btnFind: TToolButton;
btnFindReplace: TToolButton;
tmr: TTimer;
procedure mniFileOpenClick(Sender: TObject);
procedure frmMainFormShow(Sender: TObject);
procedure mniFileSaveClick(Sender: TObject);
procedure mniFileSaveAsClick(Sender: TObject);
procedure mniFileNewClick(Sender: TObject);
procedure mniFileExitClick(Sender: TObject);
procedure mniEditUndoClick(Sender: TObject);
procedure mniEditSelectAllClick(Sender: TObject);
procedure mniEditCopyClick(Sender: TObject);
procedure mniEditPasteClick(Sender: TObject);
procedure mniEditCutClick(Sender: TObject);
procedure mniEditDeleteClick(Sender: TObject);
procedure mniAlignLeftClick(Sender: TObject);
procedure mniAlignCenterClick(Sender: TObject);
procedure mniAlignRightClick(Sender: TObject);
procedure mniEditFormatBoldClick(Sender: TObject);
procedure mniToolHideClick(Sender: TObject);
procedure mniFormartAutoWrapClick(Sender: TObject);
procedure mniFormartFontClick(Sender: TObject);
procedure mniViewBackColorClick(Sender: TObject);
procedure mniViewLargerClick(Sender: TObject);
procedure mniViewSmallerClick(Sender: TObject);
procedure mniFilePrintClick(Sender: TObject);
procedure mniEditFindClick(Sender: TObject);
procedure dlgFindTextFind(Sender: TObject);
procedure mniEditReplaceClick(Sender: TObject);
procedure dlgReplaceTextFind(Sender: TObject);
procedure dlgReplaceTextReplace(Sender: TObject);
procedure tmrTimer(Sender: TObject);
procedure mmoEditAreaMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
procedure mmoEditAreaKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure SetControlsEnableORVisibleTrue;
procedure GetSursorPosition;
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMainForm: TfrmMainForm;
implementation
{$R *.dfm}
//打开文件菜单命令
procedure TfrmMainForm.mniFileOpenClick(Sender: TObject);
var
Res: Integer;
begin
{ 打开一个文件,先检查当前文件是否已经保存,如果没有保存
弹出提示消息,是否保存,选择“是”则保存当前文件
选择“否”则忽略保存当前文件 }
//文件被修改
if mmoEditArea.Modified then
begin
Res := Application.MessageBox('当前文件已经被更改,是否要保存更改?',
'文本编辑器 提示信息',MB_YESNOCANCEL);
//保存
if Res = IDYES then
mniFileSaveClick(Sender);
//取消
if Res = IDCANCEL then
Exit;
end;
{ 执行“打开文件对话框”选择要打开的文件
点击“确定”后,用LoadFromFile方法打开文件,
首先,清除FileName属性}
dlgOpenFile.Filter := '文本文档(*.txt)|*.txt|所有文件(*.*)|*.*';
dlgOpenFile.DefaultExt := 'txt';
//隐藏只读文件,输入的文件名(路径名)必须存在
dlgOpenFile.Options := [ofHideReadOnly,ofFileMustExist,ofPathMustExist];
dlgOpenFile.FileName := '';
if dlgOpenFile.Execute then
begin
//清除上一个文本文件的内容(如果有)
if mmoEditArea.Lines.Count > 0 then
mmoEditArea.Clear;
//显示要打开的文本文件的内容
//扩展:设置某些规则,对不满足规则的文件进行过滤,并对不符合的文件进行提示,例如试图打开二进制文件时
if ofExtensionDifferent in dlgOpenFile.Options then
begin
MessageDlg('请选择可编辑的文本文件',mtError, [mbOK],0);
Exit;
end
else
begin
frmMainForm.Caption := '文本编辑器 ' + dlgOpenFile.FileName;
mmoEditArea.Lines.LoadFromFile(dlgOpenFile.FileName);
end;
// 设置保存文件对话框的文件名为打开的文件的文件名
dlgSaveFile.FileName := dlgOpenFile.FileName;
end;
//激活文件保存和另存为菜单项
SetControlsEnableORVisibleTrue;
end;
//窗体显示事件处理过程
procedure TfrmMainForm.frmMainFormShow(Sender: TObject);
begin
//冻结文件保存和另存为菜单项
mniFileSave.Enabled := False;
mniFileSaveAs.Enabled := False;
mniFormat.Enabled := False;
mmoEditArea.Enabled := False;
end;
//保存文件菜单命令
procedure TfrmMainForm.mniFileSaveClick(Sender: TObject);
begin
{ 先判断SaveDialog.FileName属性是否为空,
如果不为空,则直接调用SaveToFile方法,否则调用SaveDialog对话框保存}
//如果打开某一文件,则没有另存为的情况,如果是新建的文件,则可能出现momo中的文本并没有保存到文件中的情况,因此需要判断,并根据情况调用另存为
if dlgSaveFile.FileName <> '' then
begin
//保存到指定文本文件中
mmoEditArea.Lines.SaveToFile(dlgSaveFile.FileName);
{ 设置Memo.Modified为False,一旦保存完成的话}
mmoEditArea.Modified := False;
end
else
{ 如果FileName属性为空,则调用另存为对话框}
mniFileSaveAsClick(Sender);
end;
//文件另存为菜单项单击事件处理过程
procedure TfrmMainForm.mniFileSaveAsClick(Sender: TObject);
begin
{ 显示SaveDialog对话框保存文件,
并且设置Memo.Modified为False,一旦保存完成}
dlgSaveFile.Title := 'Save As...';
if dlgSaveFile.Execute then
begin
mmoEditArea.Lines.SaveToFile(dlgSaveFile.FileName);
mmoEditArea.Modified := False;
end;
end;
//"新建"文件菜单项事件处理过程
procedure TfrmMainForm.mniFileNewClick(Sender: TObject);
var
Res: Integer;
begin
{ 新建一个文件,先检查当前文件是否已经保存,如果没有保存
则提示消息,是否保存,选择“是”则保存当前文件
选择“否”则忽略保存当前文件 }
if mmoEditArea.Modified then
begin
Res := Application.MessageBox('当前文件已经被更改,是否要保存更改?',
'文本编辑器 提示信息',MB_YESNOCANCEL);
{ 如果点击“是”则先保存当前的文件}
if Res = IDYES then
mniFileSaveClick(Sender);
{ 如果点击“取消”则什么也不做}
if Res = IDCancel then
Exit;
end;
{ 删除Memo已有的字符}
if mmoEditArea.Lines.Count > 0 then
mmoEditArea.Clear;
{ 设置SaveDialog的FileName属性为空字符串,
为的是让我们知道文件还没有存储 }
dlgSaveFile.FileName := '';
SetControlsEnableORVisibleTrue;
end;
//"文件-退出"菜单项事件处理过程
procedure TfrmMainForm.mniFileExitClick(Sender: TObject);
var
Res: Integer;
begin
if mmoEditArea.Modified then
begin
Res := Application.MessageBox('当前文件已经被更改,是否要保存更改?',
'文本编辑器 提示信息',MB_YESNOCANCEL);
{ 如果点击“是”则先保存当前的文件}
if Res = IDYES then
mniFileSaveClick(Sender);
{ 如果点击“取消”则什么也不做}
if Res = IDCancel then
Exit;
end;
Close;
end;
//“撤销”菜单项点击事件处理过程
procedure TfrmMainForm.mniEditUndoClick(Sender: TObject);
begin
{ TMemo组件没有提供Undo撤销方法,
因此只能通过发送WM_UNDO消息来实现}
SendMessage(mmoEditArea.Handle,WM_UNDO,0,0);
end;
//“全选”菜单项点击事件处理过程
procedure TfrmMainForm.mniEditSelectAllClick(Sender: TObject);
begin
{ 调用Memo.SelectAll方法实现全选功能}
mmoEditArea.SelectAll;
end;
//“复制”菜单项点击事件处理过程
procedure TfrmMainForm.mniEditCopyClick(Sender: TObject);
begin
{ 调用Memo.CopyToClipboard方法}
mmoEditArea.CopyToClipboard;
end;
//“粘贴”菜单项点击事件处理过程
procedure TfrmMainForm.mniEditPasteClick(Sender: TObject);
begin
{ 调用Memo.PasteFromClipboard方法}
mmoEditArea.PasteFromClipboard;
end;
//“编辑-剪切”菜单项事件处理过程
procedure TfrmMainForm.mniEditCutClick(Sender: TObject);
begin
mmoEditArea.CutToClipboard;
end;
//“编辑-删除”菜单项事件处理过程
procedure TfrmMainForm.mniEditDeleteClick(Sender: TObject);
begin
mmoEditArea.ClearSelection;
end;
//“格式-对齐-左对齐”
procedure TfrmMainForm.mniAlignLeftClick(Sender: TObject);
begin
mmoEditArea.Alignment := taLeftJustify;
end;
//“格式-对齐-居中”
procedure TfrmMainForm.mniAlignCenterClick(Sender: TObject);
begin
mmoEditArea.Alignment := taCenter;
end;
//“格式 - 对齐 - 右对齐”
procedure TfrmMainForm.mniAlignRightClick(Sender: TObject);
begin
mmoEditArea.Alignment := taRightJustify;
end;
//"格式-加粗"
procedure TfrmMainForm.mniEditFormatBoldClick(Sender: TObject);
begin
mmoEditArea.Font.Style := [fsBold];
end;
procedure TfrmMainForm.mniToolHideClick(Sender: TObject);
begin
if mniToolHide.Caption = '隐藏(&H)' then
begin
mniToolHide.Caption := '显示(&S)';
end
else
begin
mniToolHide.Caption := '隐藏(&H)';
end;
// mniToolOption.Visible := not mniToolOption.Visible;
mniToolOption.Enabled := not mniToolOption.Enabled;
end;
//“格式-自动换行”
procedure TfrmMainForm.mniFormartAutoWrapClick(Sender: TObject);
begin
{ 设置Memo.WordWrap属性来实现自动换行功能。}
mmoEditArea.WordWrap := not mmoEditArea.WordWrap;
//菜单项显示更改
mniFormartAutoWrap.Checked := mmoEditArea.WordWrap;
//自动换行,滚动条设置为竖直(不需要水平滚动条)
if mmoEditArea.WordWrap then
mmoEditArea.ScrollBars := ssVertical
else
mmoEditArea.ScrollBars := ssBoth;
end;
//“格式-字体”
procedure TfrmMainForm.mniFormartFontClick(Sender: TObject);
begin
with dlgFont do
begin
Font := mmoEditArea.Font;
if Execute then
mmoEditArea.Font := Font;
end;
end;
//"视图-背景色"
procedure TfrmMainForm.mniViewBackColorClick(Sender: TObject);
begin
with dlgColor do
begin
Color := mmoEditArea.Color;
if Execute then
mmoEditArea.Color := Color;
end;
end;
//“视图-放大”
procedure TfrmMainForm.mniViewLargerClick(Sender: TObject);
begin
mmoEditArea.Font.Size := mmoEditArea.Font.Size + 3;
end;
//“视图-缩小”
procedure TfrmMainForm.mniViewSmallerClick(Sender: TObject);
begin
mmoEditArea.Font.Size := mmoEditArea.Font.Size - 3;
end;
//“文件-打印”
procedure TfrmMainForm.mniFilePrintClick(Sender: TObject);
begin
//todo
dlgPnt.Execute;
end;
//激活控件或者设置控件为可见
procedure TfrmMainForm.SetControlsEnableORVisibleTrue;
begin
mmoEditArea.Enabled := True;
mniFileSave.Enabled := True;
mniFileSaveAs.Enabled := True;
mniFormat.Enabled := True;
end;
//"编辑-查找"
procedure TfrmMainForm.mniEditFindClick(Sender: TObject);
begin
with dlgFindText do
begin
OnFind := dlgFindTextFind;
Execute;
end;
end;
//查找
procedure TfrmMainForm.dlgFindTextFind(Sender: TObject);
var
FoundPos,InitPos: integer;
begin
//选中部分,开始+长度
InitPos := mmoEditArea.SelStart + mmoEditArea.SelLength;
FoundPos := Pos(dlgFindText.FindText,Copy(mmoEditArea.Text,InitPos + 1,Length(mmoEditArea.Text) - InitPos));
if FoundPos > 0 then
begin
mmoEditArea.SetFocus;
mmoEditArea.SelStart := InitPos + FoundPos - 1;
mmoEditArea.SelLength := Length(dlgFindText.FindText);
end
else
begin
Messagedlg('没有找到要查找的文本!',mtInformation, [mbOK],0);
end;
end;
//“编辑-替换”
procedure TfrmMainForm.mniEditReplaceClick(Sender: TObject);
begin
with dlgReplaceText do
begin
OnFind := dlgReplaceTextFind;
Execute;
end;
end;
//“替换对话框”查找要替换的词
procedure TfrmMainForm.dlgReplaceTextFind(Sender: TObject);
var
FoundPos,InitPos: integer;
begin
//选中内容的开始索引+长度(结束索引),当前内容的结束,下一次查找范围的开始
InitPos := mmoEditArea.SelStart + mmoEditArea.SelLength;
FoundPos := Pos(dlgReplaceText.FindText,Copy(mmoEditArea.Text,InitPos + 1,Length(mmoEditArea.Text) - InitPos));
if FoundPos > 0 then
begin
//设置要替换的词(查找到的词)
mmoEditArea.SetFocus;
//选中内容的开始索引和长度
mmoEditArea.SelStart := InitPos + FoundPos - 1;
mmoEditArea.SelLength := Length(dlgReplaceText.FindText);
end
else
begin
Messagedlg('没有找到要查找的文本!',mtInformation, [mbOK],0);
end;
end;
//“替换对话框”进行替换
procedure TfrmMainForm.dlgReplaceTextReplace(Sender: TObject);
begin
//用替换对话框中“替换”文本框中的词替换选中的内容
mmoEditArea.SelText := dlgReplaceText.ReplaceText;
//替换后继续查找下一个可供替换的词
dlgReplaceTextFind(self);
end;
//Timer事件处理过程,修改状态栏中显示的系统时间
procedure TfrmMainForm.tmrTimer(Sender: TObject);
begin
stat.Panels.Items[1].Text := TimeToStr(Time);
end;
//Momo鼠标按下
procedure TfrmMainForm.mmoEditAreaMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
GetSursorPosition;
end;
//Momo键盘按下
procedure TfrmMainForm.mmoEditAreaKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
GetSursorPosition;
end;
//获取光标位置
procedure TfrmMainForm.GetSursorPosition;
var
Lpos,Cpos: Integer;
begin
// 行
Lpos := SendMessage(mmoEditArea.Handle,EM_LINEFROMCHAR,
mmoEditArea.SelStart,0);
// 列
Cpos := SendMessage(mmoEditArea.Handle,EM_LINEINDEX,Lpos,
0);
Cpos := mmoEditArea.SelStart - CPos;
//从开始到光标处的字符数
//mmoEditArea.SelStart
stat.Panels.Items[3].Text := '第' + IntToStr(Lpos) + '行,第' + IntToStr(Cpos) + '列';
end;
end.
运行结果截图: