Problem mit zuweisung
-
Hallo
könnte mir einer Helfen bei einem Problem, und zwar ich habe 2 Form's , auf dem StartForm ist ein lable1 und ein Button1 .
Wenn das Button1 gedrückt wird öffnet sich Form2 mit einen Button2. Wenn Button2 gedrückt wird soll ein String a auf das lable1 der StartForm ausgegeben werden! Und das klappt nicht!
Es erscheint
Für das nicht statische Feld, die Methode oder die Eigenschaft "TESTzugrifKlasse.Form1.label1" ist ein Objektverweis erforderlich.wie bekomme ich sowas hin ??
Das eigentliche Ziel ist das ich auf StartForm eine serialPort.open(); aufrufe und von der 2Form eine serialPort.write("TEXT"); aufrufen will! Aber da bekomme ich die gleiche Meldung !
wäre suppppeeeerrrr wenn mir einer Helfen könnte!
-
Warum auch immer zwei Forms nötig sind, probiere mal folgendes:
Im Form2 von dem du übergeben möchtest erstelle einen EventHandler und löse ihn in der Button_Click Methode aususing System; using System.Windows.Forms; namespace FensterUebergabe { public partial class Form2 : Form { /// <summary> /// EventHandler erstellen /// </summary> public event EventHandler TextEvent; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Hier Event werfen this.TextEvent("Ich bin der zu übergebene Text", EventArgs.Empty); } } }
In Form1 musst du den EventHandler abbonieren und behandeln.
Etwa so:using System; using System.Windows.Forms; namespace FensterUebergabe { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 frm = new Form2(); frm.Show(); // EventHandler von Form2 abbonieren frm.TextEvent += new EventHandler(frm_TextEvent); } // EventHandler behandeln private void frm_TextEvent(object sender, EventArgs e) { // Hier die textuelle Ausgabe von Form2 label1.Text = sender.ToString(); } } }
Hoffe das hilft dir erstmal weiter, die serielle Kommunikation ist nicht mein Ding.
-
Hallo
Erstmal danke ich dir für die Idee ! Es funktioniert mit dem LABEL und auch mit der SerialPort -Verbindung .
nochmal danke ! 2 Forms brauch ich weil ich für PDA ein Programm schreibe, und da gibt’s nicht so viel Platz!
Hätte noch 2 fragen
- es gibt keine Beschränkung für die Anzahl von Events , oder ?
- das müsste auch umgekehrt funktionieren das der SerialPort auf Form1 ein Event auslösen kann wenn er irgendwelche Zeichen empfängt? Das ganze müsste aber im Thread laufen!
Nochmal danke
-
- Mir ist keine Beschränkung bekannt.
2)Da muss ich dich auf die MSDN verweisen, da ich mit seriellen Sachen noch nichts zu tun hatte
System.IO.Ports und folgende:
http://msdn2.microsoft.com/en-us/library/system.io.ports(VS.80).aspx
oder die deutsche Ausführung:
http://msdn2.microsoft.com/de-de/library/system.io.ports(VS.80).aspx
-
private void button1_Click(object sender, EventArgs e) { // Hier Event werfen this.TextEvent("Ich bin der zu übergebene Text", EventArgs.Empty); }
ähm,
1. TextEvent kann null sein, deshalb vorher auf null prüfen
2. der Sender sollte auch der Sender sein, Hier also die Instanz des Form1.
Um einen Parameter zu übergeben, füge dem Delegate einen Parameter hinzu oder leite eine Klasse von EventArgs ab, die eine weitere Eigenschaft besitzt, in der du den String übergeben kannst.
Dann muss man auch nicht sowas böses machen wie:label1.Text = sender.ToString();
Außerdem ist es besser, wenn du einen Controller benutzt, der die Arbeiten übernimmt. Formulare sollten nur die Interaktion mit den Anwender durchführen. Sie selbst sollten keine Anwendungslogik umsetzen oder Daten bereitstellen.
Formulare sollten nicht mehr machen, als:
1.Eingangsparameter im Konstruktor übernehmen
2.Eventuell eine Funktionalität eines Controllers aufrufen. Zum Beispiel auf einen Button-Click.
3.Ein Interaktionsergebnis zurück liefern, falls erforderlich.Gute Regeln sind:
- Ein Formular ruft niemales ein anderes Formular auf
- Der Workflow der Anwendung wird vom Program oder einem Controller bestimmt, nicht von einem Formular.
- Daten werden nicht in Formularen gespeichert sondern in dafür erstellte DatenContainer oder Controller, die unabhängig von Formularen existieren.Gruß
AndreasW
-
hi AndreasW
danke für die Tipps !!das mit
1. TextEvent kann null sein, deshalb vorher auf null prüfenhabe ich verstanden, aber bei der 2 Aussage bin ich mir nicht sicher!
und zwar was meinst du mit "Delegate" , habe es so verstanden das man eine neue Klasse erzeugt und dann die Logik dort implementiert, aber dann brauche ich doch noch ein EventArgs um es wieder zu Form1 zu bringen!
oder soll eine String Varialbe
public string UebergabeString;
benutzt werden
also so
using System; using System.Windows.Forms; namespace FensterUebergabe { public partial class Form1 : Form { public string UebergabeString; public Form1() { InitializeComponent(); UebergabeString=““; } private void button1_Click(object sender, EventArgs e) { Form2 frm = new Form2(); frm.Show(); frm.TextEvent += new EventHandler(frm_TextEvent); } private void frm_TextEvent(object sender, EventArgs e) UebergabeString = sender.ToString(); UebergabeStringM(); } private void UebergabeStringM() { Lable1.text= UebergabeString; } } }
Mit DatenContainer oder Controller meinst du eine einfache Klasse die durch Form1 als Objekt angelegt wird und darauf zugegriffen wird, oder eine Interface (als eine Verbindung deren Methoden zu einer Klasse) also vererbung?
Könntest du das an einem Beispiel Erklären/Darstellen, da ich erst seit kurzem ""Programmiere!!"" Verstehe ich das noch nicht ganz!
LG eleftro
-
Hi
nach langer Nacht bin ich doch dahinter gelangt wie du es meinst, glaub ich !Habe Jetzt eine Delegate und das Event habe ich in einer eigenen Klasse ! mit hin und zurück string !
Form1 Ist der serialPort
Habe es hinbekommen das ich von Form2 String nach serialPort(Form1)schicken kann!
Habe jetzt versucht von der Form1 nach Form2 String zu schicken ! ABER ich weiss nicht wie ich meinen ValueMoved1 in die form1 lade !
So wie ich es in Form1 in Zeile70 gemacht habe für Form2 !
Es müsste doch gehen in beide richtungen zu kommunizieren? Oder
was ich meine sind der hinfluss(fromSerialPort) und rückfluss(toSerialPort)
FORM1
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Beispiel2FormsMITzwichwnklasse { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //******************************************************** Empfang public void ValueMoved(object sender , ValueMovedEventArgs e) { ausgabeLable(e.ToIndex); } public void ausgabeLable(String ausgabe){ label1.Text = ausgabe; } //****************************************************** Versand private void button2_Click(object sender, EventArgs e) { String auam = "Hallo"; OnVauleMoved1(auam,"null"); } private void OnVauleMoved1(string fromSerialPort, string toSerialPort) { if (this.ValueMoved1 != null) { } this.ValueMoved1(this, new ValueMovedEventArgs(fromISerialPort, toSerialPort)); } //******************************************************* Aufruf private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); form2.ValueMoved += new ValueMovedEventHandler(ValueMoved); } } }
Form2
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Beispiel2FormsMITzwichwnklasse { public partial class Form2 : Form { public event ValueMovedEventHandler ValueMoved; public Form2() { InitializeComponent(); } //******************************************************************** Versand private void button1_Click(object sender, EventArgs e) { String auslStrong = "Test ausgabe"; OnVauleMoved("null", auslStrong); } private void OnVauleMoved(string fromSerialPort,string toSerialPort) { if(this.ValueMoved !=null){ } this.ValueMoved(this, new ValueMovedEventArgs(fromSerialPort, toSerialPort)); } //******************************************************************** Empfang public void ValueMoved1(object sender, ValueMovedEventArgs e) { ausagabeLable2(e.FromSerialPort); } public void ausagabeLable2(string dts) { label2.Text = dts; } } }
ValueMovedEventArgs
using System; using System.Collections.Generic; using System.Text; namespace Beispiel2FormsMITzwichwnklasse { public class ValueMovedEventArgs :EventArgs { private string fromSerialPort = ""; private string toSerialPort = ""; public string FromSerialPort { get {return fromSerialPort; } set { fromSerialPort = value; } } public string ToSerialPort { get {return toSerialPort; } set { toSerialPort = value; } } public string Message { get { return String.Format("nix kein Wert", fromSerialPort, toSerialPort); } } public ValueMovedEventArgs(string fromSerialPort, string toSerialPort) { this.fromSerialPort = fromSerialPort; this.toSerialPort = toSerialPort; } } }
delegate
using System; using System.Collections.Generic; using System.Text; namespace Beispiel2FormsMITzwichwnklasse { public delegate void ValueMovedEventHandler(object sender, ValueMovedEventArgs e); public delegate void ValueMovedEventHandler1(object sender, ValueMovedEventArgs e); }
LG eleftro
-
eleftro schrieb:
Hi
nach langer Nacht bin ich doch dahinter gelangt wie du es meinst, glaub ich !Habe Jetzt eine Delegate und das Event habe ich in einer eigenen Klasse ! mit hin und zurück string !
joh, schon viel besser.
eleftro schrieb:
Form1 Ist der serialPort
Habe es hin bekommen das ich von Form2 String nach serialPort(Form1)schicken kann!
Habe jetzt versucht von der Form1 nach Form2 String zu schicken ! ABER ich weiss nicht wie ich meinen ValueMoved1 in die form1 lade !
So wie ich es in Form1 in Zeile70 gemacht habe für Form2 !
Es müsste doch gehen in beide richtungen zu kommunizieren? Oder
was ich meine sind der hinfluss(fromSerialPort) und rückfluss(toSerialPort)
ähm, hier kommt dein 2. Problem zum Vorschein. Die mangelnde Koordination in deiner Anwendung. Definiere klare Verantwortlichkeiten in deinem Programm.
Versuche nicht die Formulare miteinander zu verbinden, sondern eher zu trennen.
Problembeispiel:
Zum Beispiel soll ein MediaPlayer eine Musikdatei abspielen. Zentrales Ziel ist also die Musikdatei abzuspielen.
Ok, die Musikdatei kann über einen OpenDialog ausgewählt werden. Was ist, wenn der Player dem OpenDialog nach der abzuspielenden Datei fragt. Erst mal scheint das in Ordnung. Was aber, wenn später die Datei aus dem Internet kommen soll und keine lokale Datei ist. Dann hat man ein Problem. Warum? Weil der OpenDialog nur lokale Dateien unterstützt. Es muss ein neuer Auswahldialog geschaffen werden, der auch Medien aus dem Internet berücksichtigt. Da haben wir aber ein Problem, weil der MediaPlayer direkt den OpenDialog nach den Pfad fragt. Wenn der MediaPlayer nur den zu spielenden Stream entgegennehmen würde, wäre so ziemlich alles möglich und man schränkt sich nicht ein.Fazit:
Ein hoffentilich anschauliches Beispiel zur Beschreibung der Verantwortlichkeiten innerhalb einer Anwendung. Ein Dialog ist ein Dialog, weil ein Dialog zwischen Anwender und Anwendung stattfindet. Genau so sollte man ein Formular auch verstehen. Als Kommunikationsmittel. Und nicht mehr. Benutzt man diese Kommukikationsmittel für mehr, mach man sich davon abhängig. Das wiederum schränkt die Erweiterbarkeit, Wartbarkeit und viel andere Dinge ein.
Schaffe einen Vermittler(einen Controller) der die zentrale Logik representiert. Das macht dir das Leben viel einfacher und wartungsfreundlicher.
Mach Formulare so dumm wie möglich....
Auch da denk mal drüber nach.
Gruß
AndreasW
-
Hallo
Ja werde beachten!
also ich will jetzt ein Datenrückfluss aufbauen , aber da bekomme ich nix mehr hin!
Hat einer ne Idee wie ich form1 anmelde und einen Fluss zu form2 mache!
Sitze schon 4 Tage dran!Habe eine Frage noch , geht das Überhaupt das ich durch delegat in beide Richtungen senden kann!
wie binde ich es an!Oder wo habe ich einen Fehler!
lg