• 0

Global variables available across multiple forms?


Question

Hey guys, just starting out with some C# programming, and atm I have the following,

frmMain - Form

frmAdd - Form

clsVideoLibrary - Class

frmMain declares a clsVideoLibrary, and loads everything into the class.. all fine and dandy.. however, the Add form adds in new items into the class.. atm, I have to pass everything back into frmMain and create a special function purely for the task (I guess it would depend on how my code is written), which is going to suck, as I'm going to basically redeclare this entire class inside of frmMain. Atm, I'm doing this by passing it frmMain.

Back in the old days of VB6, you used to just declare it as a global variable and stick it inside of a module, and all was well and everyone could access the class. But C# is a real poop about such things!

Is there any easy way to make the class available to other forms? As I'm going to have alot of classes and alot of forms, so it mightn't be entirely practical to pass the class files to the forms by reference or whatever.

w00t, 1234 posts :p

9 answers to this question

Recommended Posts

  • 0

Global variables don't exist in .NET, and rightfully so. It's a bad idea to use global variables, and if you're finding your code needs one, you should probably look at how your code is designed and change some things so you don't need a global variable.

If your Add form is a data collection window that returns data to your Main form, then you can (should?) add a method to your Main form that the Add form will use. You can also create an object to act as a container for the data between your two forms.

  • 0

So you're trying to open an AddForm from the MainForm that will allow the user to input a new video and add it to your Video library, yeah?

In which case id say you need another object... clsVideo. frmMain has an instance of clsVideoLibrary. frmAdd has a public instance of clsVideo. When the user clicks Save/Add in frmAdd you save the new video to the public instance of clsVideo. Then in your MainForm code where you open the AddForm you can do something like:

//Video library
clsVideoLibrary myVideoLibrary = new clsVideoLibrary();

//Open the AddForm
frmAdd objAddForm = new frmAdd();
objAddForm.ShowModal();

//Add the Video entered in the AddForm to the VideoLibrary
myVideoLibrary.Add( objAddForm.myNewVideo )

You'll probably also wanna do some checks to see if its null first - in case they press Cancel on the AddForm or something.

There are ways to do 'global variables' in .Net - Express showed one. But as John said, if you find yourself needing to use them - then you should be re-designing your code.

Oh... and VB6 sucks! :D

  • 0
  $phinX said:

So you're trying to open an AddForm from the MainForm that will allow the user to input a new video and add it to your Video library, yeah?

In which case id say you need another object... clsVideo. frmMain has an instance of clsVideoLibrary. frmAdd has a public instance of clsVideo. When the user clicks Save/Add in frmAdd you save the new video to the public instance of clsVideo. Then in your MainForm code where you open the AddForm you can do something like:

//Video library
clsVideoLibrary myVideoLibrary = new clsVideoLibrary();

//Open the AddForm
frmAdd objAddForm = new frmAdd();
objAddForm.ShowModal();

//Add the Video entered in the AddForm to the VideoLibrary
myVideoLibrary.Add( objAddForm.myNewVideo )

You'll probably also wanna do some checks to see if its null first - in case they press Cancel on the AddForm or something.

There are ways to do 'global variables' in .Net - Express showed one. But as John said, if you find yourself needing to use them - then you should be re-designing your code.

Oh... and VB6 sucks! :D

Hmm, I like, I like alot. :) I have a struct defined for Video already so should be easy to implement. :)

Yeah... but global variables make 'sense'. :( And don't knock VB6, was a great language :( I dunno, I don't like like the idea of having my code thrown all over the place. Inside AddForm it writes the new element to the XML doc, and then adds it to clsVideoLibrary to save my reloading... which I personally see as being related code that should be lumped together....maybe I really should just rip everything out of AddForm and write everything in frmMain? Hmmmmmm

  • 0

Your code isn't "thrown all over the place" in .NET. Rather the opposite; it's organized into objects that make it easier to do your work. Sometimes this may take a little extra work, but in the end, it simplifies things immensely. Global variables make sense to you now, but if/when you learn .NET, you'll discover how truly convoluted VB6 is.

  • 0

Ok, so I have it all working, but I'm getting some warnings,

frmAdd.Add -> Add it!

		public VideoCollection.VideoItem VideoToAdd = new VideoCollection.VideoItem();

		private void btnAdd_Click(object sender, EventArgs e)
		{
			VideoToAdd.CatID = 1;
			VideoToAdd.Title = txtTitle.Text;
			VideoToAdd.Location = txtLocation.Text;
			VideoToAdd.ImageID = Int32.Parse(txtImage.Text);
			this.Close();
		}

frmMain.Show Add Form button

 private void btnShowAdd_Click(object sender, EventArgs e)
		{
			frmAdd MyAddForm = new frmAdd();
			MyAddForm.ShowDialog();

//......XML + collection code here
			   XMLNewAttribute.Value = MyAddForm.VideoToAdd.CatID.ToString();

Atm, I get the following warning,

  Quote

Warning 1 Accessing a member on 'VideoLibrary.frmAdd.VideoToAdd' may cause a runtime exception because it is a field of a marshal-by-reference class C:\Documents and Settings\Phillip\My Documents\Visual Studio 2005\Projects\VideoLibrary\VideoLibrary\Form1.cs 193

Any ideas what that is all about? :\

  • 0

	public struct VideoItem
	{
		public int ID;
		public int CatID;
		public string Title;
		public string Location;
		public int ImageID;
	}

:)

Ok, copying it to a local variable seems to do the trick. Why though? :\

Edited by Pc_Madness
  • 0
  Pc_Madness said:

	public struct VideoItem
	{
		public int ID;
		public int CatID;
		public string Title;
		public string Location;
		public int ImageID;
	}

:)

