Habe eine Funktion "private bool SendCommand(...)" in Form1.cs die ich
in Form2.cs benutzen will. Wenn ich das mit "Form1.SendCommand(...)"
machen will, sagt er mir das das aufgrund der Sicherheitsebene nicht
möglich ist. Was muss ich tun damit's klappt?
Benutze C# Express 2008.
Die Funktion public deklarieren... Aber eigentlich ist es böse,
Formularfunktionen aus nem anderen Formular aufzurufen. Eventuell kannst
du das ganze von dem Formular abspalten und in eine dritte Datei packen,
die in beiden Formularen genutzt wird?
Ist das natürliche eine Schnittstelle zum Formular, so wäre das auch so
in Ordnung.
>Die Funktion public deklarieren...
Damit gibt's jetzt die Fehlermeldung:
>Für das nicht statische Feld, die Methode oder die>Eigenschaft "....SendCommand(...)" ist ein Objektverweis erforderlich.>Eventuell kannst du das ganze von dem Formular abspalten und in eine>dritte Datei packen, die in beiden Formularen genutzt wird?
Das wäre mir eigentlich sogar am liebsten :)
Kann ich dafür die "Programm.cs" nehmen die C# schon angelegt hat?
TL431 schrieb:
> Hat noch einer eine Idee wegen der Fehlermeldung?
Die sollte doch eigentlich selbsterklärend sein.
Wenn du die Funktion xyz aus der Form1 aufrufen willst, dann brauchst du
zuerst mal das Form Objekt um dafür eine Memberfunktion aufzurufen.
Du kannst nicht einfach irgendwelche Funktionen aufrufen! Die Funktion
ist Bestandteil eines Objektes und um die Funktion rufen zu können
benötigst du das Objekt.
Neues Problem.
Die Funktion in Form1 (SendCommand) öffnet den COM Port. Wenn ich aus
Form1 den COM Port mit "SendCommand" öffne und offen lasse und dann die
Funktion von Form2 aus aufrufe leifert "SerialPort.IsOpen" plötzlich
nicht true sondern false zurück.
Was ist das nun wieder? Muss ich den SerialPort in Form2 auch noch
irgendwie "bekannt geben"?
Ich glaub es liegt daran, dass du in Form1 ein neues Objekt Form1
erzeugst.
Neue Form1 = neues SerialPort-Objekt.
Neues Serialport-Objekt = geschlossener COM-Port
Was du brauchst ist eher sowas:
TL431 schrieb:
> Also ich hab den SerialPort einfach nur per Drag&Drop in das Form1> eingefügt. Sowas wie "Neue Form1 = neues SerialPort-Objekt." hab ich> nicht.
Das ist auch kein Programmtext, sondern eine verküzte Schreibweise für
"Ein neues Form Objekt bedeutet auch, dass ein neues SerialPort Objekt
generiert wird, da ja jedes Form1 Objekt sein eigenes SerialPort Objekt
enthält"
Hab es jetzt auch mal über "SerialPort COMPort = new SerialPort();"
eingebunden, aber das macht auch keinen Unterschied :(
Grundsätzlich ist das aber schon möglich das ich einen SerialPort von
Form1 in Form2 benutzen kann, oder wie stellt man das an?
TL431 schrieb:
> Hab es jetzt auch mal über "SerialPort COMPort = new SerialPort();"> eingebunden, aber das macht auch keinen Unterschied :(>> Grundsätzlich ist das aber schon möglich das ich einen SerialPort von> Form1 in Form2 benutzen kann, oder wie stellt man das an?
Zwei Beispiele in denen nur ein einziges SerialPort-Objekt existiert:
1
classForm1:Form{
2
staticSerialPortmSerialPort=newSerialPort();
3
publicstaticSerialPortSerial{
4
get{returnmSerialPort;}
5
}
6
}
7
8
classForm2:Form{
9
publicvoidDoSomething(){
10
Form1.Serial.Open()
11
}
12
}
13
14
// oder etwas wartungsfreundlicher
15
16
internalclassSerial{
17
staticSerialPortmSerialPort=newSerialPort();
18
publicstaticvoidOpen(){
19
mSerialPort.Open();
20
}
21
publicstaticvoidSend(stringmsg){
22
mSerialPort.Write(msg);
23
}
24
}
25
26
classForm1:Form{
27
publicvoidDoSomething1(){
28
Serial.Send("abcdefg");
29
}
30
}
31
32
classForm2:Form{
33
publicvoidDoSomething2(){
34
Serial.Send("123456");
35
}
36
}
37
38
// Synchronisation, falls mehrere Threads darauf zugreifen sollen,
Du kannst diese ganzen Probleme umgehen wenn du die Benutzeroberfläche
von der Datenhaltung sauber trennst. Also ein einziges Objekt dass deine
Funktionen enthält die du in den beiden Forms brauchst.
Hatte schon mal versucht die Funktionen in "Program.cs" zu platzieren.
Da hab ich aber wohl das gleiche Problem das die von anderen Forms nicht
ohne weiteres sichtbar sind...
Von der Program.cs solltest du auch die Finger weglassen.
Erstele dir eine eigene Klasse um das sauber zu trennen.
wenn es nicht klappt. hänge am besten das komplette projekt an, dann
kann dir einfacher geholfen werden.
Hallo,
die Lösung von Arc Net funktioniert "nur" solange man Daten sendet. Ich
will nun aber Daten von einer ext. Unit empfangen und im jeweilig
aktiven Formualar anzeigen.
das Ganze soll so aussehen:
Class Form1: Befehl Temperatur senden und Antwort im aktiven Formular1
anzeigen
Class Form2: Befehl Geschwindigkeit senden und Antwort im aktiven
Formular2
anzeigen
Class FormX: u.s.w.
Wie kann ich ein DataReceived / ReadExisting Ergebnis aus der Class
Serial in ein Form übergeben?
Vielen Dank an Alle für dringend benötigte Hilfe
Uwe
pitchy schrieb:
> Hallo,>> die Lösung von Arc Net funktioniert "nur" solange man Daten sendet. Ich> will nun aber Daten von einer ext. Unit empfangen und im jeweilig> aktiven Formualar anzeigen.>> das Ganze soll so aussehen:>> Class Form1: Befehl Temperatur senden und Antwort im aktiven Formular1> anzeigen>> Class Form2: Befehl Geschwindigkeit senden und Antwort im aktiven> Formular2> anzeigen>> Class FormX: u.s.w.>> Wie kann ich ein DataReceived / ReadExisting Ergebnis aus der Class> Serial in ein Form übergeben?
Indem du der Class Serial eine Interface eines Datenempfängers bekannt
machst, der die Daten annimmt.
Die Form, welche die Daten anzeigen soll, implementiert die Funktionen
des Interfaces und wird beim Serial Objekt als Datenempfänger
registriert.
(Und nur damit es keine Missverständnisse gibt: Du als Programmierer
definierst, wie dieses Interface auszusehen hat)
Danke für die schnelle Antwort.
Vom Prinzip her verstanden. Ich habe aber leider keine Ahnung
wie das Ganze als Code in der Class Serial und im entsprechenden Form
ausssehen muss.
Bisher habe ich nur innerhalb einer Form senden und empfangen
realisiert.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace rs232_mobile
{
using System.IO.Ports;
public partial class seriell : Form
{
public string empfang = null;
public SerialPort port = new SerialPort();
public seriell()
{
InitializeComponent();
port.DataReceived += new
SerialDataReceivedEventHandler(port_DataReceived);
port.PortName = "COM1";
port.BaudRate = 9600;
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
}
private void seriell_Load(object sender, EventArgs e)
{
if (port.IsOpen == false)
try
{
port.Open();
}
catch (Exception oex)
{
MessageBox.Show(oex.ToString());
}
}
public void port_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(DoUpdate));
}
public void DoUpdate(object s, EventArgs e)
{
empfang = port.ReadExisting();
textBox1.Text = textBox1.Text + empfang + "\n";
}
public void Port_Open(object sender, EventArgs e)
{
if(port.IsOpen == false)
try
{
port.Open();
}
catch (Exception oex)
{
MessageBox.Show(oex.ToString());
}
}
private void button1_Click(object sender, EventArgs e)
{
port.WriteLine("Hallihallo");
}
private void menuItem1_Click(object sender, EventArgs e)
{
textBox1.Text = "";
}
}
}
Teile des Codes funktionieren nur innerhalb einer Form aber nicht
innerhalb einer "einfachen" Class ohne Form.
Hallo,
kann mir jemand ein entsprechendes Codebeispiel geben wie
so ein Interface auszusehen hat. So dass ich aus irgend einer
Form auf empfangene Daten zugreifen kann.
Besten Dank!
Uwe
pitchy schrieb:
> Hallo,>> kann mir jemand ein entsprechendes Codebeispiel geben wie> so ein Interface auszusehen hat. So dass ich aus irgend einer> Form auf empfangene Daten zugreifen kann.>> Besten Dank!>> Uwe
Wo ist genau das Problem?
Jede Form kann sich für den DataReceived-Event registrieren und
entsprechend reagieren bzw. nicht reagieren wenn sie nicht aktiv ist
(Form.ActiveForm). Genauso gut könnte man das gesamte Handling (Senden,
Empfangen, Aufbereiten) in die Serial-Klasse packen, die dann einen
neuen Event bereitstellt...