Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Kommunikation zwischen zwei Forms

Moderationshinweis von herbivore (29.01.2006 - 20:15)

Dies ist ein Thread, auf den aus der FAQ ([FAQ] Kommunikation von 2 Forms) verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!

Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

Themenstarter:

Kommunikation zwischen zwei Forms

beantworten | zitieren | melden

Hallo,
Ich habe ein ein Hauptfenster(Form1) und ein anderes Fenster(Form2), welches zum auswählen einens Verzeichnisses dient. Wie kann ich von der Form1 aus den ausgewählten Pfad abfragen?

Ich habe eine Idee, die aber nicht(sehr gut) funktioniert:
1. Global die Form2 instaziieren
2. Die Form2 öffen,
3. Verzeichniss auswählen,
4. In der Form2 eine globale Variable mit dem Pfad füttern
5. In der Form1 beim schließen der Form2 einen Event auslösen, der die globale Variable aus Form2 abfragt!

Ok, das geht soweit auch ganz gut, aber wenn ich jetzt nochmal ein Verzeichniss auwählen will, kommt eine Fehlermeldung, weil die Form2 schon deletet wurde und nun nicht mehr global instanziiert werden kann!
Ich währe dankbar, wenn mir jemand helfen könnte!

mfg
Franknstein
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
Vellas
myCSharp.de - Member



Dabei seit:
Beiträge: 842

beantworten | zitieren | melden

Mache eine neues Formular (nur Code) die zur Dateiverwaltung ist und diese soll speichern welche Datei geöffnet wurde. Von diesem Formular sind dann sowohl das Hauptformular als auch das zweite Formular abhängig.
Du solltest sowieso alles was sich einfach berechnen, speichern oder prüfen (z.B. felder) lässt über ein eigenes Formular erledigen lassen welches von dem ersten und zweiten aufgerufen wird. Dabei machst du dir Methoden und übergibst die Werte aus den Feldern einfach an die jeweilige Methode.
Was man aber niemals macht ist 2 Forms voneinander abhängig machen, deswegen der Vorschlag von der dritten Form (nur Code, ohne ein Fenster zu öffnen). Was du dann machen kannst ist mit den Rückgabewerten der Methoden arbeiten.
.oO(Das ich Delphi lernen muss scheint doch etwas zu bringen....)


Code-Hacker
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

Themenstarter:

beantworten | zitieren | melden

Hm, irgentwie sagt mir diese Möglichkeit nicht so zu!
Kennst du noch eine andere?
An sonsten werde ich das wohl so machen!


Aber trotzdem erstmal besten dank für deine Hilfe!!![/b]
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
Vellas
myCSharp.de - Member



Dabei seit:
Beiträge: 842

beantworten | zitieren | melden

Ja, du machst die eine Form in der anderen bekannt, allerdings sind diese beiden dann total abhängig voneinander und sowas soll man schließlich nicht. Man soll unabhängig bleiben und da ist die von mir og. Lösung am Besten. 2 greifen auf ein anderes Formular zu ist ok, aber nicht gegenseitiges Austauschen, damit machst du das Programm nicht wirklich komfortabel für dich und andere.
Beide Formulare greifen auf ein drittes zu, welches zur Verwaltung von Daten besteht. Die Form selbst mit dem Event-Handler usw. die ist eigentlich ausschließlich für interaktionen mit dem Formular gedacht (Eingabe annehmen, über 2. form bearbeiten und Ergebnis zurück geben), alles was man an Berechnungen und Verwaltungssachen auslagern kann sollte auch ausgelagert werden.


Code-Hacker
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

Themenstarter:

beantworten | zitieren | melden

Ok, dann mach ich das so, wie du das oben beschrieben hast!
Wie kann ich jetzt zwischen den Formen untereinander zugreifen, sprich einen Event in der ersten Form über die zweite Form auslösen, wenn die dritte geschlossen wird?
Hast du da zufällig Beispielcode?

mfg
Franknstein

Edit:
Also, ich bin mitlerweile soweit, das ich das mit den events hinbekommen habe! Aber mich interressiert es, ob man denn von der Steuerform aus Textbox oder Labelinhalte ändern kann...
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
Vellas
myCSharp.de - Member



