Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

C#: Von Form1.cs auf Program.cs zugreifen

hallo mal wieder,

ich habe mein problem mit dem ansteuern des parallelports mit eurer hilfe gelöst.
;D;D

jetzt habe ich jedoch ein weiteres problem:

ich habe ja laut eurem rat die dll inpout32.dll in der program.cs file meines Visual C# 2005 projekts deklariert. ich kann jetzt auch mit dem input oder output befehl super arbeiten - aber nur innerhalb von program.cs

nun die frage:

wie kann ich den input und den output befehl auch in form1.cs nutzen um z.b. eine meldung auszugeben.

vielen dank schonmal


Antworten zu C#: Von Form1.cs auf Program.cs zugreifen:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Schonmal schön zu wissen, dass mein Tipp geholfen hat  ;)
Am besten kapselst du den Import und die Deklaration der Funktionen in einer eigenen Klasse, die du dann überall einbindest, wo du Zugriff auf den Parallelport brauchst.

class CParallelPort{
    [DllImport("inpout32.dll", EntryPoint = "Out32")]
    public static extern void Output(int adress, int value);
    [DllImport("inpout32.dll", EntryPoint = "Inp32")]
    public static extern int Input(int adress);
}
Und dann, überall wo du es brauchst:
// das brauchst du nur einmal
CParallelPort port = new CParallelPort();
// dann kannst du beliebig auf die Funktionen zugreifen
port.Input(<adress>);
port.Output(<adress>, <value>);
Kann man natürlich noch beliebig ausbauen, dass du z.B. nen Konstruktor mit der gewünschten Adresse machst, so dass du die nur einmal angeben musst, etc.   
« Letzte Änderung: 19.03.08, 14:24:50 von Lisaa »

danke für die antwort!

soll ich dann also eine klasse anlegen?

wo wir schon dabei sind hätte ich noch eine frage:

wie kann ich die port adresse als variable festlegen, so dass ich sie nur einmal festlegen muss?

danke

ich habe das mit der klasse mal ausprobiert und auch im program.cs versucht. jedesmal sagt er mir, dass er dllimport nicht finden kann.
vorher ging es

sorry, geht doch!!
hatte
using System.Runtime.InteropServices;

vergessen.
habe den code jetzt in klasse eingefügt

das mit input und outpt funktioniert aber trotzdem nicht :'(

