|
( Form 1 )
Dim frm2 As New form2
Public Sub ClearProject()
frm2.TextBox1.Visible = False
frm2.Hide()
End Sub
( Form 2 )
Dim frm1 As form1
Public Sub Button1_Click(Byval sender as System.Object,Byval e as EventArgs)Handles Button1.Click)
frm1.ClearProject()
End Sub
An unhandled exception of type 'System.NullReferenceException' has occurred
Addtional Information: Object reference not set to an instance of an object
Anyone knows why there is such an error?
|
|
|
|
|
I presume you are trying to reference frm1 (as a form1 object) from the form 2 code yet you have neither created a new instance of the form via Dim frm1 as New form1 (an explicit Set frm1 = New form1 in the frm2 Load event would be better) nor passed a reference to it to the frm2 object.
The code sample you've provided also shows that you have a circular reference between the two forms. Not a good idea.
...Steve
|
|
|
|
|
Anonymous wrote:
Dim frm2 As New form2
I assume you're showing this modelessly ?
Anonymous wrote:
Dim frm1 As form1
This is a new instance of Form1, not the one that created form2. You should use delegates to do this sort of thing, or otherwise, you need to pass the instance of Form1 into Form2.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
frm1 is my main form, and it will call frm2. I will get the error after i click the button that is in frm2. I tried (Dim frm1 As New form1) but it will only give another error.
Sorry but i still don't understand where the problem lies..
|
|
|
|
|
Anonymous wrote:
I tried (Dim frm1 As New form1) but it will only give another error.
Of course, that's a NEW Form1. You need to pass the existing Form1 in as a function parameter, so it's the same one that holds the Form2 instance.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Erm..so how do I do that?
|
|
|
|
|
In Form2
private Form1 form1 = null'
private Form2(){} // Private constructor so it cannot be called
public Form2(Form1 parent)
{
form1 = parent
}
That's C# without ;, you need to convert it into VB. Then you create the instance of Form2 from Form1, passing in this ( is it Me in VB ? ). Or, the nicer way, is to set up delegates so that Form2 fires an event to Form1 to ask it to do whatever.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Form2 really shouldn't know about or be doing anything with Form1 in the first place. It's just not good OOP practice.
' Form2 code
Public Class Form2
Public parentForm As Form
Private Sub ......whatever......
parentForm.whateverFunctionOrProperty
End Sub
End Class
' Form1 code
Dim myNewForm As New Form2
myNewForm.parentForm = Me
myNewForm.Show()
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Dave Kreskowiak wrote:
Form2 really shouldn't know about or be doing anything with Form1 in the first place. It's just not good OOP practice.
Agreed - but surely having a system where form1 is a property, and not a constructor argument, and then requiring it to be set, is even worse ?
This question is asked so many times, and I always say that the way to go is to use events, but no-one ever seems to care...
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
I agree with you, but it's simpler to understand and explain to someone new to the world.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
I guess, but I thought the 'pass a copy of the form to the constructor' solution was ugly enough
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
I wasn't sure what to use for my project, thus i used 2 forms.
(My project)
In my main form, I choose a test. A new form(?) appears to allow the user to type some details about the test in a textbox. Then I can click a Save button, that is on the new form(?), to save the details.
I thought using a new form was ok, but if it is considered bad practice, any suggestions to what other ways are there? I have the SaveTest() method in my main form, but when I use frm1.SaveTest() on that Save button to call the method from my main form, I get that error. Hope what I'm saying makes sense
|
|
|
|
|
And I'm using Vb.Net..
This is my first graded project for Vb.Net as well, so yeah..i appreciate any help thanks!
|
|
|
|
|
Hi
Use ByRef instead of ByVal and pass the form which you want to call and then check out
|
|
|
|
|
Anonymous wrote:
I thought using a new form was ok
Of course it is, how else would you do it ?
Anonymous wrote:
if it is considered bad practice
No, passing one form to another is bad practice. Using a delegate to call one form from another is much nicer.
Anonymous wrote:
I have the SaveTest() method in my main form, but when I use frm1.SaveTest() on that Save button to call the method from my main form, I get that error
Because it's not the same Form1 that created Form2, it's an uninitialised form variable. Like I said.
Passing the same instance is a quick fix, setting up an event is much nicer, but a little more code. MSDN for delegates to get the idea.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Mark, have you considered the Rich Edit control? This accepts text in RTF format which may do what you want.
...Steve
|
|
|
|
|
Sorry my daughter deleted my 1st message.
|
|
|
|
|
I'm new to VB, but I'm trying to write a program where I can retrieve text from a text box after the program is shut down. I'm starting with SaveSettings, but it requires the "section" as a string from which I am wanting to save the text. What is a "section" so I might know what to type in.
I've seen a bazillion code examples of how to do this, but they all have been way over my head. It doesn't seem like it should be that complicated to do this?
|
|
|
|
|
Roofus01 wrote:
retrieve text from a text box after the program is shut down.
Uhhh...maybe I'm missing something here, but if the application is shutdown, the TextBox doesn't exist any more.
Are you saying that you want to save the strings in your textboxs so that you can retrieve them and fill in the textboxs again the next time the application is started?
The section name is any arbitrary name you want. You could call it TextBoxSettings for all it cares. It's just a name to help organize your settings, kind of like a folder.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Yes...basically, I want to be able to enter data in the textbox of my program, so when the program is started again, the information that I entered will appear again in the same textbox.
Does that make more sense? Thanks for your reply.
|
|
|
|
|
SaveSetting stores values in the Registry. The values you specify determine the location of the entry in the registry. The location translates to:
HKEY_CURRENT_USER\Software\VB and VBA Program Settings\<AppName>\<Section>\<Key>
You can set the Section value to any you want to organize the values you save. The basic idea is that the combination of AppName, Section, and Key must be unique.
|
|
|
|
|
To see if I'm close here...I've got a "test" program I'm writing called "Save Data Test". The program has one text box and two buttons. One button is for saving the data and one is for loading the data back into the text box. The code I have for the save button is:
SaveSetting("Save Data Test", "Form1", "Textbox1", "Text")
The one for the load button is:
GetSetting("Save Data Test", "Form", "Textbox1", "Text")
Obviously I'm off here because it doesn't work, but am I close?
I do appreciate all the help.
|
|
|
|
|
Roofus01 wrote:
GetSetting("Save Data Test", "Form", "Textbox1", "Text")
If you're getting something, then you need to put it in a variable. You're close, but you need to store the result of GetSetting in a variable, then use that to specify your text.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
That makes sense, Christian. Thanks!
|
|
|
|
|
Dim MyText As String
MyText = Textbox1.Text
SaveSetting("Save Data Test", "Form1", "Textbox1", MyText)
.................
GetSetting("Save Data Test", "Form", "Textbox1", MyText)
Textbox1.Text = MyText
|
|
|
|