Массив переменных своего класса.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Массив переменных своего класса.

Сообщение GAGArin » 17.07.2007 (Вт) 12:31

Есть класс Punkt

Код: Выделить всё

Public Class Dot
    Public X As Double
    Public Y As Double

    Public Sub New()
    End Sub

    Public Sub New(ByVal X As Double, ByVal Y As Double)
        Me.X = X
        Me.Y = Y
    End Sub

End Class

Public Class Punkt
    Public Koord_AB As Dot
    Public Koord_XY As Dot
    Public A_plus As Double
    Public A_minus As Double
    Public B_plus As Double
    Public B_minus As Double
    Public Important As Double
    Private Sub New()

    End Sub
    Public Sub New(ByVal Koord_AB As Dot, ByVal Koord_XY As Dot, ByVal A_plus As Double, ByVal A_minus As Double, ByVal B_plus As Double, ByVal B_minus As Double, ByVal important As Double)
        Me.A_minus = A_minus
        Me.A_plus = A_plus
        Me.B_minus = B_minus
        Me.B_plus = B_plus
        Me.Koord_AB = Koord_AB
        Me.Koord_XY = Koord_XY
    End Sub
End Class

Мне нужен массив элементов этого класса.
Сначала создаю сам массив, потом вроде как пробегаюсь и создаю элементы. Выглядит это так (есть некоторые упущения не касающиеся кода, если надо могу кинуть код целиком). Пробегаем по файлу смотрим сколько позиций, потом считываем каждую строчку и делаем из нее новый экземпляр класса. Так?

Код: Выделить всё

    Dim BaseNet As Punkt()

    Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click

        OpenDialog.ShowDialog()
        If Not OpenDialog.FileName = "" Then
            Dim T As Integer
            Dim Aplus, Aminus, Bplus, Bminus, dotX, dotY, dotA, dotB, Important As Double
            Dim CurrentRange As String
            Dim ExcelApp As New Excel.Application
            Dim ExcelWkb As Excel.Workbook
            Dim ExcelWks As Excel.Worksheet
            ExcelApp.Visible = False
            ExcelApp.DisplayAlerts = False
            ExcelWkb = ExcelApp.Workbooks.Open(OpenDialog.FileName)
            ExcelWks = ExcelWkb.Worksheets(1)
            'Считывание данных о пунктах
            For T = 1 To 5000'(тупо считаем)
                If ExcelWks.Range("A" & Str(T + 1).Trim).Value = Nothing Then
                    Dim BaseNet(T) As Punkt
                    Exit For
                End If
            Next T
            If T < 3 Then Exit Sub 'Если точек мало - ну нафиг
            For T = 1 To T - 1
                CurrentRange = Str(T + 1).Trim
                    dotA = ExcelWks.Range("A" & CurrentRange).Value
                    dotB = ExcelWks.Range("B" & CurrentRange).Value
                    dotX = ExcelWks.Range("C" & CurrentRange).Value
                    dotY = ExcelWks.Range("D" & CurrentRange).Value
                    Aplus = ExcelWks.Range("E" & CurrentRange).Value
                    Aminus = ExcelWks.Range("F" & CurrentRange).Value
                    Bplus = ExcelWks.Range("G" & CurrentRange).Value
                    Bminus = ExcelWks.Range("H" & CurrentRange).Value
                    Important = ExcelWks.Range("I" & CurrentRange).Value
                    'Вот тут и начинается заморочка
                    BaseNet(T) = New Punkt(New Dot(dotA, dotB), New Dot(dotX, dotY), Aplus, Aminus, Bplus, Bminus, Important)
                End If
            Next T
            ExcelWkb.Close()
            ExcelApp.Quit()
            ExcelApp = Nothing
        End If
    End Sub

Собственно в родном MSDN пишут примерно то же самое:

Код: Выделить всё

'Чтобы создать массив объектов
'Объявите массив, как показано в приведенном ниже образце кода. 'Поскольку индексация массивов идет от нуля, они содержат на один 'член больше, чем объявлено в верхней границе.
Dim x(10) As Widget   ' Contains 11 members, from x(0) to x(10).

'Создайте экземпляр каждого члена массива, или присвойте каждому 'из членов ссылку на уже существующий объект. Ниже приведен 'пример использования обоих способов.

' Instantiates each member of an array by using a loop.
Dim q As Integer
For q = 0 to 10
   x(q) = New Widget()
Next

Меня терзают смутные сомнения, что мой конструктор кривой. Вот скажите в каком конкретно месте я туплю? Ошибка появляется там где создаю новый экземпляр (пытаюсь)
Object reference not set to an instance of an object.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.07.2007 (Вт) 13:21

Код: Выделить всё
If ExcelWks.Range("A" & Str(T + 1).Trim).Value = Nothing Then
  Dim BaseNet(T) As Punkt
  Exit For
End If

О ужас.

Мало того, что "= nothing" никогда не выполнится, так ещё и переменная BaseNet определена внутри цикла и недоступна вне его...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 17.07.2007 (Вт) 13:25

Спасибо.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62

    TopList