Dabei seit:
Beiträge: 842

beantworten | zitieren | melden

Die dritte Form enthält keine sichtbare Form, nur verwaltenden Code. Ich habe leider kein Beispiel für C#, nur für Delphi und diesen Code darf ich durch ein Verbot der Schule nicht rausgeben, da ich sonst von den Übungen ausgeschlossen werde (obwohl sich jeder Nicht-Schüler der Schule dise Übungen auch ziehen und veröffentlichen kann).

Die zweite Form ruft du ja auf, das wird durch das anklicken von einem Button oder so aufgerufen. Von dieser form kannst du die einen DialogResult zurück geben lassen, mit dem du prüfen kannst was angeklickt wurde. Deine ausgewählte Datei speicherst du in einer Variablen in der 3. Form auf diese kannst du von Form1 aus zugreifen.

Die Events untereinander würde ich gar nicht auslösen, aber wenn du es doch willst, dann geht das indem du die Parameter übergibst. Da diese meistens eines Sender-Variable haben und du bei einer anderen Event-Methode diese auch hast, kannst du einfach diesen Sender mit übergeben.

Formulardaten wie Labelwerte oder so kannst du nur über die eigene Form ändern. TextBox.Text = "Hallo"; wäre ein Beispiel dafür. Diese Anweisung steht in einer Method des Formulars mit dieser TextBox. Wenn du den Wert von Form2 aus ändern möchtest übergebe ihn an deine Form3 in einer Variable und rufe diese von Form1 ab und übergebe sie der TextBox (oder was auch immer).


Code-Hacker
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

Themenstarter:

beantworten | zitieren | melden

Hat dir schonmal jemand gesagt, dass du geniale Ideen hast?

Also, ich hab das jetzt so gemacht, wie du gesagt hast! Somit habe ich auch die ganzen anderen Codeteile sehr wartungsfreundlich untergebracht.

Das beste an dieser Idee ist es aber, dass wenn das Programm sehr schnell sein soll, dass man den Arbeitscode grade in C++ verfassen kann, ohne die Gui neu zu machen!

mfg
Franknstein
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
Vellas
myCSharp.de - Member



Dabei seit:
Beiträge: 842

beantworten | zitieren | melden

*G*
Das war gar nicht mal so meine Idee. Das nennt man Modularisierung und ist ein Konstrukt der OOP, so unabhängig wie möglich zu sein. Außerdem habe ich das auch besonders durch die Delphi-Vorlesungen und -Übungen gelernt.
Wie gesagt, Programme sollen so Formunabhängig sein wie Möglich, also nur Ein- und Ausgabe soll darüber geschehen. Wenn du dir das merkst und auch für solche formunabhängigen Dateien weitere Dateiunterteilungen machst wo es Sinnvoll ist, dann wirst du eine bessere Übersicht und Wartungsmöglichkeit deiner Programme haben.

Ich kann ja mal, wenn interesse besteht und weil ich demnächst Ferien habe, so eine kleine Merkliste posten.


Code-Hacker
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

Themenstarter:

beantworten | zitieren | melden

Ja, gerne wenn es nicht zu viel Arbeit macht!
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
cdr
myCSharp.de - Member



Dabei seit:
Beiträge: 980
Herkunft: Zürich

beantworten | zitieren | melden

gut, da werde ich dann als OO-Fanatiker auch noch meinen Senf dazugeben (ob ihr wollt oder nicht) ...
private Nachricht | Beiträge des Benutzers
iberendes
myCSharp.de - Member



Dabei seit:
Beiträge: 50

beantworten | zitieren | melden

Ich habe nach dieser Idee mein Programm jetzt erstellt.
Aber es will diesen Wert in der Variablen nicht speichern.
Mein "Zwischenform" sieht so aus:


using System;

namespace uebergabe
{
	public class chatalle
	{
		public int adminmode;

		public void setAdminmode(int para)
		{
			adminmode = para;
		}
		public int getAdminmode()
		{
			return adminmode;
		} 
	}
}

Er speichert den Wert in adminmode weder so:

