Avatar billede blod_1 Nybegynder
22. august 2009 - 00:41 Der er 17 kommentarer og
1 løsning

Fejl ved kommandoer imellem filer

Jeg er igang med at lave noget i C# til at styre en servo controller.

Når jeg sætter alt sammen i det samme program, så fungerer det fint, men det program som jeg pt laver et plugin til, har config i en form, og så selve programmet i en anden. Mit problem er her kommunikation imellem formen, og det som kører i baggrunden.

Fejlen jeg får er denne:
Error    6    An object reference is required for the non-static field, method, or property 'ServoController.ServoControl.servoPos(int)'

hvor servoPos ligger i en fil kaldet ServoControl.cs

namespace ServoController
{
    public class ServoControl
    {
        public int servoBot = 280;

(en masse klippet ud)

        public int servoPos(int channel)
        {
            if (channel == 00) return channel00;

(en masse klippet ud hvor den kører igennem flere kanaler)

            else return servoBot;
        }
    }
}

Inde i formen ønsker jeg så at kalde dette

namespace Plugin
{
    public partial class PluginForm : Form
    {
        private void channelsUpdate_Tick(object sender, EventArgs e)
        {
            progressBar00.Value = ServoController.ServoControl.servoPos(0);
        }
    }
}

Hvilket man ikke kan, men hvordan kommer jeg så rundt om det?
Jeg kan ikke bare lave servoPos om til en static, fordi så kan jeg ikke længere bruge de int som bliver defineret rundt omkring i de andre funktioner.
Avatar billede Syska Mester
22. august 2009 - 00:48 #1
Et eller andet sted må du jo oprette en instance af din klasse ... den skal din PlginForm jo bare kende til ... så er overstående intet problem

Lige pt kan jeg ikke et nogen steder at du oprette en instance af den klasse ...

// ouT
Avatar billede blod_1 Nybegynder
22. august 2009 - 00:53 #2
Nej, er nok også bare et begynder problem. Startede kun med det for en uge siden, og udelukkende lært ved at bruge microsofts side, og så en masse google.

Jeg har også brugt en del tid på at søge efter et svar via google, men problemet er nok at jeg ikke nøjagtigt ved hvad jeg skal søge efter. En søgning på fejlen giver en masse, hvor det meste vist ikke lige hører til det problem jeg har.

Hvordan gør jeg med den instance?
Avatar billede Syska Mester
22. august 2009 - 01:00 #3
Et eller andet sted i dit program må du oprette en instance af den klasse ... altså noget ala:

ServoControl sControl = new ServoControl();
sControl.SomeMethod();

Det skal så gøres i din Form klasse så den opretter den ... og du kan bruge den derfra ...
Avatar billede blod_1 Nybegynder
22. august 2009 - 01:08 #4
aaah ja, det har jeg været igang med en gang før, uden at komme længere, dog er der ikke streger under alt nu ;)

Det den brokker sig over nu er så dette

The type or namespace name 'ServoControl' could not be found (are you missing a using directive or an assembly reference?)

Men der står

public class ServoControl

inde i den anden fil, burde det ikke være den som den finder?
Avatar billede Syska Mester
22. august 2009 - 01:24 #5
Jo, men det ene ligger i namespace: ServoController og den anden i namspace: Plugin

Så 2 muligheder:
1. tilføj using ServoController i toppen af din af din fil hvis du skal bruge dit Servo
2. Angiv det fulde navn:
ServoController.ServoControl sControl = new ServoController.ServoControl();

// ouT
Avatar billede blod_1 Nybegynder
22. august 2009 - 01:30 #6
Begge ser ud til at give samme fejl

'ServoController.ServoControl' does not contain a definition for 'ServoController' and no extension method 'ServoController' accepting a first argument of type 'ServoController.ServoControl' could be found (are you missing a using directive or an assembly reference?)

Har jeg gjort noget forkert i opbygningen af den class måske?
Avatar billede Syska Mester
22. august 2009 - 01:43 #7
Post hvad du præcis gør ... incl de omhandlende kode linjer ... lidt svært at sige om du måske har andre små fejl ...

// ouT
Avatar billede blod_1 Nybegynder
22. august 2009 - 01:49 #8
Her er en del af koden som jeg kalder fra, hvor jeg har klippet de funktioner ud som intet har med dette at gøre

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SamplePlugin;
using System.IO.Ports;
using ServoController;

namespace SamplePlugin
{
    public partial class SamplePluginForm : Form
    {
        ServoControl sc = new ServoControl(); //Set instance for the ServoControl class

        public SamplePluginForm(bool haveLicense, string owner)
        {
            InitializeComponent();
           
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            this.Close();
        }

        private void connectBtn_Click_1(object sender, EventArgs e)
        {
            if (connectBtn.Text == "Connect")
            {
                sc.ServoController.ServoControl.SetConnection("Connect", comPort.Text);
                comPort.Enabled = false;
                connectBtn.Text = "Disconnect";
            }
            else if (connectBtn.Text == "Disconnect")
            {
                sc.ServoController.ServoControl.SetConnection("Disconnect", "");
                comPort.Enabled = true;
                connectBtn.Text = "Connect";
            }
        }

        private void channelsUpdate_Tick(object sender, EventArgs e)
        {
            progressBar00.Value = sc.ServoController.ServoControl.servoPos(0);
            progressBar01.Value = sc.ServoController.ServoControl.servoPos(1);
            progressBar02.Value = sc.ServoController.ServoControl.servoPos(2);
        }
    }
}

Og her er så den anden, hvor jeg igen har klippet alt ud som ikke har med dette at gøre

using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;

namespace ServoController
{
    public class ServoControl
    {
        public static SerialPort sp = new SerialPort();

        public int servoTop = 1165;
        public int servoBot = 280;

        //Positions of servos stored here
        int channel00 = 0;
        int channel01 = 0;
        int channel02 = 0;
        int channel03 = 0;
        int channel04 = 0;
        int channel05 = 0;
        int channel06 = 0;
        int channel07 = 0;
        int channel08 = 0;
        int channel09 = 0;
        int channel10 = 0;
        int channel11 = 0;
        int channel12 = 0;
        int channel13 = 0;
        int channel14 = 0;
        int channel15 = 0;

        public string SetConnection(string mode, string portNum)
        {
            if (mode == "Connect")
            {

//en masse hvor den åbner porten

            }
            else if (mode == "Disconnect")
            {
                if (sp.IsOpen)
                {
                    sp.Close();
                }
                sp = new SerialPort();
                return "Closed";
            }
            else
            {
                return "Unexpected mode";
            }
        }

        public string SetServo(int channel, int ramp, int position) //Position between 280 and 1170
        {
            string nl = System.Environment.NewLine;
            string speedTemp = "";
            string positTemp = "";

            if (!sp.IsOpen)
            {
                SetConnection("Connect", "COM3");
                sp.Open();
            }

            if (position > servoTop - 1)
            {
                position = servoTop;
                positTemp = " (limited)";
            }
            else if (position < servoBot - 1)
            {
                position = servoBot;
                positTemp = " (limited)";
            }
            else
            {
                positTemp = "";
            }

            if (ramp > 63)
            {
                ramp = 63;
                speedTemp = " (limited)";
            }
            else if (ramp < 0)
            {
                ramp = 0;
                speedTemp = " (limited)";
            }
            else
            {
                speedTemp = "";
            }

            try
            {
                if (sp.IsOpen)
                {
                    if (channel == 00) channel00 = channel;
                    if (channel == 01) channel01 = channel;
                    if (channel == 02) channel02 = channel;
                    if (channel == 03) channel03 = channel;
                    if (channel == 04) channel04 = channel;
                    if (channel == 05) channel05 = channel;
                    if (channel == 06) channel06 = channel;
                    if (channel == 07) channel07 = channel;
                    if (channel == 08) channel08 = channel;
                    if (channel == 09) channel09 = channel;
                    if (channel == 10) channel10 = channel;
                    if (channel == 11) channel11 = channel;
                    if (channel == 12) channel12 = channel;
                    if (channel == 13) channel13 = channel;
                    if (channel == 14) channel14 = channel;
                    if (channel == 15) channel15 = channel;

//en masse hvor den sender til porten

                }
                else
                {
                    //sA("There is no connection", "W");
                    return "There is no connection";
                }
            }
            catch (Exception ex)
            {
                //sA(ex.ToString(), "W");
                return ex.ToString();
            }
        }

        public int servoPos(int channel)
        {
            if (channel == 00) return channel00;
            else if (channel == 01) return channel01;
            else if (channel == 02) return channel02;
            else if (channel == 03) return channel03;
            else if (channel == 04) return channel04;
            else if (channel == 05) return channel05;
            else if (channel == 06) return channel06;
            else if (channel == 07) return channel07;
            else if (channel == 08) return channel08;
            else if (channel == 09) return channel09;
            else if (channel == 10) return channel10;
            else if (channel == 11) return channel11;
            else if (channel == 12) return channel12;
            else if (channel == 13) return channel13;
            else if (channel == 14) return channel14;
            else if (channel == 15) return channel15;
            else return servoBot;
        }
    }
}
Avatar billede Syska Mester
22. august 2009 - 01:55 #9
Mest for at være sikker ...

Er det 2 projekter i en solution ?
Avatar billede blod_1 Nybegynder
22. august 2009 - 02:00 #10
Det skulle det være, hvis jeg da har lavet det rigtigt?

http://peecee.dk/uploads/082009/Udklip.PNG
Avatar billede blod_1 Nybegynder
22. august 2009 - 02:01 #11
Første kode udsnit er fra SamplePluginForm.cs, og det andet er fra ServoControl.cs
Avatar billede Syska Mester
22. august 2009 - 02:18 #12
Prøv for sjov at ændre namespacet så de hedder det samme ...

Kan ikke rigtig få det til at passe at oversåtende ikke virker ...

// ouT
Avatar billede Syska Mester
22. august 2009 - 02:18 #13
og alle compile fejl ...
Avatar billede blod_1 Nybegynder
22. august 2009 - 02:21 #14
Det giver så dette istedet

Error    1    'ServoControl' is a 'namespace' but is used like a 'type'    C:\Plugin\SamplePlugin\SamplePluginForm.cs    16    9    Servo Controller

på denne linie

ServoControl sc = new ServoControl(); //Set instance for the ServoControl class

hvor det er

den første ServoControl den siger det er galt med
Avatar billede blod_1 Nybegynder
22. august 2009 - 02:48 #15
jeg tror vi begge sidder og sover...

progressBar00.Value = sc.servoPos(0);

gjorde tricket...
Avatar billede Syska Mester
22. august 2009 - 02:59 #16
Jeg har ikke linje numre ... så svært for mig at se.

Men på den gode side så har du lært at kigge godt efter hvad ens debugger siger ... det er ens bedste ven og den fortæller næsten altid hvad der er galt ... :-)

Men går ud fra at det er svar nok eller ?
Avatar billede blod_1 Nybegynder
22. august 2009 - 03:01 #17
Ja, det var rigelig med svar :)

Tak for hjælpen, nu kan jeg komme videre med projektet. :D
Avatar billede Syska Mester
22. august 2009 - 03:34 #18
Det er jeg da glad for :-)

Nu kan jeg også selv komme i seng ... orker ikke at lave mere i dag.

// ouiT
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester