• 0

[C#] Is it possible to override the Form class?


Question

Sorry, forgot to say in the topic title that this is C#.

Let me explain what I want to do...

We all know that with Windows Vista brought a new UI font, Segoe UI, but XP still uses Tahoma as UI font. This doesn't help us programmers. I've searched in Google and what I found was to use SystemFonts.MessageBoxFont as the Form's font because all other controls Font properties will inherit from it.

Now, I could do this.font = SystemFonts.MessageBoxFont; before InitializeComponent(); on every single form I use but that will have 2 problems:

1) I'll have to repeat this line for every form.

2) The designer will not be updated accordingly.

If I moved this.font = SystemFonts.MessageBoxFont; into InitializeComponent() itself, then, the designer would be updated but I still would need to do it manually for every form.

My first solution:

Create a class (MyForm, for instance) that inherits from Form and change the properties I need in it's constructor. Then, every form I use in my application must be inherited from MyForm instead of Form. This is simpler than to place the line above in every InitializeComponent(), although, I still have to manually change every from to inherit from MyForm instead of Form.

To sum this up... I'm looking for a way (if possible) to change some default properties of Form without creating a new class that inherits from it, which allows me to make all the needed properties changes in one place and all my forms will still inherit from Form (as they are by default).

Is this possible?

Edited by Nazgulled

15 answers to this question

Recommended Posts

  • 0

What he means is create a class with static methods that you use to create instances of your forms:

public static class FormFactory
{
	public static TForm CreateForm<TForm>() where TForm : Form
	{
		TForm form = Activator.CreateInstance<TForm>();
		form.Font = SystemFonts.MessageBoxFont;

		return form;
	}
}

and then you would use it as such:

Form1 myForm = FormFactory.CreateForm<Form1>();

  • 0

Thanks for the suggestion and the whole code but that's almost like that I'm doing now... It's a different way of doing what I want but it's basically the same thing, what I mean is, I'll still need to manually create an instance for every form.

I may be looking for something that doesn't exist or it's not possible, but that's why I'm asking cause one doesn't know everything ;).

  • 0
  Nazgulled said:
Thanks for the suggestion and the whole code but that's almost like that I'm doing now... It's a different way of doing what I want but it's basically the same thing, what I mean is, I'll still need to manually create an instance for every form.

I may be looking for something that doesn't exist or it's not possible, but that's why I'm asking cause one doesn't know everything ;) .

  Quote
To sum this up... I'm looking for a way (if possible) to change some default properties of Form without creating a new class that inherits from it, which allows me to make all the needed properties changes in one place and all my forms will still inherit from Form (as they are by default).

Is this possible?

I'm confused... The method Antaris illustrated allows you to modify all your forms in one place, and have them all keep Form as their base. I don't know what else you're expecting it to do.

  • 0

Nazgulled, I think you might be getting confused with what is actually going on with your Form types.

Although the designer allows you to (as its name suggests) design the form, the form is still instantiated manually in code, its just that the program generates the code to do so. The factory method I illustrated could be used with your designed forms too. Just change the line of code that usually says:

Application.Run(new Form1());

which is generally found in the generated Program.cs, to this:

Application.Run(FormFactory.CreateForm<Form1>;());

All you are doing is using the factory method to apply any property changes ahead of the instance being returned. It doesn't matter if you use the designer, the Form is still being declared manually.

  • 0

But your method is not very different from my own (inheriting from a sub classed form) and that's not what I was looking for...

If I have 100 forms I'll have to do 100 modifications either using your method or mine and that's what I was looking to avoid... I was looking for a one time global change only, if there was one...

What I'm saying is, using my method, I'll have to inherit all my forms from the sub classed form. Using your method, I'll have to use the FormFactory for every form but there are the type of things I was looking to avoid.

Maybe that's not possible at all, but like I said, I don't know everything, so I just asked...

  • 0

Well, if thats the way you want to do it, do the following:

public class SubclassedForm : System.Windows.Forms.Form
{
	protected override void OnLoad(EventArgs e)
	{		
		base.OnLoad(e);
		this.Font = SystemFonts.MessageBoxFont;
	}
}

What you are doing is subclassing the form and overriding the OnLoad method (this is not the OnLoad event, but the method that will call any event subscribers). What will happen, is that any class that inherits from SubclassedForm will call the OnLoad method (unless the inheriting form overrides the OnLoad method itself, in which case it will need to make a call to base.OnLoad(e)).

To be honest, my personal preference is to go with the Factory pattern, as I believe it is much more flexible.

  • 0

You misunderstood the point... I already knew how to do it with inheritance but that's not what I want. Both solutions force me to do lots of code changes (depending on the number of forms) but that's not what I want. I was looking for a way to do one time change only, without needing to change their base class or how they are initialized.

Like I said, I'm probably looking for something that's not possible so just forget about it. Cause I don't know how to explain myself better than this.

Thanks for all your time guys.

  • 0

Its not that I misunderstood the point, the fact is there isn't a one time change. The Form type is sealed. The Designer type is sealed. VS uses that designer to generate code. It won't automatically set the font, because this is inherited from the base classes. You either need to inherit from the Form type, or follow the factory pattern and set your properties in the one place.

  • 0
  Nazgulled said:
You misunderstood the point... I already knew how to do it with inheritance but that's not what I want. Both solutions force me to do lots of code changes (depending on the number of forms) but that's not what I want. I was looking for a way to do one time change only, without needing to change their base class or how they are initialized.

Like I said, I'm probably looking for something that's not possible so just forget about it. Cause I don't know how to explain myself better than this.

Thanks for all your time guys.

If you have a refactoring tool, like Resharper, you should be able to accomplish the changes pretty easily, but I understand your apprehension. It's a lot of work manually, and a lot of regressions that could be introduced.

Good luck. :)

  • 0
  Antaris said:
Its not that I misunderstood the point, the fact is there isn't a one time change. The Form type is sealed. The Designer type is sealed. VS uses that designer to generate code. It won't automatically set the font, because this is inherited from the base classes. You either need to inherit from the Form type, or follow the factory pattern and set your properties in the one place.

That's exactly what I was asking :)

If that's how things works, I'm ok with it, I just wanted to know if it was or it wasn't possible.

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

    • No registered users viewing this page.
  • Posts

    • ChromeOS M137 goes stable, bringing new Face Control policy and more by David Uzondu Google has brought ChromeOS M137 to the stable channel, and it includes a few focused updates for users and IT admins. A key change is a new policy for managing big groups of Chromebooks. The face control accessibility tool, which Google also updated back in ChromeOS M135, now gets a vital control for managers. A new policy called FaceGazeEnabled lets them switch the feature on or off across a whole school or company. The update also brings a new audio feature called crosstalk cancellation. It aims to create a better sound experience using just the Chromebook's built-in speakers. The software processes audio to make it seem like it is surrounding your head, not just coming from two small points. This tries to copy the feel of a surround sound system or good headphones. Any audio gets a boost, but you will notice it most when watching movies or playing games with directional sound. More accessibility tools have arrived, too. ChromeVox now has a direct keyboard shortcut, Search + O + C, that displays spoken text as braille captions on a connected display. For the poor souls in IT, troubleshooting got a little less painful as well. A new event-based log collection system, when enabled by an admin, will automatically upload relevant logs when something specific fails, like an OS crash or a botched update. Instead of digging through mountains of data, administrators get targeted reports sent straight to them. Here's how to enable it: Turn on the Device system log upload setting. Turn on OS update status reporting—For the Report device OS information setting, select OS update status. Turn on device telemetry reporting on crash information—For the Report device telemetry setting, select Crash information. Google also keeps things sane by limiting these targeted uploads to just twice a day per device. As usual, the update is rolling out slowly. If you do not see ChromeOS M137 for your machine yet, just be patient. This phased release lets Google find and address any issues before the update gets to everyone.
    • LG gram Book 15U50T: Is this lightweight laptop the right upgrade for you? by Paul Hill If you’re in the UK looking for a new mid-range laptop that won’t feel underpowered, check out the LG gram Book 15U50T now because it’s at its all-time lowest price on Amazon UK thanks to a 14% discount from its £699.99 RRP. You can get it now for just £599.99 (Buying link at the end). At this price, the laptop definitely makes this mid-range option much more appealing, it’s also pretty new having only come out in January 2025, so you’re definitely getting more value for your money. The delivery is free and will take a few days to arrive unless you take advantage of a Prime member trial and get it next-day in time for Father’s Day. LG gram Book 15U50T: Key features and who it's for The LG gram Book 15U50T features a 15.6-inch Full-HD (1920x1080) anti-glare IPS display, making it ideal for use in well-lit areas as you won’t see yourself staring back. It’s powered by an Intel Core i5 processor (1334U), 16GB of RAM, and has a very fast 512GB NVMe Gen4 SSD. In my opinion, the storage might be a bit tight for some users; however, the device comes with two M.2 slots if you want to upgrade the storage. The LG gram Book 15U50T is ideal for students or professionals who need a device to carry with them out and about. It has an ultra-lightweight design and weighs just 1.65kg - that’s not too far off a similarly sized MacBook Air, but for a fraction of the cost. In terms of ports, there is an HDMI port, two USB-A ports, and two USB-C ports. There's also a 3.5mm headphone jack if you need to plug in headphones. Other noteworthy details about this laptop include that it's running Windows 11 Home with Copilot integration, it has a HD webcam with a privacy shutter, it uses Dolby Atmos audio for immersive sound, and it has a unique feature called gram Link for multi-device (including Android and iOS) connectivity. Should you buy it? If you are a student or a professional that won’t be doing heavy gaming, or using other super intensive applications, this laptop is a solid pick. It’s lightweight - so easy to carry around, it has an anti-reflective screen - so good in well-lit environments; and it features upgradeable storage slots if 512GB is not enough space. On the downside, this laptop has a mid-range processor that could limit your ability to use high-end professional tools. Another thing I’m not really a fan of here is how opaque LG has been with the battery life. As a portable laptop, you’re obviously going to want to take it on the go where you don’t have a charger handy, but all LG says about the battery is that it has a capacity of 51Wh. According to some online sources, variants of this laptop manage about 7 to 10 hours, so if you need a super long battery life, you might be better off with something like a MacBook Air. So should you buy it? If you’re not going to be doing anything super intensive, but can’t stand underpowered and slow budget laptops then this could be the ideal laptop for you. The £100 discount makes it even more appealing! LG gram Book 15U50T: £599.99 (Amazon UK) / RRP £699.99 This Amazon deal is U.K. 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 UK deals page here. Get Prime, Prime Video, Music Unlimited, Audible or Kindle Unlimited, free for the first 30 days As an Amazon Associate we earn from qualifying purchases.
    • Totally different vehicles. Uber has partnered with Waymo for level 5 autonomous vehicles. Waymo has completed 10 million trips and to date, there have been 696 accidents in 4 years and of those 16 of them appear to have been due to an error by the car. In total airbags have only been deployed 38 times. The technology should always be under review and continued to be improved on, but this is a totally different animal to Tesla FSD PS. no I don't work for them etc. I am an analyst for a market intelligence firm and we have a lot of interest from clients looking at the connected car space for advertising etc. so I have studied them
    • Just seems ridiculous that my 2019 imac is no longer getting the latest macOS. Nowadays a 6 year old PC is still a fairly powerful computer. It could easily run the new OS. I also have a 2015 macbook pro with a 4th gen Intel cpu. Its running sequoia (via OCLP) and can still cope not too bad. My imac is way more powerful. Really puts me off ever buying a mac again, with such short support. Open Core legacy again for me then.
    • But it's not full self driving it's level 2 autonomy. Audi, BMW and Mercedes all have level 3 and make far less noise about it
  • Recent Achievements

    • Week One Done
      somar86 earned a badge
      Week One Done
    • One Month Later
      somar86 earned a badge
      One Month Later
    • Apprentice
      Adrian Williams went up a rank
      Apprentice
    • Reacting Well
      BashOrgRu earned a badge
      Reacting Well
    • Collaborator
      CHUNWEI earned a badge
      Collaborator
  • Popular Contributors

    1. 1
      +primortal
      504
    2. 2
      ATLien_0
      260
    3. 3
      +Edouard
      187
    4. 4
      +FloatingFatMan
      175
    5. 5
      snowy owl
      132
  • Tell a friend

    Love Neowin? Tell a friend!