hier mal mein projekt
form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        public Form1()
        {
        case1:
            port.Output(888, 0);
            int inp = port.Input(889);
            if (inp < 127)
                goto case2;
            else if (inp > 127)
                goto case3;
            else
                goto case1;
......

Fehler   2   Der Name "port" ist im aktuellen Kontext nicht vorhanden.
Fehler   3   Der Name "port" ist im aktuellen Kontext nicht vorhanden.

program.cs:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Meine_Jahresarbeit_V0._
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
....

class1.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace Meine_Jahresarbeit_V0._2
{
    class CParallelPort
    {
        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        public static extern void Output(int adress, int value);
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        public static extern int Input(int adress);
        CParallelPort port = new CParallelPort();
    }
}
...

funktioniert auch nicht, wenn ich das "port" weg lasse.

 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

OK, ich nehme an, dass du noch keine Erfahrung mit objektorientierter Programmierung hast. Also

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace Meine_Jahresarbeit_V0._2
{
    class CParallelPort
    {
        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        public static extern void Output(int adress, int value);
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        public static extern int Input(int adress);
    }
}
Dann in Form1 legst du ein Objekt vom Typ CParallelPort an. Das verhält sich von der Gültigkeit her wie mit einer Variable, d.h. eine Variable ist auch nur dort gültig, wo sie vorher deklariert wurde. Klar soweit?
[...]
namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        CParallelPort port = new CParallelPort();
        public Form1()
        {
        case1:
            port.Output(888, 0);
            int inp = port.Input(889);
            if (inp < 127)
                goto case2;
            else if (inp > 127)
                goto case3;
            else
                goto case1;
[...]
So müsste es gehen.

Mit fester Adresse:
namespace Meine_Jahresarbeit_V0._2
{
    class CParallelPort
    {
        private int m_adress = 0;

        public CParallelPort( int adress ) {
            m_adress = adress;
        }

        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        private static extern void Output(int adress, int value);
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        private static extern int Input(int adress);

        // mit diesen Funktionen wird die festgelegte Adresse verwendet
        public int getInput() {
            return Input( m_adress );
        }
        public void setOutput( int value ) {
            Output( m_adress, value );
        }
    }
}
Im Form1 kannst du das dann so verwenden:
[...]
namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        // hier jetzt die Adresse eingeben
        CParallelPort port = new CParallelPort( 888 );
        public Form1()
        {
        case1:
            // hier brauchst du die Adressen dann nicht mehr
            // kannst aber auch nur auf die eine Adresse zugreifen
            port.setOutput( 0 );
            int inp = port.getInput();
            if (inp < 127)
                goto case2;
 

danke,
aber er motzt noch immer bei

namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        // hier jetzt die Adresse eingeben
        CParallelPort port = new CParallelPort(888);
        public Form1()
...
rum.
Fehler   2   Der Typ- oder Namespacename "CParallelPort" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?)   

 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ah OK, Du hast die CParallelPort-Klasse in nem anderen Namespace. Den musst du dann natürlich mit angeben.

Meine_Jahresarbeit_V0._2.CParallelPort port = new Meine_Jahresarbeit_V0._2.CParallelPort(888);
Oder du bindest das über using ein (einfacher):
using Meine_Jahresarbeit_V0._2;

 :-\ sorry, aber es geht immer noch nicht:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Meine_Jahresarbeit_V0._2;

namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        CParallelPort port = new CParallelPort();
        public Form1()
        {
        case1:
            port.Output(888, 0);
            int inp = port.Input(889);
            if (inp < 127)
                goto case2;
            else if (inp > 127)
                goto case3;
            else
                goto case1;
...

Fehler   1   Keine Überladung für die CParallelPort-Methode nimmt 1 Argumente an.
Fehler   2   Auf den statischen Member "Meine_Jahresarbeit_V0._2.CParallelPort.Output(int, int)" kann nicht mit einem Instanzenverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen.
Fehler   3   Auf den statischen Member "Meine_Jahresarbeit_V0._2.CParallelPort.Input(int)" kann nicht mit einem Instanzenverweis zugegriffen werden. Qualifizieren Sie ihn stattdessen mit einem Typnamen.   

trotzdem danke dass du mir hilfst!
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Oh, ja, das hatte ich nicht bedacht. OK, lass das
CParallelPort port = new CParallelPort();
weg und benutze die Funktionen dann so:

CParallelPort.Output(888, 0);
int inp = CParallelPort.Input(889);

so oder wie :'( :'( :'(
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Meine_Jahresarbeit_V0._2;

namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        Meine_Jahresarbeit_V0._2.CParallelPort port = new Meine_Jahresarbeit_V0._2.CParallelPort(888);
        CParallelPort.Output(888, 0);
int inp = CParallelPort.Input(889);

        public Form1()
        {
        case1:
            port.Output(888, 0);
            int inp = port.Input(889);
            if (inp < 127)
                goto case2;
            else if (inp > 127)
                goto case3;
            else
                goto case1;

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nein, so:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Meine_Jahresarbeit_V0._2;

namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        public Form1()
        {
        case1:
            CParallelPort.Output(888, 0);
            int inp = CParallelPort.Input(889);
            if (inp < 127)
                goto case2;
            else if (inp > 127)
                goto case3;
            else
                goto case1;

 ;D;D;D;D;D;D;D;D;D;D;D;D;D
SUPER, ES GEHT!!!!!!!!!

VIELEN DANK

 

ABER

wenn ich das ganze programm laufen lassen will:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Meine_Jahresarbeit_V0._2;

namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        public Form1()
        {
        case1:
            CParallelPort.Output(888, 0);
            int inp = CParallelPort.Input(889);

            if (inp < 127)
                goto case2;
            else if (inp > 127)
                goto case3;
            else
                goto case1;

        case2:
            if (inp < 127)
                textBox1.Text = "Alarm";
            else if (inp > 94)
                textBox1.Text = "ROT";
            else if (inp > 62)
                textBox1.Text = "WEISS";
            else if (inp > 30)
                textBox1.Text = "ROT-WEISS";
            else
                goto case1;

        case3:
            if (inp > 127)
                textBox1.Text = "Alarm";
            else if (inp < 192)
                textBox1.Text = "WEISS-GRÜN";
            else if (inp < 224)
                textBox1.Text = "GRÜN-ROT";
            else if (inp < 256)
                textBox1.Text = "GRÜN";
            else
                goto case1;

        }
    }
}

...
dann bleibt er einfach hängen

was kann ich tun?

ich habe den fehler gefunden,
weiß aber nicht, wie ich ihn beheben kann.

er kommt mit den ports nicht klar und kommt (F11) nicht über else hinaus.
er fängt dann immer wieder bei CParallelPort an.
wie kann ich den port auf z.b. 378 und 379 ändern?

danke 

sorry und noch was, weil du ja so viel weißt:

er lädt die form1.cs nicht wirklich. er startet zwar die form1.cs aber es ist nichts drin (habe vorher text reingesetzt und die größe verändert)

ich hoffe du kannst mir noch mal helfen :)
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
er kommt mit den ports nicht klar und kommt (F11) nicht über else hinaus.
er fängt dann immer wieder bei CParallelPort an.
wie kann ich den port auf z.b. 378 und 379 ändern?
Das verstehe ich jetzt nicht so ganz. Was geht da schief?
Die Port-Adressen kannst du benutzen, wie du willst; so wie du es vorher auch gemacht hast.

beim ports-ändern

 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hmm, wahrscheinlich funktioniert der DLL-Import durch den statischen Zugriff nicht. Probiers mal so:
Klasse CParallelPort

namespace Meine_Jahresarbeit_V0._2
{
    public class CParallelPort
    {
        public CParallelPort() {}

        [DllImport("inpout32.dll", EntryPoint = "Out32")]
        private static extern void Output(int adress, int value);
        [DllImport("inpout32.dll", EntryPoint = "Inp32")]
        private static extern int Input(int adress);

        public int getInput( int adress ) {
            return Input( adress );
        }
        public void setOutput( int adress, int value ) {
            Output( adress, value );
        }
    }
}
Und in deinem Form dann so:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Meine_Jahresarbeit_V0._2;

namespace Meine_Jahresarbeit_V0._
{
    public partial class Form1 : Form
    {
        CParallelPort port = new CParallelPort();
        public Form1()
        {
        case1:
            port.setOutput( 888, 0 );
            int inp = port.getInput( 889 );
            if (inp < 127)
                goto case2;
            else if (inp > 127)
                goto case3;
            else
                goto case1;

jetzt scheint es schon eher zu klappen.
er sagt jetzt nur, dass er irgendein problem mit textBox1.Text = "Alarm";
hat.
wie könnte ich das auf andere weise ausgeben

danke

halt, ich glaube, dass das irgendetwas mit der leeren form1.cs zu tun hat und er das einfach nicht findet:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Wie sieht denn der Rest von deinem Form aus? Gibts nen Grund, warum du die Implementierung aufgeteilt hast?
Ich vermute mal, dass da sowas wie eine Initialisierung der ganzen Sachen in deinem Form fehlt. Also dass da bevor du
textBox1.Text = "Alarm";
schreibst, die Textbox erstmal angelegt wird
textBox1 = new TextBox();
Kann mich aber auch täuschen, hab von solchen Sachen nicht so die Ahnung.


« java buchJava: Rar Datei »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Zugriffszeit
In Milisekunden angegebene Zeit, die das Speichermedium zum Erreichen der gesuchten Daten braucht. Die Zeit ist abhängig vom technischen Verfahren des Mediums sowie ...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...