|
分類:[VB.NET/VB2005 以降]
以前テキストエディタで「もとに戻す」「やり直す」を作れないかと書き込んだ者ですが、
その後あるサイトで"やり直しが効くテキストエディタ"というものを見つけ(回数制限あり)
組み込んでみたのですがエラーが出て作動しません。
どこをどうすれば作動するようになるか、分かりませんでしょうか。
以下がそのコードです。
Const UNDOMAX = 5 '元に戻すができる最大回数
Private Structure UndoType '元に戻す(やり直しも)の変数をまとめた構造体(型)
Dim Max As Integer '元に戻すの最大回数(UNDOMAXを超えることはない)
Dim Now As Integer '文字列バッファの現在位置(元に戻すを押さなかったら、ず〜っと値が0)
Dim flg As Boolean 'TextBox1.Textプロパティへの文字列の例外代入用
Dim Buf() As String 'TextBoxの文字列バッファ
↑もともとここはDim Buf(UNDOMAX) As String となっていましたがエラーが出たので
試しにUNDOMAXを消すとエラーが消えました。で、そのままにしています。
End Structure
Dim Undo As UndoType 'Undo構造体を使う
Sub TextChange() 'Undoバッファの入れ替え
Dim j As Integer
If Undo.flg = False Then Exit Sub
rt.Enabled = True '元に戻すが使えるようにする
g.Enabled = False 'やり直しが使えるようにする
'元に戻すが何度か押された場合
If Undo.Now <> 0 Then
'Undo.Maxの変更
Undo.Max = UNDOMAX - Undo.Now
'Undo.NowからUndo.Bufまでの文字列バッファを文字列バッファの先頭に移動する
For j = 0 To Undo.Max
Undo.Buf(j) = Undo.Buf(Undo.Now + j)
Next
'文字列バッファのお尻のごみを削除する
For j = Undo.Max + 1 To UNDOMAX
Undo.Buf(j) = ""
Next
'Undo.Nowの変更
Undo.Now = 0
End If
'Undo.Bufの入れ替えを行う
For j = UNDOMAX To 1 Step -1
Undo.Buf(j) = Undo.Buf(j - 1)
Next
Undo.Buf(0) = TextBox1.Text
'元に戻すの最大戻り回数を決める
If Undo.Max = UNDOMAX Then
Undo.Max = UNDOMAX
Else
Undo.Max = Undo.Max + 1
End If
End Sub
'「もとに戻す」ボタン
Private Sub rt_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles rt.Click
TextBox1.Select()
Undo.Now = Undo.Now + 1
'Text1.Textへの例外代入
'(Text1_ChangeイベントでTextChange関数が勝手に使われないようにするため)
Undo.flg = True
TextBox1.Text = Undo.Buf(Undo.Now)
ここでデバッグの時に「ハンドルされませんでした」と出ます。そしてUndoできません
UndoができないのでRedoは試していませんが多分同じエラーが出ると思います。
Undo.flg = False
'元に戻すが限界値になったら元に戻すが使えないようにする
If Undo.Now < Undo.Max Then
rt.Enabled = True
g.Enabled = True
Else
rt.Enabled = False
End If
End Sub
'進むボタン
Private Sub g_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles g.Click
TextBox1.Select()
Undo.Now = Undo.Now - 1
'TextBox1.Textへの例外代入
'(TextBox1_ChangeイベントでTextChange関数が勝手に使われないようにするため)
Undo.flg = True
TextBox1.Text = Undo.Buf(Undo.Now)
Undo.flg = False
'やり直しが限界値になったらやり直しが使えないようにする
If Undo.Now > 0 Then
rt.Enabled = True
g.Enabled = True
Else
g.Enabled = False
End If
End Sub
Private Sub TextBox1_Change()
'例外代入(元に戻すとやり直しで使う)以外の場合TextChange関数を使う
If Undo.flg = False Then TextChange()
End Sub
|