Entwickler-Ecke

WinForms - "Kommunikation" zwischen zwei Klassen


deusr - Di 20.03.07 16:59
Titel: "Kommunikation" zwischen zwei Klassen
Hallo,

vielleicht kann mir einer von Euch bei einem Problem helfen:

Ich habe eine Projektmappe mit mehreren Projekten. Zwei davon sind für dieses Beispiel wichtig. GUI (wird als DLL kompiliert) und Main (ausführbares Programm). Main hat das GUI Projekt als Verweis. GUI soll aber unabhängig von Main arbeiten, deshalb kann / darf ich in GUI auch kein Verweis auf Main erstellen.

Nun möchte ich folgendes machen:

Ich starte das Programm. Es führt


C#-Quelltext
1:
Application.Run(new GUI());                    


aus. Dadurch wird eine Form erzeugt. Die Form enthällt z.B. selbst einen Button "Datei öffnen". Beim Klick auf den Button wird der User aufgefordert, eine Datei auszuwählen. Nun soll jedoch der Dateiname in der Klasse Main landen und dort mit dem Dateinamen gearbeitet werden.

Hat jemand eine Idee, wie man soetwas realisieren kann?


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Di 20.03.2007 um 17:11


Christian S. - Di 20.03.07 17:03

Dann konzipier doch das Fenster, welches die Datei auswählt so, dass es eine Eigenschaft besitzt, in die es die ausgewählte Datei reinschreibt. Wie bei einem openDialog halt, da geht es ja genauso.


deusr - Di 20.03.07 17:07

Ja, das Problem ist aber, dass dann Main - das letztendlich mit dem Dateinamen etwas machne soll - ja nicht weiß, dass der Dateiname tatsächlich gesetzt wurde...


Christian S. - Di 20.03.07 17:10

Dann füg halt 'ne weitere Property ein, die das angibt. Oder mach es über den Rückgabe-Wert von ShowDialog(). Auch wie beim OpenDialog ;-)


deusr - Di 20.03.07 17:50

Nene, ich meine das etwas anders.... Okay, ich wähle eine Datei aus, ich schreib die in eine Propperty rein, ich setze einen Flag, dass der Dialog angezeigt wurde, etc.

Das Problem ist jetzt, dass ich irgendwie die Möglichkeit brauche, anschließend nach dem Auswählen des Dateinamens eine Methode aus Main heraus aufzurufen.


Christian S. - Di 20.03.07 18:04

Ah, so langsam dämmert es. Im Prinzip brauchst Du also ein Event, welches gefeuert wird, wenn eine Datei ausgewählt wird.

Also so:

In der GUI:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    public partial class Form2 : Form
    {
        public delegate void FileSelectedDelegate(string Filename);

        public event FileSelectedDelegate FileSelected;

        private void button1_Click(object sender, EventArgs e)
        {
            FileSelected("Foo");
        }
    }



In der Main-Form:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        private void button3_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.FileSelected += new Form2.FileSelectedDelegate(f_FileSelected);
            f.ShowDialog();
        }

        void f_FileSelected(string Filename)
        {
            MessageBox.Show(Filename);
        }


Dann wird Form2.f_FileSelected aufgerufen, wenn in der GUI-Form eine Datei gewählt wird.


deusr - Di 20.03.07 20:45

Danke! Du bist ein Schatz! Ich hoffe jetzt nur, dass alles andere da auch mitspielt.


deusr - Fr 23.03.07 16:14

Danke! Hat wunderbar funktioniert.

Jetzt habe ich aber noch eine andere Frage zu delegate


C#-Quelltext
1:
2:
            Form2 f = new Form2();
            f.FileSelected += new Form2.FileSelectedDelegate(f_FileSelected);


Angenommen FileSelected wäre kein event in der Klasse, sondern eine normale public static void Methode. Wie kann ich denn auf jetzt eine Methode in der Main Klasse zuweisen? Derzeit verwende ich GUI.Form2.FileSelected, aber diese Deklaration muss ich auf jeden Fall vor


C#-Quelltext
1:
Form2 f = new Form2();                    


treffen, da es sonnst nicht in f drinnsteckt. Kann ich irgendwie f ändern? Damit ich die delegate Zuweisung "irgendwann" nach dem Anzeigen der Form2 setzen / ändern kann?


Christian S. - Fr 23.03.07 16:52

Ich muss Dir leider sagen, dass ich nicht wirklich verstanden habe, was Du machen willst :gruebel: