• 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

    • Stylish Samsung Galaxy S25 Edge gets 20% discount sending it to lowest price by Paul Hill If you’re in the market for a powerful, stylish phone, then you may be interested in the Galaxy S25 Edge, which is now reduced to $969.99, down 20% from the $1,219.99 list price. This is the lowest price that the device has been at on Amazon. You can get the device at this price if you go for the Titanium Icyblue or Titanium Silver editions. These models are the top-end S25 Edge variants with 512GB of storage. While this Samsung device may be about as thick as a pencil, it’s constructed from titanium and uses Corning Gorilla Glass Ceramic 2 on the display. This should ensure durability, despite its thin design. The thickness of this phone is just 5.8mm, and it weighs 163g. Camera capabilities and AI enhancements The Galaxy S25 Edge's camera system is impressive. It has a 200MP main camera with optical image stabilization and a 2x optical quality zoom. This feature magnifies the image using optical mechanisms in the camera lens so that the zoomed image retains its original clarity, detail, and resolution of the scene. On the back, there is also a 12MP ultrawide camera with autofocus and on the front, there’s a 12MP camera. Like many phones coming out now, there are AI-powered camera features such as Night Video, Best Face for group shots, Portrait Selfie, and Gallery Search by description. Notably, there is no dedicated telephoto lens like in the S25+ and S25 Ultra. This is a tradeoff that the company decided to make to achieve its ultrathin design. Telephoto lenses are camera lenses that are designed to make distant objects appear closer and larger in your photos and videos. The absence of this telephoto lens may be a deal breaker for those looking to use this camera for professional shots; otherwise, it’s still very impressive, especially with that 200MP main camera. Performance, display, and integrated AI features The S25 Edge is powered by the Snapdragon 8 Elite chipset, specifically the 3-nanometer Qualcomm SM8750-AB. It has an octa-core CPU (2x4.47 GHz Oryon V Phoenix L + 6x3.53 GHz Oryon V2 Phoenix M) and an Adreno 830 GPU. This model's display is a 6.7-inch QHD+ Dynamic AMOLED 2X with a 120Hz adaptive refresh rate and high brightness. This device has plenty of other AI features too, outside of the camera, including Cross App Action, Audio Eraser for videos, Now Brief/Now Bar for personalized information, and of course, Google Gemini. With 12GB of RAM, the specs on this phone are really very good. It should be capable of doing most tasks you throw at it, including gaming. You may wonder if it will handle games well, given that the thin design means it could overheat. Samsung has already thought about this and included a reconfigured vapor chamber that helps to keep the phone cool. Battery life and charging speed: The main compromise Aside from the removal of the telephoto lens, this phone also has a drawback in terms of battery life. Its 3,900 mAh battery capacity means it’s smaller than many other devices, even compared to budget phones. Another disappointing aspect is the charging, where the wired charging speed is limited to 25W—that’s lower than what you find on very affordable Xiaomi POCO devices. This battery limitation might make this device a bad choice if you’re away from a charger for long periods. One affordable way to mitigate this downside is by carrying a portable charger, but still, it’s ironic that you buy a thin phone to be lighter and then end up carrying a brick-sized charger around with you. You could also just bring your charger and plug it into an outlet. Is the Galaxy S25 Edge the smart buy for you? If you’re someone who wants a sleek, lightweight phone that has a premium build and can easily slice through tasks you throw at it, then the Galaxy S25 Edge is very likely for you. It’s also great for anyone looking for a standout camera that doesn’t need a telephoto lens. However, if you need a device with all-day battery life because you’re going camping or to the middle of nowhere, then you could probably find a better fit with a longer battery life. If this device is for you, check out the links below. Samsung Galaxy S25 Edge (Titanium Icyblue): $969.99 (Amazon US) / MSRP $1,219.99 Samsung Galaxy S25 Edge (Titanium Silver): $969.99 (Amazon US) / MSRP $1,219.99 This Amazon deal is US-specific and not available in other regions unless specified. If you don't like it or want to look at more options, check out the Amazon US deals page here. Get Prime (SNAP), Prime Video, Audible Plus or Kindle / Music Unlimited. Free for 30 days. As an Amazon Associate, we earn from qualifying purchases.
    • I got too many apps I use actively. Theres been too often I completely blank on the name of the application and had to manually look through the list for it. Now I'm using Start11 and got my apps sorted in the Start menu by categories so that if I'm looking for Krita i can find it under "Art editors". If MS are going to change it, they should consider making automated categories. Seen some Linux distros do that. But if they do, theres probably gonna be a lot of wrongly categorized apps though, unfortunately.
    • LAV Filters 0.80.0 by Razvan Serea LAVFSplitter is a multi-format media splitter that uses libavformat (the demuxing library from ffmpeg) to demux all sorts of media files. LAV Splitter is a Souce Filter/Splitter required to demux the files into their separate elementary streams. LAV Audio and Video Decoder are powerful decoders with a focus on quality and performance, without any compromises. Supported Formats: MKV/WebM, AVI, MP4/MOV, MPEG-TS/PS (including basic EVO support), FLV, OGG, and many more that are supported by ffmpeg! LAV Filters are based on ffmpeg and libbluray and is aimed to offer a all-around solution to perfect playback of file-based Media as well as Blu-rays. LAV Filters 0.80.0 changelog: LAV Splitter NEW: Introduced the IURLSourceFilterLAV interface to allow opening URLs with custom user agent and referrer NEW: Added support for WebP images Changed: Increased the length of the advanced subtitle selection field, so its no longer cut off after 255 characters Changed: Improved buffering behavior on badly interleaved video files Fixed: Audio streams with an unknown/unsupported codec are no longer selected for playback, as long as others are present Fixed: Improved accuracy of reported FPS from AviSynth scripts LAV Video NEW: D3D11 support for HEVC 4:2:2 and 4:4:4 hardware decoding NEW: Dolby Vision extension metadata is exported for renderers to use Changed: Added additional media types to support more video streams Changed: Updated dav1d for significant AV1 decoding improvements Fixed: Improved handling of H.264 4:4:4 files encoded by certain versions of x264 Fixed: VP9 DXVA2/D3D11 decoding could result in artifacts on some clips Fixed: Decoding ProRes reports more accurate color details LAV Audio Changed: Added support for additional ADPCM audio codecs Download: LAV Filters 0.80.0 | 15.5 MB (Open Source) View: LAV Filters Website | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Haven't really used it much for years, not specific to Windows 11.. it's there but I mostly ignore it. I do install StartAllBack though bust mostly for the other bits that it brings. I prefer the "alt-space" type launchers (KRunner in Plasma, Flow in Windows or the like), a lot less clutter and more smarts like bookmark/history searches and other useful plugins.
  • Recent Achievements

    • First Post
      emptyother earned a badge
      First Post
    • Week One Done
      Crunchy6 earned a badge
      Week One Done
    • One Month Later
      KynanSEIT earned a badge
      One Month Later
    • One Month Later
      gowtham07 earned a badge
      One Month Later
    • Collaborator
      lethalman went up a rank
      Collaborator
  • Popular Contributors

    1. 1
      +primortal
      675
    2. 2
      ATLien_0
      277
    3. 3
      Michael Scrip
      220
    4. 4
      +FloatingFatMan
      168
    5. 5
      Steven P.
      161
  • Tell a friend

    Love Neowin? Tell a friend!