为什么我的撤销/重做代码不能按要求运行?

本文关键字:不能按 运行 代码 重做 我的 为什么 | 更新日期: 2023-09-27 18:11:38

我需要我的撤销/重做代码的功能像撤销/重做功能发现在微软记事本,微软Word等(我正在创建一个文字处理器)。

目前,我的撤消和重做代码工作到程度。但是在我的应用程序中有许多撤消/重做功能的问题。

如果我输入一个句子,例如"Hello,我的名字是Toby.",然后撤消文本(让Hello仍然留在文档中),我只能重做到"is"。

如果撤消文档中的所有文本,则不能重做任何文本。因此,如果我再次输入"Hello, my name is Toby.",然后撤消这一行,我就不能重做任何文本。

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

到目前为止,Undo和redo使用的代码如下:

    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)

为什么我的撤销/重做代码不能按要求运行?

一旦撤销,您似乎将堆栈计数设置为零。这就是为什么当你重做时,它只增加到允许的量-1试着

撤销代码

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