Forum: PC-Programmierung OOP und C# ich werd noch verrückt :-/ Form-From Kommunikation


von Bassti (Gast)


Lesenswert?

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

von Der Weise (Gast)


Lesenswert?

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.

von Sharping (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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#?

von Christopher C. (Gast)


Lesenswert?

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 ;).

von Bassti (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Der Weise (Gast)


Lesenswert?

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?

von Christopher C. (Gast)


Lesenswert?

Also gut ein Beispiel:

Hier die Form1:
1
public partial class Form1 : Windows.Windows.Forms.Form
2
{
3
    private SerialPort serialPort;
4
5
    public Form1(SerialPort serialPort) : base()
6
    {
7
       this.serialPort = serialPort;
8
    }
9
10
    ...
11
}
12
13
//Form2 genau das Gleiche:
14
public partial class Form2 : Windows.Windows.Forms.Form
15
{
16
    private SerialPort serialPort;
17
18
    public Form2(SerialPort serialPort) : base()
19
    {
20
       this.serialPort = serialPort;
21
    }
22
23
    ...
24
}

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.

von Markus V. (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Bassti (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.