tuoxiansp 发表于 2013-1-26 15:18:34

C#记事本——学习笔记(二)

     昨天做到很晚,1点20才收工。

     卡在一个bug上,‘新建’时会出现死循环,还没搞清是什么原因。

     那么以时间序整理下昨晚的工作。

     笔记(一)中的几个思路到了真正实践的过程中才发现那个另存方法完全是多余的。

     系统生成的就是一个方法,所以无需多此一举。

     打开vs,顺着自己想好的思路,先做‘另存’按钮,这里vs提供了一个saveFileDialog控件,我的理解是打开一个通用对话框,创建文件并打开,返回这个文件的句柄,这里用引用可能更合适些,那么就是返回对该空文件的引用吧,接着用到系统的输入输出流,查书得知为System.IO命名空间下的Stream类。

     使用Stream类声明一个对象Stream,再调用StreamWriter类,声明对象sw,将richTextBox.Rtf写入到文件中。
private void 另存为AToolStripMenuItem_Click(object sender, EventArgs e)      {            saveFileDialog1.ShowDialog();      }      private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)      {            Stream Stream =saveFileDialog1.OpenFile();            StreamWriter sw = new StreamWriter(Stream);            sw.Write(richTextBox1.Rtf);            sw.Close();            Stream.Close();      } 
     接着是‘保存’。

     保存时需判断是否为打开的文件,是则直接写入流,否则弹出另存对话框。

     在这里我引入了一个变量path,初始值为空,当打开文件时,给path赋值文件路径。这样,判断是否为打开的文件,只需判断path是否为空。
private void 保存SCtrlSToolStripMenuItem_Click(object sender, EventArgs e)      {            if (path == "")            {                saveFileDialog1.ShowDialog();            }            else {                StreamWriter sw = new StreamWriter(path);                sw.Write(richTextBox1.Rtf);                sw.Close();            }      }     为了验证这段代码,我紧接着写了‘新建’。

新建时要判断文件是否有修改或者为空,当为空或者有修改的情况下,弹出对话框询问是否保存。
 
      private void 新建NCtrlNToolStripMenuItem_Click(object sender, EventArgs e)      {            if (richTextBox1.Rtf == "" || richTextBox1.CanUndo == false)            {                richTextBox1.Rtf = "";
                path = "";
            }            else {                Form2 frm = new Form2();                frm.ShowDialog();            }      }      此处对话框为模态对话框,弹出对话框时,不能对Form1操作。不打算赘述这个过程。

     对话框有‘保存’,‘不保存’和‘取消’按钮,这里需要对Form1的空间操作,Form1和Form2是两个类,在Form2中操作,需注意声明一个Form1的对象,然后调用Form1中的方法,把‘保存’方法改为public。
 
public void 保存SCtrlSToolStripMenuItem_Click(object sender, EventArgs e)      {            if (path == "")            {                saveFileDialog1.ShowDialog();            }            else {                StreamWriter sw = new StreamWriter(path);                sw.Write(richTextBox1.Rtf);                sw.Close();            }      }     编码过程中,发现无法直接对richTextBox1操作,在Form1的设计代码中将控件属性改为public也不行,于是,我在Form1中添加了newrtf方法。

 
public void newrtf() {            richTextBox1.Rtf = "";            path = "";      }      调用该方法,代码中终于没有错误了。Debug。

     点击‘新建’,观察到richtextbox一遍遍刷新,然后程序无响应。

     出bug了。vs提示询问是否有无限堆栈,仔细看了自己的代码,应该是没有循环的,直到现在毫无头绪。
页: [1]
查看完整版本: C#记事本——学习笔记(二)