2013-04-29 47 views
0

我需要我的撤销/重做代码才能像Microsoft记事本,Microsoft Word等中找到的撤销/重做功能(我正在创建一个字处理器)。为什么我的撤销/重做代码没有按要求运行?

目前,我的撤消和重做代码工作到范围。但是在我的应用程序中,撤销/重做功能有很多问题。这些如下:

如果我输入一个句子,例如“你好,我的名字是Toby。”,然后我撤消文本(留下Hello仍然在文档上),我只能重做为“is ”。

如果我撤销文档中的所有文本,我无法重做任何文本。所以如果我再次输入“你好,我的名字是Toby。”,然后我撤消该行,我不能再重做任何文本。

我希望有人能帮我纠正这些问题。

截至目前,由两者撤消和恢复中使用的代码如下:

public struct UndoSection 
    { 
     public string Undo; 
     public int Index; 

     public UndoSection(int index, string undo) 
     { 
      Index = index; 
      Undo = undo; 
     } 
private void richTextBoxPrintCtrl1_TextChanged(object sender, EventArgs e) 
     { 
      { 
       OldLength = richTextBoxPrintCtrl1.Text.Length; System.Text.RegularExpressions.MatchCollection wordColl = System.Text.RegularExpressions.Regex.Matches(richTextBoxPrintCtrl1.Text, "'?([a-zA-z'-]+)'?"); 
       counter.Text = wordColl.Count.ToString(); 
      } 
      try 
      { 
       if (IsRedoUndo == false && (richTextBoxPrintCtrl1.Text.Substring(richTextBoxPrintCtrl1.Text.Length - 1, 1) == " " || richTextBoxPrintCtrl1.Text.Substring(richTextBoxPrintCtrl1.Text.Length - 1, 1) == ",")) 
       { 
        StackCount = StackCount + 1; 
        RTBRedoUndo[StackCount] = richTextBoxPrintCtrl1.Text; 
       } 
      } 
      catch { } 

     } 
public string[] RTBRedoUndo; 
     public int StackCount = 0; 
     public int OldLength = 0; 
     public int ChangeToSave = 5; 
     public bool IsRedoUndo = false; 

     public void RTBTextChanged() 
     { 
      if (richTextBoxPrintCtrl1.TextLength - OldLength >= ChangeToSave | richTextBoxPrintCtrl1.TextLength - OldLength <= ChangeToSave) 
      { 
       StackCount += 1; 
       RTBRedoUndo[StackCount] = richTextBoxPrintCtrl1.Text; 
      } 

撤消代码:

public void UndoCode() 
     { 
      IsRedoUndo = true; 
      if (StackCount > 0 && RTBRedoUndo[StackCount - 1] != null) 
      { 
       StackCount = StackCount - 1; 
       richTextBoxPrintCtrl1.Text = RTBRedoUndo[StackCount]; 
      } 
     } 

重做代码:

public void RedoCode() 
     { 
      if (IsRedoUndo == false && richTextBoxPrintCtrl1.Text.Substring(richTextBoxPrintCtrl1.Text.Length - 1, 1) == " ") 

       IsRedoUndo = true; 
      if (StackCount > 0 && RTBRedoUndo[StackCount + 1] != null) 
      { 
       StackCount = StackCount + 1; 
       richTextBoxPrintCtrl1.Text = RTBRedoUndo[StackCount]; 
      } 

我我不太确定要尝试什么,所以我希望有更多编程知识的人可以帮助我,因为我仍然是新手在我的学习阶段。

感谢:o)

+0

好吧,这可能是对于一个新手来说太先进,但做一个撤销的最佳方式/重做操作是与[命令设计模式](http://en.wikipedia.org/wiki/Command_pattern) – 2013-04-29 22:44:22

+0

有没有一些原因,你滚动自己的堆栈,而不是简单地使用'System.Collections.Generic.Stack '? (例如,您可以将自己的堆栈作为学习练习;但在这种情况下:**将堆栈提取到它自己的类**。您的程序将更容易理解并测试是否将问题分开*进入他们自己的班级。) – 2013-04-29 23:05:27

+0

我不太确定。我真的只是试图把东西拼凑起来,让它工作。我不能相信撤销/重做是多么艰难的工作.. – Toby 2013-04-29 23:13:45

回答

0

您撤销后,您似乎将堆栈计数设置回零。这就是为什么当u重做它去最多只允许-1 试量

撤消代码

public void UndoCode() 
    { 
     IsRedoUndo = true; 
     if (StackCount > 0 && RTBRedoUndo[StackCount] != null) 
     { 
      StackCount = StackCount - 1; 
      richTextBoxPrintCtrl1.Text = RTBRedoUndo[StackCount+1]; 
     } 
    } 
+0

嘿。感谢你的回答。不幸的是,它似乎没有工作,因为它似乎不允许重做正常工作,然后也停止撤消功能。 – Toby 2013-04-29 23:12:51

+0

好的没问题。是的实验与数字。通常它与你正在使用的数组或堆栈的增量有关。 – Cubatown 2013-04-29 23:15:52

+0

啊。好吧,我会玩一玩。谢谢。 – Toby 2013-04-29 23:16:42

相关问题