mikrocontroller.net

Forum: PC-Programmierung [C#] Form1 Funktion aus Form2 aufrufen


Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Matthias Larisch (matze88)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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?

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat noch einer eine Idee wegen der Fehlermeldung?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Objekte und Memberfunktionen sind leider böhmische Dörfer für mich :)

Hab's aber inzwischen hinbekommen.
Für alle die es interessiert:

Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Projektname
{
    public partial class Form1 : Form
    {


        public bool SendCommand(...)
        {

Form2:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


namespace Projektname
{
    public partial class Form2 : Form
    {
        Projektname.Form1 Beliebig = new Form1();


        private void Button_Send_Click(object sender, EventArgs e)
        {
           // Funktion aus Form1 aufrufen
           Beliebig.SendCommand(...);


Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
public partial class Form2 : Form
    {
        SerialPort Form1SerialPort = Form1.SerialPortObjektName;
        ...
    }
Allerdings wird das so wie ich es geschrieben hab, wahrscheinlich nicht 
tun, du brauchst einen Verweis auf das SerialPort Objekt.

Ralf

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab grad noch ein Beispielprojekt mit SerialPort und mehreren cs Dateien 
gefunden. Werd mal sehen ob ich da was abschauen kann....

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
class Form1 : Form {
    static SerialPort mSerialPort = new SerialPort();
    public static SerialPort Serial {
        get { return mSerialPort; }
    }
}

class Form2 : Form {
    public void DoSomething() {
        Form1.Serial.Open()
    }
}

// oder etwas wartungsfreundlicher

internal class Serial {
    static SerialPort mSerialPort = new SerialPort();
    public static void Open() {
        mSerialPort.Open();   
    }
    public static void Send(string msg) {
        mSerialPort.Write(msg);
    }
}

class Form1 : Form {
    public void DoSomething1() {
        Serial.Send("abcdefg"); 
    }
}

class Form2 : Form {
    public void DoSomething2() {
        Serial.Send("123456"); 
    }
}

// Synchronisation, falls mehrere Threads darauf zugreifen sollen,
// fehlt in beiden Fällen...

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Isch werd verrückt, der geehht :)
Mit
static SerialPort COMPort = new SerialPort();
funktioniert's jetzt endlich...

Danke an alle :)

Autor: Willivonbienemaya .. (willivonbienemaya)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: TL431 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Willivonbienemaya .. (willivonbienemaya)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: pitchy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: pitchy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: pitchy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.