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

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

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

Re[4]: プロパティの値を変えるとVBが閉じてしまう


(過去ログ 56 を表示中)

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

■31470 / inTopicNo.1)  プロパティの値を変えるとVBが閉じてしまう
  
□投稿者/ まいか (58回)-(2009/01/22(Thu) 13:49:44)

分類:[.NET 全般] 

お世話になります
WinXP、VB.NET2005と言う環境です
勉強の一環で、プロパティの値を変えたら他のプロパティの値を変える事をやっています
例えばAと言うプロパティ(Boolean型)と、Bと言うプロパティ(Boolean型)があるとします
AのプロパティをTrueにするとBのプロパティがFalseに、また逆もあります
Aのプロパティを変えるとBが変わると言うのは出来たのですが
今度はBが変わったらAのプロパティを変える様に、同じ様に記述したらプロパティを変えると
VB.NET2005が突然終了してしまう様になってしまいました
Bの方のRaiseEventをコメントで潰すと、Aの方は望む様に変わってくれました
どうかよろしくお願いします

以下コードです
Private _A As Boolean = False
Private _B As Boolean = True
Public Event AChanged()
Public Event BChanged()

<System.ComponentModel.DefaultValue(False)> Public Property A() As Boolean
Get
Return _A
End Get
Set(ByVal value As Boolean)
_A = value
RaiseEvent AChanged()
End Set
End Property

<System.ComponentModel.DefaultValue(False)> Public Property B() As Boolean
Get
Return _B
End Get
Set(ByVal value As Boolean)
_B = value
RaiseEvent BChanged()
End Set
End Property

Private Sub MyTextBox1_AChanged() Handles Me.AChanged
Me.B = Not _A
End Sub

Private Sub MyTextBox1_BChanged() Handles Me.BChanged
Me.A = Not _B
End Sub

引用返信 編集キー/
■31471 / inTopicNo.2)  Re[1]: プロパティの値を変えるとVBが閉じてしまう
□投稿者/ ぽぴ王子 (428回)-(2009/01/22(Thu) 14:01:03)
ぽぴ王子 さんの Web サイト
No31470 (まいか さん) に返信
> お世話になります
> WinXP、VB.NET2005と言う環境です
> 勉強の一環で、プロパティの値を変えたら他のプロパティの値を変える事をやっています
> 例えばAと言うプロパティ(Boolean型)と、Bと言うプロパティ(Boolean型)があるとします
> AのプロパティをTrueにするとBのプロパティがFalseに、また逆もあります
> Aのプロパティを変えるとBが変わると言うのは出来たのですが
> 今度はBが変わったらAのプロパティを変える様に、同じ様に記述したらプロパティを変えると
> VB.NET2005が突然終了してしまう様になってしまいました
> Bの方のRaiseEventをコメントで潰すと、Aの方は望む様に変わってくれました
> どうかよろしくお願いします
> 
> 以下コードです
> Private _A As Boolean = False 
> Private _B As Boolean = True
> Public Event AChanged()
> Public Event BChanged()
> 
>     <System.ComponentModel.DefaultValue(False)> Public Property A() As Boolean
>         Get
>             Return _A
>         End Get
>         Set(ByVal value As Boolean)
>             _A = value
>             RaiseEvent AChanged()
>         End Set
>     End Property
> 
>     <System.ComponentModel.DefaultValue(False)> Public Property B() As Boolean
>         Get
>             Return _B
>         End Get
>         Set(ByVal value As Boolean)
>             _B = value
>             RaiseEvent BChanged()
>         End Set
>     End Property
> 
>     Private Sub MyTextBox1_AChanged() Handles Me.AChanged
>         Me.B = Not _A
>     End Sub
> 
>     Private Sub MyTextBox1_BChanged() Handles Me.BChanged
>         Me.A = Not _B
>     End Sub
> 

Aが変更されたときのイベント( MyTextBox1_AChanged )では、Me.B を書き換えていますよね。
同様に、Bが変更されたときのイベント( MyTextBox1_BChanged )では、Me.A を書き換えていますよね。

1. Aを書き換えたら、イベントが立ち上がって、イベントハンドラ内でBを書き換える。
2. Bが書き換わったら、またイベントハンドラが立ち上がって、イベントハンドラ内でAを書き換える。
3. 1に戻る。

ってな処理になっちゃいませんか?

VisualStudio が終了してしまうのはそのせいです。誰も止める人がいないんですもの。

# あと、コードを表示する場合は「図表モード」にチェックを入れて投稿すると良いです。

引用返信 編集キー/
■31472 / inTopicNo.3)  Re[1]: プロパティの値を変えるとVBが閉じてしまう
□投稿者/ .SHO (550回)-(2009/01/22(Thu) 14:02:28)
No31470 (まいか さん) に返信

エンドレスで変更し続けてるとか…
引用返信 編集キー/
■31476 / inTopicNo.4)  Re[1]: プロパティの値を変えるとVBが閉じてしまう
□投稿者/ カドルドエグ (70回)-(2009/01/22(Thu) 14:20:50)
No31470 (まいか さん) に返信
エラーが起こる原因はぽぴ王子さんが説明されている通りです。

で。
> AのプロパティをTrueにするとBのプロパティがFalseに、また逆もあり
を実行するためには、
イベント内の処理を

        _A = Not _A

        If A = True Then
            _B = False
        Else
            _B = True
        End If

のようにすると実現できます。
#書き方はいろいろあるでしょうがわかりやすさ重視で。

引用返信 編集キー/
■31478 / inTopicNo.5)  Re[1]: プロパティの値を変えるとVBが閉じてしまう
□投稿者/ まさる (58回)-(2009/01/22(Thu) 14:56:09)
まさる さんの Web サイト
No31470 (まいか さん) に返信

本筋とは若干ずれますが・・・

前スレッド(http://bbs.wankuma.com/index.cgi?mode=al2&namber=31264)の続きだと思いますけど、
Aプロパティに値が設定されたとき、変更されていなくとも必ずAChangedイベント発生させてますがよろしいのですか?

http://bbs.wankuma.com/index.cgi?mode=al2&namber=31264&page=0#6
以降でとりこびとさん、Mr.Tさん、επιστημηさんがフォローしてますので、
確認してみてください。
引用返信 編集キー/
■31518 / inTopicNo.6)  Re[2]: プロパティの値を変えるとVBが閉じてしまう
□投稿者/ まいか (59回)-(2009/01/23(Fri) 09:55:26)
2009/01/23(Fri) 10:00:56 編集(投稿者)
皆さん、ありがとうございます
一応以下のコードで出来ました
    Private _A As Boolean = False
    Private _B As Boolean = True
    Private _A_Old As Boolean = False
    Private _B_Old As Boolean = True
    Private _KBN_INT As Integer = 0

    Public Event AChanged(ByVal sender As Object, ByVal e As EventArgs)
    Public Event BChanged(ByVal sender As Object, ByVal e As EventArgs)

    <System.ComponentModel.DefaultValue(False)> Public Property A() As Boolean
        Get
            Return _A
        End Get
        Set(ByVal value As Boolean)
            _A = value
            If _A <> _A_Old AndAlso _KBN_INT = 0 Then
                _A_Old = _A
                _KBN_INT += 1
                RaiseEvent AChanged(Me, New EventArgs)
            Else
                _A_Old = _A
                _KBN_INT = 0
                Exit Property
            End If
        End Set
    End Property

    <System.ComponentModel.DefaultValue(False)> Public Property B() As Boolean
        Get
            Return _B
        End Get
        Set(ByVal value As Boolean)
            _B = value
            If _B <> _B_Old AndAlso _KBN_INT = 0 Then
                _B_Old = _B
                _KBN_INT += 1
                RaiseEvent BChanged(Me, New EventArgs)
            Else
                _B_Old = _B
                _KBN_INT = 0
                Exit Property
            End If
        End Set
    End Property

    Private Sub Class2_AChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.AChanged
        Me.B = Not _A
    End Sub

    Private Sub Class2_BChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.BChanged
        Me.A = Not _B
    End Sub
他の解決法などがあればアドバイスお願いします

引用返信 編集キー/
■31529 / inTopicNo.7)  Re[3]: プロパティの値を変えるとVBが閉じてしまう
□投稿者/ 渋木宏明(ひどり) (1035回)-(2009/01/23(Fri) 12:15:49)
渋木宏明(ひどり) さんの Web サイト
> 他の解決法などがあればアドバイスお願いします

プロパティ A の値を変更したことによってプロパティ B の値が変化してるのに、BChanged が上がってないような…

あと、これって、1つのクラスの上での話でしょ?

だとすると、わざわざイベントを使う必要があるのかな?

「プロパティ A が変更されたら、プロパティ B の値も連動して変わる」のが仕様なら、プロパティ A の setter で _A, _B の新しい値を代入して、AChanged, BChanged を発火した方が素直な実装なんじゃないかな?(逆方向も同様)


引用返信 編集キー/
■31530 / inTopicNo.8)  Re[4]: プロパティの値を変えるとVBが閉じてしまう
□投稿者/ nori (44回)-(2009/01/23(Fri) 12:53:28)
BはAから求まるのであればAの変数だけで保持すれば良いのでは?

Private _A As Boolean = False

Public Property A() As Boolean
Get
Return _A
End Get
Set(ByVal value As Boolean)
_A = value
End Set
End Property

Public Property B() As Boolean
Get
Return !A
End Get
Set(ByVal value As Boolean)
A = !value
End Set
End Property

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -