Klassen verknüpfen



  • hi!
    ich versuch gerade ein Comport Terminal meinem Bedürfnissen anzupassen. Das Programm ist mit VB in C# geschrieben.

    Ich hab das Programm um eine Eigene Userform erweitert. Jetzt möchte ich aus meiner erstellen Klasse die Elemente, z.b. die Textbox ansprechen. Das Klappt leider nicht so wie ich mir das vorstelle. Hier erst mal ausschnitte der beiden Klassen:

    public partial class MainForm  : System.Windows.Forms.Form
        { 
            public MainForm() 
            { ....}
    
         ....
         public MEINEUSERFORM MyUserForm = new MEINEUSERFORM();
         internal MainForm MyMainForm; 
         ....
    
            private static MainForm transDefaultFormMainForm = null;
            public static MainForm TransDefaultFormMainForm
            { 
            	get
            	{ 
            		if (transDefaultFormMainForm == null)
            		{
            			transDefaultFormMainForm = new MainForm();
            		}
            		return transDefaultFormMainForm;
            	} 
            }     
         ....
            public void set_textbox(string x)
            {
                rtbMonitor.text = x;
            }
        }
    

    und

    public partial class MEINEUSERFORM  : Form
        {
            public TB_Control_Panel()
            {
                InitializeComponent();
            }
    
            private MainForm My_MyMainForm = new MainForm();
    
            private void tb_start_Click(object sender, EventArgs e)
            {
                My_MyMainForm.set_textbox("test") 
            }
    
        }
    

    Problem an dem code ist, das er eine Instanz der Mainform erstellt. Auch versucht hab ich das Objekt MyMainForm im Konstruktor mit zu übergeben also:

    public MEINEUSERFORM MyUserForm = new MEINEUSERFORM(MyMainForm);
    

    und dieses dann zu nutzen, das hat aber leider auch nicht funktioniert...

    jemand eine idee??



  • Was genau hat an der Konstruktur-Idee nicht funktioniert?

    MfG SideWinder



  • es kommt die Fehlermeldung:

    "Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in COM Port Terminal.exe aufgetreten.

    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    in der Zeile My_MyMainForm.set_textbox("test")



  • Wahrscheinlich hast du im Konstruktor vergessen die Form zuzuweisen.

    Meine Meinung: Beschäftige dich mit einem Beginner-Tutorial für C# bevor du dich an Form-Entwicklung ranmachst, dir scheinen da noch einige Grundlagen zu fehlen!

    MfG SideWinder



  • so hab ich das gemacht! das meinst du doch oder?

    public partial class MEINEUSERFORM : Form
        {
            public MEINEUSERFORM (MainForm obj)
            {
                My_MyMainForm = obj;
                InitializeComponent();
            }
    
            private MainForm My_MyMainForm;
    ....
    

    edit:

    Obj ist beim aufruf des Konstruktors NULL ... ka warum



  • Das sieht soweit richtig aus, wahrscheinlich übergibst du bereits null an den Konstruktor. Wie hast du das übergebene obj angelegt?

    MfG SideWinder



  • mit:

    public MEINEUSERFORM MyUserForm  = new MEINEUSERFORM (MyMainForm);
    

    MyMainForm ist jedoch beim Aufruf dieser Zeile NULL... das erklärt den Fehler, aber wieso ist es NULL?



  • zwei änderungen hab ich vergessen zu erwähnen die mainform sieht jetzt so aus:

    public partial class MainForm  : System.Windows.Forms.Form
        {
            public MainForm()
            { ....}
    
         ....
         public MEINEUSERFORM MyUserForm  = new MEINEUSERFORM (MyMainForm);
    
         static MainForm MyMainForm = new MainForm();   //hier die Änderung
         ....
    
            private static MainForm transDefaultFormMainForm = null;
            public static MainForm TransDefaultFormMainForm
            {
                get
                {
                    if (transDefaultFormMainForm == null)
                    {
                        transDefaultFormMainForm = new MainForm();
                    }
                    return transDefaultFormMainForm;
                }
            }    
         ....
            public void set_textbox(string x)
            {
                rtbMonitor.text = x;
            }
        }
    

    dadurch ist MyMainForm != Null , aber es wird wieder eine instanz der Klasse erstellt

    hier noch der Start des Programms:

    static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                    Application.Run(new MainForm());
                }          
            }
    

    ----

    Lösung:

    static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                mf = new MainForm();
                    Application.Run(mf);    
            }
            public static MainForm mf = null; 
        }
    

    und dann in der eigenenklasse einfach sowas wie

    Program.mf.set_textbox("Hallo");
    

    danke fürs Anschaun und einen schönen Abend wünsch ich noch! Grüße Ajax


Log in to reply