Чей глюк?

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

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

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Чей глюк?

Сообщение Fedorfx » 03.03.2005 (Чт) 0:33

VB 2005
при добавлении самопального контрола с параметром withevents
постоянно вылезают глюки типа такойто обьект не присутсвует в контроле. т.е. если в контроле обьявлен класс с параметром withevents то при инициализации контрола IDE там создается этот обьект беp данного параметра и потом лезут глюки.
Кто замечал такую бяку или мне своих тараканов идти морить?

Krasavica
Небожительница
Небожительница
Аватара пользователя
 
Сообщения: 1378
Зарегистрирован: 04.11.2003 (Вт) 17:51
Откуда: Россия, город-герой Москва ;-)

Сообщение Krasavica » 15.03.2005 (Вт) 18:47

Пример кода в студию?! :)
я - ангел!!! ...просто крылья в стирке, а нимб на подзарядке!
Меня трудно найти, легко потерять и невозможно забыть.Изображение

Solaar
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 05.02.2005 (Сб) 19:12

Сообщение Solaar » 22.03.2005 (Вт) 9:03

В продолжение темы чей глюк:
dim dTArr(1 to 5) as double 'задаю массив

На данную строку ругается, подчеркивает to и говорит, что необходима или запятая или скобка. Хотя данная конструкция вполне прокатывала в vb6 SP5. Что не так для VB.NET :roll:

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

Сообщение GSerg » 22.03.2005 (Вт) 10:49

Теперь массивы начинаются с нуля. Можно задать только верхнюю границу.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Solaar
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 05.02.2005 (Сб) 19:12

Сообщение Solaar » 08.10.2005 (Сб) 11:46

Не знал куда написать. поэтому отписался в эту тему. На компе был установлен win2k SP4 + office 2003. Разрабатывал прогу на VB.NET. все работало великолепно. Сгорела мать, вследстие чего заменил всеь комп и поставил winXP with SP2 + office 2003 (c того же дистибутива). Теперь запускается прога, ввожу данные для расчета, она их просчитывает, а затем должна выдать результаты в excel ввиде графиков и коэффициенты во всю туже form1. Но вместо всего этого вываливается сообщение в окне output (debug):
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.ComponentManager.System.Windows.Forms.UnsafeNativeMethods+IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WindowsApplication3.Form1.Main() in C:\Documents and Settings\clandestino\Мои документы\Visual Studio Projects\WindowsApplication3\Form1.vb:line 1The program '[5772] WindowsApplication3.exe' has exited with code 0 (0x0).


Помогите плиз, что с этим делать и из-за чего такая фигня.

P.S. проверял Excel 11.0 object library в reference присутствует и работает корректно. Заранее спасибо за помощь

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 08.10.2005 (Сб) 21:14

Krasavica писал(а):Пример кода в студию?! :)

Solaar,Krasavica права :wink:

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 08.10.2005 (Сб) 21:15

КОГДА ВЕРНУТСЯ ИЗ ОТПУСКА ТЕЛЕПАТЫ?

Solaar
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 05.02.2005 (Сб) 19:12

Сообщение Solaar » 09.10.2005 (Вс) 10:36

