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 dieser Frage:

Hat dir diese Antwort geholfen?

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?

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?

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?

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?

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

 


« java buchJava: Rar Datei »
 

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