Hallo,
versuch schon den ganzen Nachmittag eine Form1 zu Form2 Kommunikation
hin zu bekommen. Ich hab vor nem Jahr schonmal C# (2008) in die Ecke
geschmissen und schnell was in VB.net (2008) programmiert, weil das dort
ohne weitere Handstände möglich war.
Da ich aber vom µC in C komme, ist VB natürlich Syntaxtechnisch immer
eine riesen Umstellung. Darum und weil viele drauf schwören wollte ich
C# nochmal eine Chance geben.
Nun hab ich mir schon ein Hauptform erstellt, der MDI basierend ist.
Also lauter Childfenster im MDI Container. Wenn ich nun ein neues
Unterform öffne, möchte ich gern die SerialPort Klasse im Parent
ansprechen und einen Comport übergeben + zum Verbinden auffordern.
Jetzt steht in jeder Ecke im Netz: Mach sowas nicht. Unsaubere
Programmierung. Alles schlecht...
Wenn ich nicht zwischen zwei Fenstern kommunizieren kann, dann macht
doch das ganze MDI Formatgehabe keinen Sinn?!
Da muss es doch noch was einfach geben?!
Bitte verratet mir den Trick!
MfG
Basti
Bassti schrieb:> Wenn ich nicht zwischen zwei Fenstern kommunizieren kann, dann macht> doch das ganze MDI Formatgehabe keinen Sinn?!
Klar kann man. Das Problem ist: Wenn du von zwei Unterfenstern aus das
machst, wird der gleiche Serialport zweimal für verschiedene Dinge
verwendet, und nichts funktioniert. Daher müsstest du zB. in jedem
Unter-Form einen eigenen Serialport haben, oder was sonst für deine
Anwendung Sinn macht.
> Da muss es doch noch was einfach geben?!
Übergeb halt dem Unter-Form beim Konstruktor einen Pointer auf das
Main-Window, und darüber kannst du dann Funktionen aufrufen und ggf. auf
Member-Veriablen zugreifen. Aber du musst eben beachten, dass mehrere
Unter-Forms das gleichzeitig können.
Wo ist denn überhaupt das Problem?
Du könntest z.B. ein kleines Interface basteln, welches die Hauptform
implementiert und an die Child-Forms übergibt. Über das Interface können
diese dann auf die gewünschte Funktionalität der Parent form zugreifen.
Ist jetzt nur einer von 1.000.000 möglichen Wegen... musst halt schauen
was in deiner Anwendung am besten passt.
Bassti schrieb:> Ich hab vor nem Jahr schonmal C# (2008) in die Ecke> geschmissen und schnell was in VB.net (2008) programmiert, weil das dort> ohne weitere Handstände möglich war.
wo soll das der unterschied sein? Beides ist .net und bietet die
gleichen funktionen. Nur die eingabe-Sprache ist unterschiedlich.
Wie hast du es denn in VB.net gemacht, und wo ist das Problem bei der
Umsetzung zu C#?
Hi,
für was der ganze Umstand? Erzeuge ein ContainerObjekt der die Daten,
etc. beinhaltet, leite deine Forms von der System.Windows.Forms.Form
Klasse ab, erstelle ein Konstruktor dem du dieses ContainerObjekt
übergeben kannst und übergebe es an beide Forms. Ich hoffe das du das
Verstanden hast, wenn du ein Beispiel brauchst, gebe ich dir eins.
> Ich hab vor nem Jahr schonmal C# (2008) in die Ecke> geschmissen und schnell was in VB.net (2008) programmiert, weil das dort> ohne weitere Handstände möglich war.
Welchen Unterschied gibt es den zwischen C# und VB.NET, außer dem
Syntaktischem und höchstens dem, dass man in C# mittels Unsafecode
Zeiger benutzen kann? Ich habe früher auf VB.NET geschworen, heute tue
ich es auf C#, da mir die C Syntax sehr viel besser gefällt ;).
Wieso gibts da keinen Unterschied?!
SerialPort hab ich einfach nur auf die GUI gezogen und auf public
gesetzt
Also in VB ruf ich in dem neuen Form2 einfach Form1 so auf:
Form1.SerialPort.Write("SU")
Und das funktioniert in C# anscheinend nicht...
@Christopher C. das ist irgendwie schwer verständlich... Ich programmier
nicht so oft unter Windows :-/
Ein Beispiel wäre schön....
@Der Weise ja das hab ich auch schon probiert. Hat aber nicht so recht
funktioniert :-/
Die Idee ist das ich den Serialport von den Client Forms aus steuern
kann. Öffnen,Schließen etc.
Und das was mit hilfe von delegate im Form1 Empfangen wird, soll auf die
Childforms verteilen werden.
MfG
Basti
Bassti schrieb:> Form1.SerialPort.Write("SU")> Und das funktioniert in C# anscheinend nicht...
und warum nichts? Was gibt es für eine Fehlermeldung?
Ich würde es aber eh nicht so mache, was hat der ComPort mit der Gui zu
tun? Man sollte es doch gleich richtig machem, und dafür trennt man die
gui möglichst von der Programm logik.
Damit ist es auch einfacher einen Dienst oder ein Konsolenprogramm
daraus zu machen.
Es gibt also meinetwegen eine Worker-Objekt. Diese steuert den ComPort.
Die beiden Formulare bekommen dann im Kontruktor die Referenz auf das
Worker Objekt übergeben.
Bassti schrieb:> Form1.SerialPort.Write("SU")
Geht in C# natürlich auch, du musst halt im Form2 eine Variable namens
"Form1" anlegen, die im Konstruktor auf das Form1 gesetzt wird, oder so.
> SerialPort hab ich einfach nur auf die GUI gezogen und auf public> gesetzt
Dann "zieh" (waddiss dat denn für ne programmierweise O_o) es eben auf
das Client-Form.
> Die Idee ist das ich den Serialport von den Client Forms aus steuern> kann. Öffnen,Schließen etc.
Warum nicht direkt aus dem Main-Form?
Jetzt musst du nur noch vor dem Initialisieren der Forms das SerialPort
Objekt initialisieren und den Forms das Objekt mit dem Konstruktor
übergeben. Also in Program.cs.
Allerdings würde ich dir die Methode von Peter II eher empfehlen.
Ich frage mich immer wieder, wieso Microsoft auf die schwachsinnige Idee
gekommen ist, eine SerialPort-Klasse als GUI-Komponente zu designen!?
Was ist an einem Serial-Port "Graphical"?
Dadurch werden weniger erfahrene Entwickler immer wieder davon
abgehalten, vernünftige Software zu designen, die das MVC-Pattern
verfolgen.
Gruß
Markus
Markus V. schrieb:> Ich frage mich immer wieder, wieso Microsoft auf die schwachsinnige Idee> gekommen ist, eine SerialPort-Klasse als GUI-Komponente zu designen!?> Was ist an einem Serial-Port "Graphical"?
vermutlich habe sie es nur Borland mit Delphi nachgemacht. Leider fehlen
mir für große programme noch die TCP-Server-Sockets. Du muss man jetzt
von Hand programmieren - wie rückständig.
Wunderbar, der Source von Christopher C. hat funktioniert...
Ich musste nur das SerialPort noch mit new in Form1 wirklich erstellen.
Hab auf die Weise jetzt gleich das komplette Form übergeben und kann
jetzt auf meine public erstellen Funktionen in Form1 auf Form2
zugreifen, so wie ichs aus VB.net kannte.
Danke für die Hilfe...
MfG
Basti