Ok, copying it to a local variable seems to do the trick. Why though? :\

If it is global then why not make it a class? That way it will be passed around as a reference. Structs will be passed by value.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Go ###### yourself Apple. What an embarassing piece of ###### company.
    • From code to combat: Meta CTO calls for Silicon Valley involvement in military contracts by Hamid Ganji This week, Meta announced a partnership with the defense technology startup Anduril to build next-gen VR/AR extended reality headsets for the US military. Microsoft was given the contract in 2018, and the headsets were supposed to be built based on Microsoft HoloLens. Earlier this year, Microsoft gave up the entire project to Anduril but kept its role as the cloud services provider. Meta's Chief Technology Officer (CTO) is now calling for more Silicon Valley involvement in military contracts. Speaking at the Bloomberg Tech summit in San Francisco (via: Business Insider), Andrew Bosworth said the recent partnership between Meta, Anduril, and the US military could be a "return to grace" for Silicon Valley. "The Valley was founded on a three-way investment between the military, academics, and private industry. That was the founding of it," Bosworth said. Meta's CTO added that building VR/AR headsets for the US military doesn't turn the company into a defense contractor. He also said it was "way too early" to determine whether military contracts would become a business segment for Meta. "So far, it's like a zero. Let's start with one and go from there. I think there's no reason it couldn't be meaningful in the impact that it has," he added. The US military's desire for AI-powered tools and weapons has turned Big Tech into military contractors, whether willingly or unwillingly. Companies like Microsoft, Google, and Meta have a long history of providing services to the military and law enforcement agencies. The relationship between tech firms and the defense segment has always been controversial. In the most recent case, a group of Microsoft employees protested against the company's partnership with the Israeli military, which led to the layoff of the protesting staff.
    • Or run msinfo32! With Windows 11, Microsoft believes it has reinvented the wheel?
    • The long-awaited Nothing Phone (3) is finally coming next month, launch date confirmed by Aditya Tiwari London-based consumer electronics brand Nothing is due to launch its latest flagship in 2025. The company dropped a new teaser for the Phone (3), revealing when the flagship device will be out on the market. Nothing Phone (3) will be unveiled during a live event on July 1 at 1:00 PM ET / 10:00 AM PT / 6:00 PM BST / 11:30 PM IST. It has already created a live event titled "Come to Play" on its official YouTube channel, for which you can add a reminder by clicking on the "Notify Me" button. Nothing CEO Carl Pei has previously dropped several details about the unreleased smartphone. He took part in a social media AMA earlier this year and said Nothing Phone (3) will arrive in the third quarter of 2025. Pei confirmed that Nothing Phone (3) will make its way to the US this time after a dry spell since 2023. However, he didn't specify whether the device will be sold directly or through the beta channel, which currently includes Phone (3a), Phone (3a) Pro, and CMF Phone 2 Pro. The US has been a rocky terrain for Nothing. Its first smartphone was made available through the beta channel, and the Nothing Phone (2) is the only smartphone from the company that has been widely available in the US. The Glyph interface featured on the back of Nothing smartphones has remained a differentiating factor from the start. However, the smartphone maker recently posted a 9-second video in which the Glyph lights on the back of a Nothing smartphone abruptly turn off. "We killed the Glyph Interface," the company said. It makes sense when you check out the Phone (3) teaser and see dot matrix-style lights being flashed in a pattern. Nothing released another teaser about a week ago, featuring the number 3 lit up as dot matrix LEDs. If you're looking for some trivia, Nothing product manager Raymond Zhu estimated in a Q&A video that the company would need to sell about 250,000 Phone (3) units to turn a profit. Answering another question, he added that their biggest weakness is "no one knows us", and the company is struggling to reach the masses without high marketing budgets. Let's wait to see what Nothing has in store for Phone (3) next month other than the new physical button. Speaking of the future of smartphones, the Nothing CEO believes that our entire software experience will eventually be condensed down to just one app.
    • As far as I can remember, no one has done a 4v4 before. 2v2? yes. 3v3? yes.
  • Recent Achievements

    • Week One Done
      jbatch earned a badge
      Week One Done
    • First Post
      Yianis earned a badge
      First Post
    • Rookie
      GTRoberts went up a rank
      Rookie
    • First Post
      James courage Tabla earned a badge
      First Post
    • Reacting Well
      James courage Tabla earned a badge
      Reacting Well
  • Popular Contributors

    1. 1
      +primortal
      403
    2. 2
      +FloatingFatMan
      179
    3. 3
      snowy owl
      174
    4. 4
      ATLien_0
      170
    5. 5
      Xenon
      135
  • Tell a friend

    Love Neowin? Tell a friend!