• 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

    • Have they explained the nuts and bolts as to why it must exist? I deleted thinking it was a glitch with the update. After MS insisting it needs to be there, I turned on ISS then off via the proper features function. The folder showed up, the was removed automatically.
    • Never heard of the game, visually looks like a weird merge of GTA with 3Dmark's benchmarks
    • Atomic Heart is getting a sequel and an MMO RPG spin-off by Pulasthi Ariyasinghe Atomic Heart arrived in 2023 as one of the biggest action game surprises, offering players an alternative history version of the Soviet Union to explore where the player is in the middle of a robot uprising. Just as the original passes 10 million players, developer Mundfish today unveiled two new games at the Summer Game Fest showcase. First up is Atomic Heart 2, a full-fledged sequel that has players returning to the over-the-top retrofuturistic setting for another wacky adventure. The studio promises an expanded RPG system, a story that picks up from the original, bringing back all the fan-favorite characters, as well as an "explosive combat system" that now let players use both hands for their powers and standard weaponry. “Ever since the launch of the original Atomic Heart, we’ve been floored by the unwavering support and enthusiasm of our playerbase. When we set out to create the Atomic Universe, we never imagined that the community would respond with such amazing passion,” shared Robert Bagratuni, Founder and CEO of Mundfish, and Game Director of Atomic Heart 2. He continues, “It’s been hard sitting on this announcement for so long, but today, at Summer Game Fest, we’re incredibly happy to finally and officially announce that Atomic Heart 2 is coming, and it’s bigger and bolder than the original.” Built on Unreal Engine 5, Atomic Heart 2 is coming to PC and consoles. A release window has not been attached to the project yet. Next, the studio revealed it's working on a unique spin-off that's set in the same universe. Dubbed The Cube, it will be a massively multiplayer online RPG shooter experience that has players entering a giant cube structure in the sky for survival. Aside from fighting massive monsters and the cube itself, the unique element comes from how the environment will scramble like a Rubik's cube. This unstable arena will offer players new opportunities without needing to travel large distances in an open world. The Cube does not have a release date attached to it either.
    • Game of Thrones is getting a real-time strategy game on PC: War For Westeros by Pulasthi Ariyasinghe A brand-new game is coming out based on George R. R. Martin's A Song of Ice and Fire universe, and surprisingly, it's a full-fledged real-time strategy game for PC. Titled Game of Thrones: War For Westeros, the new title was revealed at the Summer Game Fest 2025 kickoff show today. Check out the debut trailer below, which features plenty of familiar faces from the television series, as well as fights that many probably wished they saw in the story. It looks like players' actions will have some major deviations from how the storyline actually played out in the series, with major characters dying, switching sides, and having massive wars against each other. Unfortunately, no gameplay was revealed in the trailer. War of Westeros is being developed by PlaySide, which may be familiar to those who have played their previous real-time strategy experience, Age of Darkness: Final Stand. The studio said today that its new project will offer players House Stark, House Lannister, House Targaryen, or even the Night King's forces as factions they can take the role of in their journey. " Each faction offers deeply asymmetric strategies, with signature heroes, armies, and mechanics forged from the brutal legacy of Westeros," adds the company. Infantry, cavalry, siege engines, giants, and dragons will all be available for deployment during battles, both when attacking other factions and when defending. The title will be playable solo to take over the Seven Kingdoms, as well as in multiplayer, where a free-for-all mode will enable multiple players to lead forces against each other for victory. Game of Thrones: War for Westeros is currently only announced for PC, with a Steam page already available for fans to wishlist. A release date, nor pricing, has not been revealed just yet, with the title slated to launch sometime in 2026.
  • Recent Achievements

    • Mentor
      Karlston went up a rank
      Mentor
    • One Month Later
      EdwardFranciscoVilla earned a badge
      One Month Later
    • One Month Later
      MoyaM earned a badge
      One Month Later
    • One Month Later
      qology earned a badge
      One Month Later
    • One Year In
      Frinco90 earned a badge
      One Year In
  • Popular Contributors

    1. 1
      +primortal
      483
    2. 2
      snowy owl
      253
    3. 3
      +FloatingFatMan
      252
    4. 4
      ATLien_0
      214
    5. 5
      Xenon
      150
  • Tell a friend

    Love Neowin? Tell a friend!