Выкладываю код. Большая просьба за структуру кода не ругать, потому что изначально писалась кем-то на basic аж в 1992 году. Я щаз его полностью переделываю. :)
Ремарки и комментарии удалять не стал.
Вот пример кода, после нажатия клавиши:
Код: Выделить всё
Public Class Form1
    Inherits System.Windows.Forms.Form
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Dim a, b, c As Double
        'Dim a4, tau, T As Double
        'Dim b1, a1, a3 As Double
        Button1.Enabled = False 'отключает повторное нажатие до завершения процесса расчета
        If ComboBox1.Text = "ПИ-ЗАКОН" Then
            a = 1
        ElseIf ComboBox1.Text = "ПИД-ЗАКОН" Then
            a = 2
        Else : MsgBox("Вы не указали тип регулятора", MsgBoxStyle.Information)
        End If
        If ComboBox2.Text = "АППЕРИОДИЧЕСКИЙ ПРОЦЕСС" Then
            b = 1
        ElseIf ComboBox2.Text = "ПРОЦЕСС С 20% ПЕРЕРЕГУЛИРОВАНИЕМ" Then
            b = 2
        ElseIf ComboBox2.Text = "ПРОЦЕСС С МИНИМАЛЬНЫМ КВАДРАТОМ КРИТЕРИЯ" Then
            b = 3
        Else : MsgBox("Вы не выбрали закон регулирования", MsgBoxStyle.Critical)
        End If
        c = a + b
        'проверка на правильность ввода
        If IsNumeric(TextBox1.Text) = False Then
            MsgBox("Вы забыли ввести a4 или его значение не верно", MsgBoxStyle.Critical)
            Exit Sub
        End If
        If IsNumeric(TextBox2.Text) = False Then
            MsgBox("Вы забыли ввести Tau или его значение не верно", MsgBoxStyle.Critical)
            Exit Sub
        End If
        If IsNumeric(TextBox3.Text) = False Then
            MsgBox("Вы забыли ввести T или его значение не верно", MsgBoxStyle.Critical)
            Exit Sub
        End If
        '-------------------------------------------------
        a4 = CDbl(TextBox1.Text)
        tau = CDbl(TextBox2.Text)
        T = CDbl(TextBox3.Text)
        b1 = tau / T
        'начальные данные
        'Dim k1, t3, d3 As Double
        a1 = 0 : a3 = 0
        '---Начало расчета---
        If (a = 1 And b = 1) Then
            MsgBox("a=1 и b=1", MsgBoxStyle.Information)
            k1 = 0.6 / (a4 * b1) : a2 = k1
            t3 = 0.6 * T : a3 = k1 / t3
        ElseIf (a = 1 And b1 = 2) Then
            MsgBox("a=1 и b=2", MsgBoxStyle.Information)
            k1 = 0.7 / (a4 * b) : a2 = k1
            t3 = 0.7 * T : a3 = k1 / t3
        ElseIf (a = 1 And b = 3) Then
            MsgBox("a=1 и b=3", MsgBoxStyle.Information)
            k1 = 1 / (a4 * b1) : a2 = k1
            t3 = T : a3 = k1 / t3
        ElseIf (a = 2 And b = 1) Then
            MsgBox("a=2 и b=1", MsgBoxStyle.Information)
            k1 = 0.95 / (a4 * b1) : a2 = k1
            t3 = 2.4 * tau : a3 = k1 / t3
            d3 = 0.4 * tau : a1 = k1 * d3
        ElseIf (a = 2 And b = 2) Then
            MsgBox("a=2 и b=2", MsgBoxStyle.Information)
            k1 = 1.2 / (a4 * b1) : a2 = k1
            t3 = 2 * tau : a3 = k1 / t3
            d3 = 0.4 * tau : a1 = k1 * d3
        Else
            MsgBox("a=2 и b=3", MsgBoxStyle.Information)
            k1 = 1.4 / (a4 * b1) : a2 = k1
            t3 = 1.3 * tau : a3 = k1 / t3
            d3 = 0.5 * tau : a1 = k1 * d3
        End If
        '--вывод полученных данных на экран--
        a1 = fRound(a1)
        a2 = fRound(a2)
        a3 = fRound(a3)
        k1 = fRound(k1)
        t3 = fRound(t3)
        d3 = fRound(d3)
        b1 = fRound(b1)
        TextBox4.Text = CStr(a1)
        TextBox5.Text = CStr(a2)
        TextBox6.Text = CStr(a3)
        TextBox7.Text = CStr(k1)
        TextBox8.Text = CStr(t3)
        TextBox9.Text = CStr(d3)
        TextBox10.Text = CStr(b1)
        'задание переменных для поиска субоптимальных настроек
        k11 = k1
        t3_1 = t3
        d3_1 = d3
        GroupBox2.Visible = True
        'мне пока не понятно что это за параметры, так что их можно менять
        Dim o, ka, l, x1, r, u As Double
        o = 0.5 : ka = 10 : l = 10 : x1 = 1 : r = 0.5 : u = 0.5
        '--------------------------------------------------
        'вывод точек для построения в Excel
        'данные переменные объявлены в модуле variables.vb
        'Dim oExcel As Excel.Application
        'Dim oBook As Excel.Workbook
        'Dim oSheet, xlSheet1, xlSheet2 As Excel.Worksheet
        'Dim oRange As Excel.Range
        'Dim sFile As String
        '--работа с экселем --
        oExcel = CreateObject("Excel.Application")
        oExcel.Visible = True 'работает только для Windows
        oExcel.ReferenceStyle = Excel.XlReferenceStyle.xlR1C1
        oBook = oExcel.Workbooks.Add()
        xlSheet2 = oBook.Worksheets.Add
        xlSheet2.Name = "оптимальные настройки"
        xlSheet1 = oBook.Worksheets.Add
        With xlSheet1
            .Name = "переходный процесс"
            .Application.Visible = True
            .Cells(1, 1) = "критерий"
            .Cells(1, 2) = "управление"
            .Cells(1, 3) = "выход"
            .Cells(1, 4) = "время"
        End With
        With xlSheet2
            .Cells(1, 1) = "Номер шага"
            .Cells(1, 2) = "X1"
            .Cells(1, 3) = "X2"
            .Cells(1, 4) = "X3"
            .Cells(1, 5) = "T1"
            .Cells(1, 6) = "T2"
            .Cells(1, 7) = "T3"
            .Cells(1, 8) = "X2/X1"
            .Cells(1, 9) = "X3/X1"
            .Cells(1, 10) = "T1/Tp"
            .Cells(1, 11) = "T2/Tp"
            .Cells(1, 12) = "T3/Tp"
            .Cells(1, 13) = "q"
            .Cells(1, 14) = "Ошибка,%"
        End With
        Dim kla As Integer = 1
        Dim kl(100) As Double
        Dim p(ka + 1) As Double 'длина массива зависит от переменной ka+1
        '--------------------------------------------------
        Dim m, j, ia, clr As Integer
        Dim qOpt, tOpt, d2, d2temp, c1 As Double
        Dim t2, w, j2, s, x3, q, er, I, y, X2, e2, d1, y1 As Double
        t1 = tau
