⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 o21.htm

📁 C++Builder教学大全
💻 HTM
📖 第 1 页 / 共 2 页
字号:
      1.一般没有必要去改动菜单项的Name属性,使用系统给出的默认名就可以了。<br> 

      2.以“-”为标题的菜单项即是菜单分割条,而菜单项的Break属性提供的分割则是一种很奇怪的样子--“垂直分害条”(群山笑:这个名词是我自已加上的)。<br> 

      &nbsp;&nbsp; OK,到此为止,界面部分的工作已经全部完成了,接下来便是代码部分的编写。首先要做的就是打开文件和存盘的工作。我们来建立一个char  

      *UserFileName的全局变量来存放文件名。按工具条上的Toggle Form/Uint将工作窗口切换到代码编辑区。这个按钮用于表单编辑区和代码编辑区的相互切换,按F11显示对象观察器。在“TMainForm  

      *MainForm;”下加语句:<br> 

      char *UserFileName="untitled.txt";//默认文件名Untitled.txt<br> 

      BOOL If_saved=TRUE;//表示文件存盘与否<br> 

      char title_buf[256];//标题的内容<br> 

      &nbsp;&nbsp; 接着,我们再切换回表单编辑区,从Dialogs组件条中选SaveDialog组件放入表单中。<br> 

      &nbsp;&nbsp; SaveDialog组件就是用来显示Save As对话框的,当然用Windows API也能实现此功能,这里将使用SaveDialog组件。将SaveDialog1的DefaultExt(默认的扩展名)属性设为.txt,这表示如果用户没有加扩展名,系统会自动加上“.txt”。按Filter属性后的[…]按钮,在弹出的对话框中输入“文本文件”“*.txt”“所有文件”“*.*”。另外再双击Options属性,将展开后其中的ofOverwritePrompt(文件覆盖提醒)属性设为true。接着在表单编辑区的菜单中选菜单项“另存为(A)...”,这时C++  

      Builder3会自动切换到代码编辑区,而光标停在一个函数的开头。在该例中菜单项“另存为(A)…”的名字属性是A1,所以这个函数的名字是A1Click(TObject  

      * Sender),表示用户选择(Click)这个菜单项而执行的函数。我们所要做的是弹出Save As对话框来获得用户输入的文件名,并将这个文件存盘。所以在这个函数里加如下的语句:<br> 

      if(!SaveDialog1-&gt;Execute()) return; //如果用户选择了取消,我们就return<br> 

      UserFileName = SaveDialog1 -&gt; FileName.c_str();<br> 

      / * FileName保存了用户输入的文件名,但是AnsiString类型的,用其中的c_str()方法可以将其转换成字符串*/<br> 

      Memo1 -&gt;Lines-&gt;SaveToFile(UserFlleName);<br> 

      If_saved=TRUE; //已经存盘<br> 

      sprintf(title_buf,"% s - 我的记事本”, UserFileName); /* 设置窗口的标题,记得要加上include  

      &lt;stdio.h&gt; * /<br> 

      Caption=title_buf;<br> 

      / * Memo中的Lines属性即是编辑控制中的内容,Lines属性是Strings类型的,用其中提供的SaveToFile方法可以方便地将编辑控制中的内容存盘  

      */<br> 

      &nbsp;&nbsp; 类似地,我们再来处理打开文件的工作。首先,在表单中放置一个OpenDialog组件,DefaultExt和Filter<br> 

      属性同SaveDialog1,将Options属性中的ofFileMustExist(文件必须存在)设为true。然后在表单编辑区中<br> 

      的菜单中选菜单项“打开(O)...”,在代码编辑区中输入如下语句。<br> 

      if(!if_saved)<br> 

      if(Application -&gt;MessageBox("文件还未保存,是否要保存?","我的记事本",<br> 

      MB_OKCANCEL+MB_DEFBUTTON1+MB_ICONWARNING)==ID_OK) S1Click(NULL); <br> 

      / * 如果文件没有保存,我们得先征求用户是否要保存文件。s1Click()是“保存(s)”菜单项的处理函数(就是接下来处理的菜单项),“保存(S)  

      ”菜单项的工作就是将文件存盘,所以我们没有必要写重复的代码,而只要直接调用该函数就可以了。注意,如果你的“保存(S)”菜单项的名字属性不是S1而是其他,那么这个函数的名字也会有所不同,但总是“名字”+Click()  

      */<br> 

      if(!OpenDialog1-&gt;Execute())return;<br> 

      UserFileName=OpenDialog1-&gt;FileName.c_str();<br> 

      Memo1-&gt;Lines-&gt;LoadFromFile(UserFileName);<br> 

      sprintf(title_buf,"% s - 我的记事本", UserFileName);<br> 

      Caption = title_buf;<br> 

      (为节省篇幅,以下凡是重复的操作描述省略)<br> 

      &nbsp;&nbsp; 处理“保存(S)”菜单项,输入:<br> 

      Memo1-&gt;Lines-&gt;SaveToFile(UserFileName);<br> 

      If_saved=TRUE;<br> 

      sprintf(title_buf,"% s - 我的记事本", UserFileName)";<br> 

      Caption = title_buf;<br> 

      &nbsp;&nbsp; 处理“新建(N)”菜单项,输入如下语句:<br> 

      lf(!If_saved)<br> 

      if(Application -&gt;MessageBox ("文件还未保存,是否要保存?","我的记事本",<br> 

      MB_OKCANCEL+MB_DEFBUTTON1+MB_ICONWARNING)==ID_OK)S1Click(NULL);<br> 

      sprintf(UserFileName,"Untitled.txt");<br> 

      sprintf(title_buf, "% s - 我的记事本-未存盘",UserFileName);<br> 

      Caption=title_buf;<br> 

      Memo1-&gt;Lines-&gt;Clear(); //将编辑控制中的内容清空<br> 

      &nbsp;&nbsp; 随后,我们要处理Memo1的OnChange事件(Events)。一旦编辑控制中的内容有改变,Memo1就将产生OnChange事件,这时需要将If_saved置为FALSE,表示文件已经改动过了,并在标题上显示“未存盘”。在对象观察器中选Memo1,再单击下面的Events,将列出许多事件,第一个就是OnChange,双击后面的编辑框,后面的操作和处理菜单项是一样的(其实前面处理的菜单项就是处理菜单的OnClick事件),输入:<br> 

      If_saved=FALSE;<br> 

      sprintf(title_buf,"% s -我的记事本-未存盘", UserFileName);<br> 

      Caption=title_buf;<br> 

      &nbsp;&nbsp; 随后处理MainForm的OnClose事件,输入:<br> 

      //OnClose事件在关闭窗口时产生,需要做一些收尾工作<br> 

      if(!If_saved)<br> 

      if(application-&gt;MessageBox("文件还未保存,是否要保存?","我的记事本",<br> 

      MB_OKCANCEL+MB_DEFBUTTON1+MB_ICONWARNING)==ID_OK)S1Click(NULL);<br> 

      &nbsp;&nbsp; 最后,处理“退出(X)”菜单项,输入如下语句:<br> 

      if(!If_saved)<br> 

      if(application-&gt;MessageBox("文件还未保存,是否要保存?","我的记事本",<br> 

      MB_OKCANCEL+MB_DEFBUTTON1+MB_ICONWARNING)==ID_OK)S1Click(NULL);<br> 

      Application-&gt;Terminate(); //程序结束<br> 

      &nbsp;&nbsp; 到此为止,终于小功告成了,快把项目保存下来吧。在File菜单中选Save Project As…,首先弹出的对<br> 

      话框要求输入表单的文件名(不能和表单的名字属性相同),我们就输入Main。随后弹出的对话框才是要求输入项目(Project)的文件名,该文件名也就是exe文件的名字,我们输入NotePad。保存后再选Project菜单<br> 

      里的Make NotePad,或按Ctrl+F9,就会产生一个NOtePad.exe,这就是我们自己做的记事本,目前它已经能打开文件、编辑并保存。你一定发现菜单中还有许多功能尚未实现,这就是我只说小功告成的原因,不过<br> 

      下次我们会完成它。<br> 

      &nbsp;&nbsp; 附件中除了记事本(NotePad),还有一个写字板(WordPad)。它们最大的区别在于前者使用的是编辑<br> 

      控制(Edit),而后者使用的是Rich Edit控制(有些书翻译成丰富文本控制)。与编辑控制相比,Rich Edit除了能给文本加上各种修饰,还支持简单的对象链接和嵌入技术(Object  

      Linking and Embedding)。<br> 

      &nbsp;&nbsp; 此外,Microsoft Win32 SDK的文档中说Rich Edit控制能接受的文本大小将只受内存大小的限制,这比<br> 

      编辑控制的64KB强多了。当然,效率又是另一个问题。我曾试图用写字板(WordPad)打开一个15MB的文件,硬盘读了10多分钟还没结果,只能按Reset重新启动了(我可有64MB内存哦)。自然使用Rich  

      Edit控制也比编辑控制难的多。在以后讲到RichEdit组件时,详细讲述它的用法。</font></td> 

  </tr> 

</table> 

<br> 

</body> 

</html> 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -