1

質問:関数Check()の下のholdDateが、デバッグ中に「Nothing」を表示するのはなぜですか。参照によって渡されていました。私は何が行方不明ですか?

問題の説明:

Walletという名前のクラスがあり、3つのパラメーター(すぐにではなく、後でユーザーからのデータが入力されるフォームに既に存在するオブジェクト)を渡すことにより、メインコードにそのクラスのインスタンスを作成しました。

Dim myWallet As New Wallet(DataGridView1, DateTimePicker1, "StatementsLog.dat")

実行時に私はこれを取得します: ここに画像の説明を入力してください

ご覧のとおり、フォームから元のオブジェクトを参照することになっていたオブジェクトは空ですか?(以下に示すように)参照で渡した場合、オブジェクトには常にデータが表示され、上のスクリーンショットに示すようにデータを読み取ることができると思いました。

Public Sub New(ByRef Data As DataGridView, ByRef _Date As DateTimePicker, Optional ByVal StatementsFileName As String = "defaultLog.txt")
  'This constructor takes in references to use in class as private
  holdPath = StatementsFileName
  holdData = Data
  holdDate = _Date
End Sub

これが私がこれまでにクラスウォレットで得たものです:

Option Strict On
Imports System
Imports System.IO

Public Class Wallet

  Private lcheckNumber As Integer = Nothing
  Private lcheckAmount As Decimal = Nothing
  Private ldepositAmount As Decimal = Nothing
  Private lfee As Decimal = Nothing
  Private lDescription As String = Nothing

  Private holdDate As New DateTimePicker
  Private holdData As New DataGridView
  Private holdPath As String = vbNullString

  'Default Constructor
  Public Sub New()
    holdPath = "defaultLog.txt"
  End Sub

  Public Sub New(ByRef _Data As DataGridView, ByRef _Date As DateTimePicker, Optional ByVal StatementsFileName As String = "defaultLog.txt")
    'This constructor takes in references to use in class as private
    holdPath = StatementsFileName
    holdData = _Data
    holdDate = _Date
  End Sub

  'Function Check - Deduct the amount from account and returns current balance.
  Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal, ByVal Description As String) As Decimal
    Try
      lcheckNumber = CheckNumber
      lcheckAmount = CheckAmount
      lDescription = Description
      lfee = 0D

      Dim _file As New FileStream(holdPath, FileMode.Append, FileAccess.Write)
      Using file As New StreamWriter(_file)
         file.WriteLine(holdDate.Value.ToString & "," & lDescription.ToString & "," & lcheckNumber.ToString & "," & lfee.ToString & "," & lcheckAmount.ToString)
      End Using
    Catch e As IOException
      MessageBox.Show(e.ToString)
    End Try

    Return 0D
  End Function

Form1コード

Option Strict On
Imports WalletProgram.Wallet

Public Class Form1
    Dim myWallet As New Wallet(DataGridView1, DateTimePicker1, "StatementsLog.dat")


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

        optCheck.Checked = True

        'Just test data for DataGridView1
        DataGridView1.Rows.Add(New String() {"12/21/1986", "Test", "44554", "44.22", "45.12"})
    End Sub

    Private Sub cmdAddTransaction_Click(sender As System.Object, e As System.EventArgs) Handles cmdAddTransaction.Click
        If optCheck.Checked Then
            lblAvailableFunds.Text = FormatCurrency(myWallet.Check(CInt(Trim(txtCheck.Text)), CDec(Trim(txtMoney.Text)), txtDescription.Text))
        End If
    End Sub
End Class
4

1 に答える 1

1

問題はここで発生する可能性が最も高いです:

Public Class Form1
  Dim myWallet As New Wallet(DataGridView1, DateTimePicker1, "StatementsLog.dat")

これはコンパイルされますが、フォームのルーチンが呼び出されるに発生するため、これらのオブジェクトはまだ作成されていません。InitializeComponent

宣言を次のように変更してみてください。

Public Class Form1
  Dim myWallet As Wallet

  Protected Overrides Sub OnLoad(e As System.EventArgs)
    _Wallet = New Wallet(DataGridView1, DateTimePicker1)
    MyBase.OnLoad(e)
  End Sub

End Class

コントロールが作成された後にWalletクラスが作成される場所。

于 2012-07-08T18:23:03.837 に答える