@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ブレークポイントにとまらない

投稿者投稿内容
未記入
会議室デビュー日: 2005/11/09
投稿数: 18
投稿日時: 2006-04-17 17:30
いつも拝見させて頂いております。
大変恐縮ですが、以下についてご教示いただければ幸いです。
過去のトピックなども参照したのですが、それでも分かりませんでした。
よろしくお願いします。


環境
・VS.NET 2003
・Windowsフォーム
・構成プロパティ
 デバッグ情報を生成する:チェック済み
・ソリューション構成:Debugモード
・PDBファイル:ビルド/リビルド時に更新されています
・ステップイン実行(F11)で開始できます

現象

プログラム構成は、FormAのボタン1をクリックしてFormBを表示する、
というようなものです。

FormAのボタン1をクリックすると、FormBのLoadイベントのコードが実行されます。
Loadイベント内のコードでは、ブレークポイントがききます。
次にFormBの任意のボタンをクリックすると、ブレークポイントがきかなくなりました。
ブレークポイントのきかないままで、FormBを閉じてFormAに戻り、
再度ボタン1をクリックしてFormBを表示すると、
今度はLoadイベント内でもとまりません。


以上
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-04-17 17:39
Closeしただけでは?>インスタンスを破棄していない。
つまり、Visible=Falseの状態。
Loadは「初めて」表示される直前のみ発生します。
未記入
会議室デビュー日: 2005/11/09
投稿数: 18
投稿日時: 2006-04-17 17:42
すみません。説明不足でした。
FormBはDisposeしています。
破棄して閉じています。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-04-17 17:46
ボタン1とFormBの現象が再現するボタンのコードを書いてみてください。

#私事で恐縮ですが、もう帰宅しますので以降は深夜の返信となってしまいします。(汗


[ メッセージ編集済み 編集者: まどか 編集日時 2006-04-17 17:49 ]
未記入
会議室デビュー日: 2005/11/09
投稿数: 18
投稿日時: 2006-04-17 18:09
まどかさま
大変お手数をおかけします。ご返信はとくに気にされないでください。
いつでもお待ちしています。

本来のコードをそのまま載せられないので、かなりシンプルにさせて頂きます。
大体このようなことをやっています。
よろしくお願いします。


