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

posted on 2012-01-17 20:49  pchmonster  阅读(2802)  评论(2编辑  收藏  举报

导航