Ошибка при обращении одной формы к другой

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

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

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Ошибка при обращении одной формы к другой

Сообщение AnarCky » 11.11.2007 (Вс) 13:13

В приведенном ниже коде возникает ошибка: "В экземпляре объекта не задана ссылка на объект."
Цель кода - отредактировать текст в одной форме из класса другой формы (удалить заданный символ).
Я сделал так, как мне когда-то на этом же форуме показали... т.е. изменил код конструктора во второй форме:

на первой форме (MainForm) есть RichTextBox, в нем какой-то текст

Код второй формы (Delete):
Код: Выделить всё

    Public Sub New(ByVal mF As MainForm)
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

        FormMain = mF
    End Sub

....
        Dim strText As String

        strText = FormMain.rtxtMain.Text                  *

        If cbDelAll.Checked = False Then

            If strText.IndexOf(ch) <> -1 Then
                strText.Replace(ch, Nothing)
                FormMain.rtxtMain.Text = strText
            Else
                MessageBox.Show("В тексте нет искомого символа!", "Удаление символа из текста", _
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation, _
                                MessageBoxDefaultButton.Button1)
            End If
        End If

код модуля (FormsCall):
Код: Выделить всё

    Public FormMain As MainForm

    Public Sub Del()
        Dim dl As Form = New Delete(FormMain)
        dl.Show()
    End Sub

Но все равно возникает ошибка (там где звездочка) :( В чем дело? объясните пожалуйста!
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 11.11.2007 (Вс) 15:00

rtxtMain public member?

FormMain <> null ?

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 11.11.2007 (Вс) 15:18

А как может быть что FormMain = null,
а что такое null вообще?

Friend With Events rtxtMain...
там такое объявление. я еще подумал менять или нет, но Friend это вроде значит, что переменная доступная всему решению, разве нет?
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 11.11.2007 (Вс) 19:09

Friend = доступно в пределах сборки!
А решение может включать несколько сборок!

null (C#) = nothing (Visual Basic . net)

посмотри в режиме debug? что тебе студия скажет, какой обьект у тебя nothing (null)

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 11.11.2007 (Вс) 20:22

про FormMain не написано ничего.... но пишет что strText = Nothing. можно отсюда сделать вывод, что и FormMain = Nothing? собственно, я же через FormMain обращаюсь к rtxtMain... или я не так рассуждаю?
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 11.11.2007 (Вс) 20:31

то, что он у тебя nothing это понятно, меня интересует что у тебя is nothing в правой части выражения (после равно)
а там у нас есть два обьекта

FormMain
rtxtMain

вот один из них у тебя Nothing? какой именно ты должен понять, потом ты должен понять почему он у тебя nothing
еще свойство text у тебя может быть nothing (что как я понимаю маловерятно (или я неправильно понимаю?))

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 11.11.2007 (Вс) 20:50

что, что а текст точно не nothing :D
проверил следующим образом:
Код: Выделить всё

Dim frm As Form
Dim rtxt As RichTextBox

frm = FormMain
rtxt = FormMain.rtxtMain

меня обломали на последнем выражении... т.е. оператор "frm = FormMain" компилятор проглотил, а "rtxt = FormMain.rtxtMain" не смог => rtxtMain = Nothing.

теперь, про почему: :D хех... что вообще значит "В экземпляре объекта не задана ссылка на объект"? ну нету в моих обех книжках, почти ни слова про исключения... :cry: Что ж это все-таки значит?!
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 11.11.2007 (Вс) 20:59

а значит это то то, что при создании
FormMain
Обьект rtxtMain не создается
смотри код FromMain

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 11.11.2007 (Вс) 21:16

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

...
    Friend WithEvents rtxtMain As System.Windows.Forms.RichTextBox
...
    Me.rtxtMain = New System.Windows.Forms.RichTextBox
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 11.11.2007 (Вс) 21:17

а где у тебя эта строка

Me.rtxtMain = New System.Windows.Forms.RichTextBox

?

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 11.11.2007 (Вс) 21:19

вчитайся в мое последнее сообщение... это цитата из #Region " Windows Form Designer generated code "
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 11.11.2007 (Вс) 23:50

AnarCky писал(а):вчитайся в мое последнее сообщение... это цитата из #Region " Windows Form Designer generated code "

и как я должен по твоему это понять?

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 12.11.2007 (Пн) 7:05

как так? ведь вот: Visual Basic:

...
Friend WithEvents rtxtMain As System.Windows.Forms.RichTextBox
...
Me.rtxtMain = New System.Windows.Forms.RichTextBox

я подразумевал девятое сообщение в топике
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 12.11.2007 (Пн) 11:33

AnarCky писал(а):
как так? ведь вот: Visual Basic:

...
Friend WithEvents rtxtMain As System.Windows.Forms.RichTextBox
...
Me.rtxtMain = New System.Windows.Forms.RichTextBox

я подразумевал девятое сообщение в топике

я понял, что ты подразумевал, как по твоем я должен был догадаться? что именно говорило о том, что это Windows Forms Generated Code?

к твоей проблеме
попробуй friend заменить на public

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 12.11.2007 (Пн) 11:38

безрезультатно... замена Friend with events на Public with events ни к чему не привела.

зы: я понял - надо четче пояснять все свои фразы и исходники :)
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 12.11.2007 (Пн) 11:44

вообщем я туплю маленько по выходным и понедельникам

у тебя таки MainForm = nothing

поверишь наслово или доказать?

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 12.11.2007 (Пн) 12:02

я вообще недоверчивый :) так-что докажи :)
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 12.11.2007 (Пн) 12:07