3010:
        If (o - m) < 0 Then
            MsgBox("Конец", vbCritical)
            Stop
        End If
        Dim h1 As Double
        h1 = t1 / ka
        t2 = 15 * T
        w = Int(t2 / h1)
        For j = 1 To ka
            p(j) = 0
        Next j
        j2 = 0 : s = 0 : er = 0 : b1 = 0 : x3 = 0 : q = 0
        For I = 1 To w
            b1 = b1 + h1
            j2 = j2 + 1
            If (l - j2) <= 0 Then
                j2 = 0
            End If
            y = p(1)
            X2 = Math.Abs(y)
            c = 100
            If (c - X2) < 0 Then
                MsgBox("Процесс расходится", vbInformation)
                Exit Sub
                Stop
            End If
            e2 = er
            er = x1 - y
            d1 = (er - e2) / h1
            s = s + er * h1
            y1 = er * a2 + a3 * s + a1 * d1
            If y1 > 2 Then
                y1 = 1.9
            End If
            If y1 <= 0 Then
                y1 = 0
            End If
            x3 = x3 + h1 * (a4 * y1 - x3) / T
            q = q + h1 * (1 - Math.Abs(x3)) ^ 2
            If j2 <> 0 Then GoTo 3820
            ia = 1
            If I >= 20 Then
                ia = I / 10
            End If
            Sumq(0, ia) = y
            Sumq(1, ia) = b1
            With xlSheet1
                .Cells(ia + 1, 1) = q / 10
                .Cells(ia + 1, 2) = y1
                .Cells(ia + 1, 3) = Sumq(0, ia) 'y
                .Cells(ia + 1, 4) = Sumq(1, ia) 'b1
            End With
            kl(ia) = y
            'поиск перегиба по максимуму
            If ia >= 3 Then
                If Sumq(0, ia - 2) < Sumq(0, ia - 1) Then 'kl(ia - 2) < kl(ia - 1) Then
                    If Sumq(0, ia) < Sumq(0, ia - 1) Then 'kl(ia) < kl(ia - 1) Then
                        If kla > 3 Then GoTo dalee
                        SumX(kla) = Sumq(0, ia - 1)
                        With xlSheet2
                            .Cells(2, 1 + kla) = SumX(kla) 'Sumq(0, ia - 1) 'kl(ia - 1)
                            .Cells(2, 4 + kla) = "=ВПР(RC[-3];'переходный процесс'!R2C3:R300C4;2;ЛОЖЬ)"
                        End With
                        kla = kla + 1
                    End If
                End If
            End If
            'поиск перегиба по минимуму
            If ia >= 3 Then
                If Sumq(0, ia - 2) > Sumq(0, ia - 1) Then 'kl(ia - 2) > kl(ia - 1) Then
                    If Sumq(0, ia) > Sumq(0, ia - 1) Then 'kl(ia) > kl(ia - 1) Then
                        If kla > 3 Then GoTo dalee
                        SumX(kla) = Sumq(0, ia - 1)
                        With xlSheet2
                            .Cells(2, 1 + kla) = SumX(kla) 'Sumq(0, ia - 1) 'kl(ia - 1)
                            .Cells(2, 4 + kla) = "=ВПР(RC[-3];'переходный процесс'!R2C3:R300C4;2;ЛОЖЬ)"
                        End With
                        kla = kla + 1
                    End If
                End If
            End If
            '---------------------------------------------------