##FormA内のコード
・ボタン1クリック
Private Sub btnButton1_Click
(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnButton1.Click
Try
Dim _fm As New FormB(prm1,prm2)
_fm.ShowDialog()

Catch ex As Exception
messagebox.show(ex.message)
End Try
End Sub

### FormB内のコード
・コンストラクタ
Friend Sub New(ByVal prm1 As String, ByVal prm2 As String)
MyBase.New()
InitializeComponent()

Try
      FormAからの引数を取得、FormBのprivateオブジェクト生成など

_obj =new Object(prm1 ,prm2)

Catch ex As Exception
messagebox.show(ex.message)
End Try
          
End Sub

・Loadイベント
Private Sub FormB_Load
(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Try

   データを取得、データグリッドの設定、
   フォーム上のコントロールにイベントハンドラを設定、など
 SetData()
SetDataFrid()
AddHandles()

Catch ex As Exception
messagebox.show(ex.message)
End Try
End Sub
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-17 18:40
引用:

未記入さんの書き込み (2006-04-17 17:30) より:

次にFormBの任意のボタンをクリックすると、ブレークポイントがきかなくなりました。


これが原因だと断定するために、クリックしない場合のテストも必要ですね。
また、ここのコードを出さないと検証できません。

ブレーク ポイントに止まらないというのも、
MessageBox を表示するなりして通っていることを証明しなければなりません。

コード:

    Public Class Form1
        Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim frm2 As Form2

            Try
                frm2 = New Form2()
                frm2.ShowDialog()
            Finally
                If Not frm2 Is Nothing Then
                    frm2.Dispose()
                End If
            End Try
        End Sub
    End Class

    Public Class Form2
        Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
            MessageBox.Show("Form_Load2")
        End Sub
    End Class


これは、問題なく動くでしょうね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2005/11/09
投稿数: 18
投稿日時: 2006-04-17 20:09
じゃんぬねっとさま
お手数をおかけします。

仰るとおり、コードを全て見せられたらよいのですが…
実際のコードは会社の業務システムと密接に関連していて、そのクラス関係をみなさまに説明することが困難です。
私としてももどかしいのですが、申し訳ありません。

なお、私の表現が一部あいまいで申し訳ありません。
FormBの任意のボタンをクリックしたことが原因というよりは、FormBのLoadイベントの終了まではブレークポイントがきくが、
それ以降きかなくなると言うべきでした。

私としては、FormBのコンストラクタ内かLoadイベント内のコードに問題があるのだろうか、などと思っています。
(しかし、コードを実行してもこの間に何もエラーとしてあがってきません)

###FormB内のコード
Friend Sub New(ByVal prm1 As String, ByVal prm2 As String)
MyBase.New()
InitializeComponent()

Try
      FormAからの引数を取得、FormBのprivateオブジェクト生成など

_obj =new Object(prm1 ,prm2) ←実際は、ここでオブジェクトを作成する際に、
SQLサーバーからデータを取得したり、
そのデータをObjectクラス内で加工したりしている

Catch ex As Exception
messagebox.show(ex.message)
End Try
          
End Sub

-------- テスト例 --------------------------------------
じゃんぬねっとさまのご指摘どおり、
確実にコードを通っているか、など試してみました。

テスト@FormBのLoadイベント内を確実に通っているか
FormBのLoadイベント内にメッセージを表示させるコードを挿入

Private Sub FormB_Load
(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Try

   データを取得、データグリッドの設定、
   フォーム上のコントロールにイベントハンドラを設定、など
  SetData()
  MessageBox.Show("Form2を表示しました")←挿入
SetDataFrid()
AddHandles()

Catch ex As Exception
messagebox.show(ex.message)
End Try
End Sub

結果、挿入したメッセージは表示されました。

テストAFormBのLoadイベント内は確実に止まるか
FormBのLoadイベント内にブレークポイントを設定

Private Sub FormB_Load
(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
   Try
   …
   データを取得、データグリッドの設定、
   フォーム上のコントロールにイベントハンドラを設定、など
  SetData() ←ブレークポイント設定
  SetDataFrid() ←ブレークポイント設定
AddHandles() ←ブレークポイント設定

  Catch ex As Exception
   messagebox.show(ex.message)
  End Try
End Sub

結果、いずれもブレークポイントにとまりました。
ちなみに、エラーはありませんでした。

テストBFormBのLoad後のブレークポイントがきくかT
FormBのLoad後、FormB上のボタンXをクリックしてみる
Private Sub btnButtonX_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnButtonX.Click
Try
_mode = True←ブレークポイント設定
MessageBox.Show("Modeを切り替えました")←挿入

SetControl()'コントロールのEnabled切り替えなど

Catch ex As Exception
MessageBox.Show(ex.message)
End Try
End Sub

結果、メッセージは表示されましたが、_mode = Trueのところでブレークしませんでした。
なお、エラーはありませんでした。

テストCFormBのLoad後のブレークポイントがきくかU
FormBのLoad後、FormB上のCloseボタンをクリックしてみる
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
Try
 Messagebox.Show("フォームを閉じます")←挿入・ブレークポイント設定
Me.Dispose

Catch ex As Exception
MessageBox.Show(ex.message)
End Try
End Sub

結果、メッセージは表示されましたが、ブレークしませんでした。
なお、エラーはありませんでした。

以上




じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-17 20:52
引用:

未記入さんの書き込み (2006-04-17 20:09) より:

テスト (3) FormBのLoad後のブレークポイントがきくか 1
FormBのLoad後、FormB上のボタンXをクリックしてみる


ここで MessageBox が表示されているのにブレークしないのはおかしいですね。
いったん、Bin に出来上がったファイルをすべて削除して、'リビルド' して実行してみてください。

確認ですが、FormB が別プロジェクトだったりということはないですよね?
また、新規プロジェクトから現状のコードを丸ごとコピペして試してみてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)