0

アプリケーションに元に戻す/やり直しを実装するために、次のコードを使用しています。

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

--

 public UndoSection(int index, string undo)
    {
        Index = index;
        Undo = undo;
    }

--

            Stack<UndoSection> UndoStack = new Stack<UndoSection>();
 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.None && e.KeyCode == Keys.Delete)
                UndoStack.Push(new UndoSection(richTextBoxPrintCtrl1.SelectionStart, richTextBoxPrintCtrl1.SelectedText));
            else if (e.Control && e.KeyCode == Keys.Z)
            {
                e.Handled = true;
                undo_Click(richTextBoxPrintCtrl1, new EventArgs());
            }
        }

     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];
        }

ただし、リッチ テキスト ボックスに「こんにちは。これは私のアプリケーションです」などのテキストを入力すると、「私の」までしかやり直すことができません。「申請」をやり直させてくれません。また、すべてのテキストを元に戻すと、テキストをやり直して復元することはできません。

これがこのように動作する原因は何ですか? この取り消し/やり直しコードを正しく機能させる必要があります。誰かが私を正しい方向に向けるのを手伝ってくれませんか?

- 編集 -

コードをやり直す:

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];
        }

    }

RedoCode(); を使用して、ボタンのクリックによって呼び出されます。

4

1 に答える 1

0

Redo 関数を呼び出す方法を教えてください。

私が見ることができるように、あなたは以下のコードを見逃しています

 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.None && e.KeyCode == Keys.Delete)
                UndoStack.Push(new UndoSection(richTextBoxPrintCtrl1.SelectionStart, richTextBoxPrintCtrl1.SelectedText));
            else if (e.Control && e.KeyCode == Keys.Z)
            {
                e.Handled = true;
                undo_Click(richTextBoxPrintCtrl1, new EventArgs());
            }
            else if (e.Control && e.KeyCode == Keys.Y)
            {
                e.Handled = true;
                redo_Click(richTextBoxPrintCtrl1, new EventArgs());
            }
于 2013-04-28T13:42:12.747 に答える