dalee:
            d2 = 0
            For j = 2 To ka
                d2temp = Math.Abs(p(j) - p(j - 1))
                d2 = d2 + d2temp
            Next j
            c1 = 0.01
            If (c1 - d2) > 0 Then
                oBook.Worksheets("переходный процесс").Activate()
                xlSheet1.Range("A1:C" & ia + 1).Select()
                Dim xlchart As Excel.Chart
                xlchart = oBook.Charts.Add
                With xlchart
                    .SeriesCollection(1).XValues = "='переходный процесс'!R2C4:R100C4"
                    .HasTitle = True
                    .ChartTitle.Text = "график переходного процесса"
                    .ChartType = Excel.XlChartType.xlLineMarkers
                End With
                With xlSheet2
                    .Range("H2").Value = "=C2/B2"
                    .Range("I2").Value = "=D2/B2"
                    .Cells(2, 10) = "=E2/'переходный процесс'!D" & ia + 1
                    .Cells(2, 11) = "=F2/'переходный процесс'!D" & ia + 1
                    .Cells(2, 12) = "=G2/'переходный процесс'!D" & ia + 1
                    .Cells(2, 13) = "='переходный процесс'!A" & ia + 1
                    .Cells(2, 14) = "=100*(1-'переходный процесс'!C" & ia + 1 & ")"
                    .Range("A1:N1").Font.Bold = True
                End With
                'форматирование списков
                For clr = 2 To 13
                    oBook.Worksheets("оптимальные настройки").Columns(clr).ColumnWidth = 6
                Next clr
                oBook.Worksheets("оптимальные настройки").Columns(1).ColumnWidth = 11
                'задание переменных для поиска оптимальных настроек
                qOpt = q
                tOpt = b1
                MessageBox.Show("Конец расчета", "Процесс сошелся", MessageBoxButtons.OK, MessageBoxIcon.Information)
                oExcel.ReferenceStyle = Excel.XlReferenceStyle.xlA1
                'MsgBox("Процесс сошелся. Конец!", vbInformation)
                Exit Sub
            End If
3820:
            For j = 1 To ka
                p(j) = p(j + 1)
            Next j
            p(ka) = x3
        Next I
        m = o + 1
        MsgBox("Переходный процесс продолжительней заданного времени", vbCritical)
        GoTo 3010
    End Sub

Solaar
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 05.02.2005 (Сб) 19:12

Сообщение Solaar » 12.10.2005 (Ср) 13:05

Ни у кого ни каких идей нет, что неправильно я сделал?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 12.10.2005 (Ср) 13:40

Ramzes писал(а):
Krasavica писал(а):Пример кода в студию?! :)

Solaar,Krasavica права :wink:


Почти, на компильнуть проект....
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Solaar
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 05.02.2005 (Сб) 19:12

Сообщение Solaar » 12.10.2005 (Ср) 20:13

2 SEBAS
Просто если есть возможность компильнуть, то могу выложить исходники :)

Solaar
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 05.02.2005 (Сб) 19:12

Сообщение Solaar » 15.10.2005 (Сб) 16:57

спасибо всем тем, кто пытался найти ошибку в моем коде. Я разобрался сам.

Оказывается, достаточно было заменить позднее связывание на ранее и все стало идеально работать т.е.

я заменил
Код: Выделить всё
oExcel = CreateObject("Excel.Application")


на

Код: Выделить всё
oExcel = New Excel.Application()


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

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

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

    TopList