uebergabe.chatalle owertchatalle = new uebergabe.chatalle();
owertchatalle.adminmode = 1;
noch so:

uebergabe.chatalle owertchatalle = new uebergabe.chatalle();
owertchatalle.setAdminmode(1); 
private Nachricht | Beiträge des Benutzers
suny
myCSharp.de - Member



Dabei seit:
Beiträge: 127
Herkunft: Thüringen

beantworten | zitieren | melden

Wenn ich den Thread richtig verfolgt habe dann, sollen zwei Forms miteinander kommunizieren und dies über eine dritte Klasse.

Da sollte dein oben stehender Code eigentlich laufen, bis auf das noch die Singelton fehlt. Das ist notwendig, damit beide Forms auf die gleiche Instanz der Klasse zurück greifen. Sonst erstellen diese immer wieder eine neue Instanz.

Damit man eine Klasse Singelton fähig ist braucht man nicht viel.


public class ExampelSingelton
{
private static ExampelSingelton my_instanz;

private ExampelSingelton()
{
.....
}

public static getExampelSingelton()
{
if(my_instanz == null)
{
 my_instanz = new ExampelSingelton();
}
return my_instanz;
}

So jetzt können deine beiden Forms auf ein und die selbe Instanz zugreifen und somit Werte übergeben.

Im allgemeinen würde ich dieses Problem mit Eventhandling / Interface lösen.
So das der Code der beiden Forms nur in einer Klasse hinter den Forms liegt, so kann man innerhalb von kurzer Zeit eine Desktop-Anwendung auf eine Web-Anwendung umstellen oder GTK+.
private Nachricht | Beiträge des Benutzers
Vellas
myCSharp.de - Member



Dabei seit:
Beiträge: 842

beantworten | zitieren | melden

Hi!

Das geht aber genauso gut ohne das man die Klasse zu einer Sington-Klasse macht. Ich habe es das letzte mal so realisiert das das Objekt der Klasse, in der die Daten gespeichert werden, per Referenz übergeben wird. Wenn die neuen Daten am Ende in Orndung sind werden sie geschrieben und ich habe in der ersten Form Zugriff auf die neuen Daten. Man könnte das Objekt natürlich auch kopieren und eine Funktion schreiben die einem das Objekt aus der zweiten Form nach dessen Beendigung zurückgibt.
(Ich habe C++/CLI verwendet.)

@iberendes:
Du benutzt auch keine Accessoren, somit kann das erste Beispiel nicht funktionieren. Aber die zweite Variante funktioniert auf jedenfall.


Code-Hacker
private Nachricht | Beiträge des Benutzers
SteelWarrior
myCSharp.de - Member

Avatar #avatar-2025.gif


Dabei seit:
Beiträge: 99

beantworten | zitieren | melden

In suny's code war ein Fehler, welches ich durch probeieren entdeckt habe.

Hier korrigierter Code:


    public class ExampelSingelton
    {
        private static ExampelSingelton my_instanz;

        private ExampelSingelton()
        {
            // nada todo
        }

        public static ExampelSingelton getExampelSingelton()
        {
            if(my_instanz == null)
            {
                my_instanz = new ExampelSingelton();
            }
            return my_instanz;
        }
    }

Ich habe auch nun die Klasse Singelton, wie folgt in meiner Form in der Methode frmMain aufrufen können:


    public partial class frmMain : Form
    {
        ExampelSingelton _ExampelSingelton;

        public frmMain
        }
            _ExampelSingelton  = ExampelSingelton.getExampelSingelton();
            _ExampelSingelton.Changed += new EventHandler(_ExampelSingelton_Changed);
        }

        void _ExampelSingelton_Changed(object sender, EventArgs e)
        {
            //something todo
        }
    }
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von SteelWarrior am .
1. Googlen 2. Boardsuche benutzen 3. Überlegen 4. Posten

Ich sage es nur äußerst ungerne,aber darf man in Foren/wo auch immer eine klitzekleine Frage stellen,ohne dass gleich ein Oberlehrer mit der obligatorischen "Google suchen"-Antwort kommt?
private Nachricht | Beiträge des Benutzers