zoukankan      html  css  js  c++  java
  • Delphi Menu Designer(菜单设计器)之二

    接着上一讲,我们继续我们的ScratchPad程序的继续编写。

    编写代码

    有了所有这些菜单项但没有代码使它工作。要有大量工作来完成这些,实际上很容易。大多数所需代码使TMemo类已有的部分。所要做的是在菜单处理程序中调用TMemo方法。还要做一些其他的事情,但增加的大部分代码是以前见过的。

    1、增加组件到窗体

    在编写代码之前,需要在增加OpenDialog与SaveDialog组件到窗体:

    (1)把OpenDialog组件放到窗体上,将其Name属性改为OpenDialog

    (2)把SaveDialog组件放到窗体上,将其Name属性改为SaveDialog

    (3)把MainMenu、OpenDialog与SaveDialog图标在窗体上排成一行。

    0165

    2、写主菜单项的代码

    上面的添加组件非常简单。现在继续给菜单项写代码。开始,我先编写【File | Exit】菜单项代码(这是最容易的!)。要保证Menu Designer已经关闭,不至于混淆Menu Designer和Form Designer。

    (1)从Form Designer主菜单选择【File | Exit】,Code Editor会出现在前端,并且显示FileExitClick事件处理程序。

    (2)光标已经定位在FileExitClick事件处理程序中,在光标处键入代码:

    procedure TMainForm.FileExitClick(Sender: TObject);
    begin
      Close;
    end;

    Note

    上面的2步里面用了Close来关闭窗体。因为这是应用程序的主窗体,它是有效的。若想从程序的任意地方中断应用程序,应使用:

      Application.Terminate;

    这个代码保证程序是中断的,不管当前哪个窗体是开的。

    就是这样容易。在做一个,让读者自己完成其余部分。

    (1)从主菜单选择【Edit | Cut】,Code Editor出现在顶端,并显示EditCutClick事件处理程序。

    (2)输入以下代码:

    procedure TMainForm.EditCutClick(Sender: TObject);
    begin
      Memo.CutToClipboard;
    end;

    对于Cut菜单就是这样一句话就搞定了,也许没有全部意识到这点,VCL在幕后做了许多工作。框架的整个思想使程序员避免低水平的细节负担。

    3、结尾工作

    像Delphi那样的程序有趣的一个方面是很少看到整个程序。Delphi方面地提供了自理具体事件的代码段,因此通常看到的是程序小块。下面的清单中显示ScratchPad程序到此为止的主窗体单元。类声明完全由Delphi产生。遵循刚做的例子来写其余的菜单项代码。

    4、详细解释和说明

    【File | New】菜单项代码

    procedure TMainForm.FileNewClick(Sender: TObject);
    var
      Res: Integer;
    begin
      { 新建一个文件,先检查当前文件是否已经保存,如果没有保存
      怎提示消息是否保存,选择“是”则保存当前文件
      选择“否”则忽略保存当前文件 }
      if Memo.Modified then
      begin
        Res := Application.MessageBox('The current file has changed. Save changes?',
          'ScratchPad Message', MB_YESNOCANCEL);
        { 如果点击“是”则先保存当前的文件}
        if Res = IDYES then
          FileSaveClick(Sender);
        { 如果点击“取消”则什么也不做}
        if Res = IDCancel then
          Exit;
      end;
    
      { 删除Memo已有的字符}
      if Memo.Lines.Count > 0 then
        Memo.Clear;
      { 设置SaveDialog的FileName属性为空字符串,
      为的是让我们知道文件还没有存储 }
      SaveDialog.FileName := '';
    end;

    【File | Open…】菜单项代码

    procedure TMainForm.FileOpenClick(Sender: TObject);
    var
      Res: Integer;
    begin
      { 打开一个文件,先检查当前文件是否已经保存,如果没有保存
      怎提示消息是否保存,选择“是”则保存当前文件
      选择“否”则忽略保存当前文件 }
      if Memo.Modified then
      begin
        Res := Application.MessageBox('The current file has changed. Save changes?',
          'ScratchPad Message', MB_YESNOCANCEL);
        if Res = IDYES then
          FileSaveClick(Sender);
        if Res = IDCANCEL then
          Exit;
      end;
    
      { 执行打开文件对话框选择要打开的文件
      点击“确定”后,用LoadFromFile方法打开文件,
      首先,清楚FileName属性}
      OpenDialog.FileName := '';
      if OpenDialog.Execute then
      begin
        if Memo.Lines.Count > 0 then
          Memo.Clear;
        Memo.Lines.LoadFromFile(OpenDialog.FileName);
        SaveDialog.FileName := OpenDialog.FileName;
      end;
    end;

    【File | Save…】

    procedure TMainForm.FileSaveClick(Sender: TObject);
    begin
      { 先判断SaveDialog.FileName属性是否为空,
      如果不为空,则直接调用SaveToFile方法,否则调用SaveDialog对话框保存}
      if SaveDialog.FileName <> '' then
      begin
        Memo.Lines.SaveToFile(SaveDialog.FileName);
        { 设置Memo.Modified为False,一旦保存完成的话}
        Memo.Modified := False;
    
      end else
        { 如果FileName属性为空,则调用另存为对话框}
        FileSaveAsClick(Sender);
    end;

    【File | Save As…】

    procedure TMainForm.FileSaveAsClick(Sender: TObject);
    begin
      { 显示SaveDialog对话框保存文件,
      并且设置Memo.Modified为False,一旦保存完成}
      SaveDialog.Title := 'Save As...';
      if SaveDialog.Execute then
      begin
        Memo.Lines.SaveToFile(SaveDialog.FileName);
        Memo.Modified := False;
      end;
    end;

    【Edit | Undo】

    procedure TMainForm.EditUndoClick(Sender: TObject);
    begin
      { TMemo组件没有提供Undo撤销方法,
      因此只能通过发送WM_UNDO消息来实现}
      SendMessage(Memo.Handle, WM_UNDO, 0, 0);
    end;

    【Edit | Select All】

    procedure TMainForm.EditSelectAllClick(Sender: TObject);
    begin
      { 调用Memo.SelectAll方法实现全选功能}
      Memo.SelectAll;
    end;

    【Edit | Copy】

    procedure TMainForm.EditCopyClick(Sender: TObject);
    begin
      { 调用Memo.CopyToClipboard方法}
      Memo.CopyToClipboard;
    end;

    【Edit | Paste】

    procedure TMainForm.EditPasteClick(Sender: TObject);
    begin
      { 调用Memo.PasteFromClipboard方法}
      Memo.PasteFromClipboard;
    end;

    【Edit | Word Wrap】

    procedure TMainForm.EditWordWrapClick(Sender: TObject);
    begin
      { 设置Memo.WordWrap属性来实现自动换行功能。}
      Memo.WordWrap := not Memo.WordWrap;
      EditWordWrap.Checked := Memo.WordWrap;
      if Memo.WordWrap then
        Memo.ScrollBars := ssVertical
      else
        Memo.ScrollBars := ssBoth;
    end;

    现在是等待已久的时刻

    在为菜单项目建立了事件处理程序后,准备 运行程序。点击Run按钮,程序就编译并运行。如果出现了编译错误,请仔细比较上面的代码进行修改,也许会进行多次修改处理,最终使它能成功运行。

    当程序运行时,会发现程序并不是非常精美,大部分像Windows Notepad。尽管在完成前有一些东西要加上去,还是有了相当好的开始。下图显示了正在运行的ScratchPad程序。

    0166

    以上代码均在Delphi7中测试通过,本节示例代码下载:ScratchPad(菜单设计器之二).rar

  • 相关阅读:
    联合主键SQL 联合索引
    SQL 对decimal类型转换为int类型
    SQL获取当前时间月份为两位数
    SQL 对结果集进行分组排序过滤重复数据 ROW_NUMBER
    SQL自动流水号函数
    SQL 索引创建
    .Net三层架构
    2016年你应该学习的语言和框架(转)
    MongoDB学习笔记(转)
    干货分享:让你分分钟学会 javascript 闭包(转)
  • 原文地址:https://www.cnblogs.com/pchmonster/p/2325003.html
Copyright © 2011-2022 走看看