Код: Выделить всё
Dim frm As Form
Dim rtxt As RichTextBox

frm = FormMain
rtxt = FormMain.rtxtMain


вот этот код

замени на

Код: Выделить всё
Dim frm As Form
Dim rtxt As RichTextBox

if (FormMain = Nothing)
throw new NullReferenceException("Доказываю :)")
End If
frm = FormMain
rtxt = FormMain.rtxtMain

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 12.11.2007 (Пн) 15:32

что ж :D выглядит убедительно... хочешь сказать, что rtxtMain Is Nothing потому что FormMain Is Nothing, да? пусть так, но еще остался открытым вопрос почему...
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 12.11.2007 (Пн) 16:39

откуда я знаю почему, что у тебя сюда передается?

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

    Public Sub New(ByVal mF As MainForm)
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

        FormMain = mF
    End Sub


тут проверку поставь...бли...ты не можешь сам отладить свою программу?

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 12.11.2007 (Пн) 16:52

ну поставил проверку, дак а смысл? там же нет ошибки...
Код: Выделить всё

Public Sub New(ByVal mF As MainForm)
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

        Try
            FormMain = mF
        Catch ex As Exception
            MessageBox.Show("Возникла следующая ошибка: " & ex.Message, "Error", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error, _
                            MessageBoxDefaultButton.Button1)
        End Try
End Sub

вот что передается:
Код: Выделить всё

Module FormsCall

    Public FormMain As MainForm

    Public Sub Del()
        Dim dl As Form = New Delete(FormMain)
        dl.Show()
    End Sub

End Module


нет, не могу. чтоб смочь надо знать как, а если б я знал как, то этого топика не возникло бы
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 12.11.2007 (Пн) 17:56

ты поставил Try
а код корректно отрабатывает
переменной FormMain корректно присваевается null (nothing) она же ссылочная

а если поставить проверку!
в смысле
if mF = nothing then
...
end if

а чтоб знать как, нужно прочесть книгу

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 12.11.2007 (Пн) 18:59

наконец понял, что где и почему Nothing. :)
я передаю в конструктор неинициализированную переменную FormMain. как только инициализировал - сразу ошибка перестала возникать.
Но тогда возникает такая проблема: я передаю в конструктор переменную FormMain (Public FormMain As MainForm = New MainForm), но там RichTextBox пустой, т.к. New, и ясен пень процедура искомый симовл не находит...
как можно обойти это препятствие, одновременно инициализировав переменную и сохранив нужный текст?

две книжки которые у меня есть я прочитал целиком и полностью - там про исключения ни слова не сказано. А третью, поумнее, я еще не купил, так что прошу еще немного потерпеть мои банальные вопросы :D
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..

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

Сообщение Ramzes » 12.11.2007 (Пн) 22:32

Чисто интуитивно

Там, откуда ты вызываешь конструктор текущей формы, ему вместо параметра передай
Код: Выделить всё

me
'например
Form2 frm2= new Form2(Me)


Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 12.11.2007 (Пн) 23:40

AnarCky
из главной формы сделай такой вызов
Код: Выделить всё
    FormsCall.FormMain = Me
тем самым ты передашь переменной "FormMain" ссылку на главную форму.

Или можно так(если вызываешь эту процедуру из главной формы):
Код: Выделить всё
    Public Sub Del(ByVal FRM as MainForm)
        Dim dl As Form = New Delete(FRM)
        dl.Show()
    End Sub

Вызов из главной формы:
Код: Выделить всё
   FormsCall.Del(Me)
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

AnarCky
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 229
Зарегистрирован: 20.11.2006 (Пн) 20:12
Откуда: Россия, Екатеринбург.

Сообщение AnarCky » 13.11.2007 (Вт) 6:06

Получилось. Спасибо большое!
Компьютеры были придуманы чтобы исправлять ошибки людей. Но кто же тогда будет исправлять ошибки компьютера?..


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

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

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

    TopList