Delphi练习三——文本编辑器

文本编辑器,代码:

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.

运行结果截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值