C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 「もとに戻す」「やり直す」再び


(過去ログ 57 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■32371 / inTopicNo.1)  「もとに戻す」「やり直す」再び
  
□投稿者/ lino. (12回)-(2009/02/05(Thu) 16:38:29)

分類:[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

引用返信 編集キー/
■32394 / inTopicNo.2)  Re[1]: 「もとに戻す」「やり直す」再び
□投稿者/ yamyam (5回)-(2009/02/05(Thu) 23:42:42)
No32371 (lino. さん) に返信
>     Private Structure UndoType '元に戻す(やり直しも)の変数をまとめた構造体(型)
>
>         Dim Buf() As String 'TextBoxの文字列バッファ
このバッファ用の配列はどこかで確保してますよね?

後、関係無いとは思いますが、
>  Private Sub TextBox1_Change()
>       '例外代入(元に戻すとやり直しで使う)以外の場合TextChange関数を使う
>        If Undo.flg = False Then TextChange()
>    End Sub

ここで次のメソッドを呼んでますけど、
>    Sub TextChange() 'Undoバッファの入れ替え
>        Dim j As Integer
>
>        If Undo.flg = False Then Exit Sub

Undo.flg = False だったら TextChange()の中身は実行されないのでは?

引用返信 編集キー/
■32397 / inTopicNo.3)  Re[2]: 「もとに戻す」「やり直す」再び
□投稿者/ lino. (13回)-(2009/02/06(Fri) 09:18:14)
No32394 (yamyam さん) に返信
> ■No32371 (lino. さん) に返信
>> Private Structure UndoType '元に戻す(やり直しも)の変数をまとめた構造体(型)
> >
>> Dim Buf() As String 'TextBoxの文字列バッファ
> このバッファ用の配列はどこかで確保してますよね?
>
今回のことで追加した部分はこれで全てなので
多分してないと思います……。どうすればいいのでしょうか……。




> 後、関係無いとは思いますが、
> >  Private Sub TextBox1_Change()
>> '例外代入(元に戻すとやり直しで使う)以外の場合TextChange関数を使う
>> If Undo.flg = False Then TextChange()
>> End Sub
>
> ここで次のメソッドを呼んでますけど、
>> Sub TextChange() 'Undoバッファの入れ替え
>> Dim j As Integer
> >
>> If Undo.flg = False Then Exit Sub
>
> Undo.flg = False だったら TextChange()の中身は実行されないのでは?

If Undo.flg = False Then Exit Sub
の前の行に
'### (2001/3/19: バグ報告により確認) ###
'この一行を忘れてました(涙)

と記述があったのでおそらく必要な部分なのではないでしょうか。

引用返信 編集キー/
■32415 / inTopicNo.4)  Re[3]: 「もとに戻す」「やり直す」再び
□投稿者/ みきぬ (372回)-(2009/02/06(Fri) 12:28:57)
それ、VB6 のソースなんじゃ…。
http://hp.vector.co.jp/authors/VA015521/sample/sample_27.html

引用返信 編集キー/
■32416 / inTopicNo.5)  Re[4]: 「もとに戻す」「やり直す」再び
□投稿者/ επιστημη (1665回)-(2009/02/06(Fri) 12:45:59)
επιστημη さんの Web サイト
> それ、VB6 のソースなんじゃ…。

VB.NETにportしてくれってんじゃねぇスカ?

引用返信 編集キー/
■32474 / inTopicNo.6)  Re[5]: 「もとに戻す」「やり直す」再び
□投稿者/ yamyam (6回)-(2009/02/06(Fri) 20:38:42)
>>それ、VB6 のソースなんじゃ…。
> 
> VB.NETにportしてくれってんじゃねぇスカ?
> 
あぁ、何か違和感があると思ったらそういうことですか。

> Private Sub TextBox1_Change()
このメソッドはTextBoxのTextChangeイベントに対応してるはずなのに
引数が無いのは何でだろうかと…。
投稿するときに省略したんだと思ってたんですけど、違うみたいですね。


>今回のことで追加した部分はこれで全てなので
>多分してないと思います……。どうすればいいのでしょうか……。
VB.NET 配列 で、我等がGoogle先生に頼み込んでみました。
http://www.google.co.jp/search?hl=ja&safe=off&q=VB.NET+%E9%85%8D%E5%88%97&btnG=%E6%A4%9C%E7%B4%A2&lr=

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -