I always set the modifiers on my form to private,I don’t like internal nor public.
Till now I used to Invoke like this:
public string Addtext
{
if(InvokeRequired)
{
Invoke((MethodInvoker)delegate
{
textbox.text = value;
});
}
else
textbox.text = value;
}
But adding such property for every member on my form is just not Object Orientated at all.
I want to create a function that will Invoke the parameter(action).I tried my best,but I failed – it requires the form members to be public or internal 🙁
public void PerformActionOnForm(Action<FormMain> action)
{
var form = Form.ActiveForm as FormMain;
object s = action.Clone();
if (form != null)
{
form.PerformAction(action);
}
}
public void PerformAction(Action<FormMain> action)
{
if (InvokeRequired)
Invoke(action, this);
else
action(this);
}
two problems in my code:
It requires the property I’d like to change to be != private 🙁
Doesn’t work if the form is not on focus.
In what way is adding properties for data that needs to be accessed or set outside of the scope of the form “not object oriented at all?” This is really your only option. Code in an anonymous delegate (or any delegate, for that matter) executes in the context in which it was declared. The only facility for getting around visibility issues is reflection, and that is big smelly code smell. Create your properties and use them as appropriate.
As for your second option, I’m assuming that you want to execute this on your “main form”. You have two options here: assume that there is only one instance and keep that as a static property on the class, assigning it in the instance constructor.
The other only works if all of your forms are properly “owned” and the only form with no owner is your main form. In that instance you could do this: