1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public class HmiFormTools
{
//--------------- Create HmiForm -----------------------
private static Form HmiFormAtCreation = null ;
private static Type HmiFormTypeAtCreation = null ;
private static object[] HmiFormInitObjects = null ;
private static string HmiFormInitMethodName = null ;
private static void InvokeMethodByName(System.Windows.Forms.Form TheForm,string MethodName,object[] TheObjects)
{
System.Reflection.MethodInfo m = TheForm.GetType().GetMethod(MethodName,System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) ;
if (m!=null) m.Invoke(TheForm,new object[] { TheObjects }) ;
else throw new ArgumentException("Internal error : Cannot find method "+MethodName+" for form "+TheForm.GetType().ToString()) ;
}
public static Form Create_HmiForm(Type FormType,int TimeOutInSeconds,string InitMethodName,object[] InitObjects)
{// If form is killed by user action, calling process shall set returned object to null
HmiFormAtCreation = null ;
HmiFormTypeAtCreation = FormType ;
HmiFormInitMethodName = InitMethodName ;
HmiFormInitObjects = InitObjects ;
// Create a new thread from which to start the form
System.Threading.Thread HmiFormThread = new System.Threading.Thread(new System.Threading.ThreadStart(HmiForm_Start));
HmiFormThread.SetApartmentState(System.Threading.ApartmentState.STA) ;
HmiFormThread.Start();
for (int i=0;i<TimeOutInSeconds*4 && HmiFormTypeAtCreation!=null;i++) System.Threading.Thread.Sleep(250) ;
return HmiFormAtCreation ;
}
static public void HmiForm_Start()
{
HmiFormAtCreation = (Form)Activator.CreateInstance(HmiFormTypeAtCreation,true) ;
InvokeMethodByName(HmiFormAtCreation,HmiFormInitMethodName,HmiFormInitObjects) ;
HmiFormTypeAtCreation=null ; // in order to indicate the end of init
Application.Run(HmiFormAtCreation);
}
static public bool HmiForm_Close(Form HmiForm,EventHandler KillTheFormEventHandler)
{ // use that routine, when calling process wants to close the form
// example : HmiForm_Close(ref HmiTestForm,new EventHandler(HmiTestForm.KillMe)) ;
// HmiTestForm = null ;
bool Result=true ;
if (HmiForm!=null) try { HmiForm.Invoke(KillTheFormEventHandler) ; HmiForm.Dispose() ; }
catch { Result=false ; } ;
return Result ;
} |
Partager