Avatar billede freesite Nybegynder
13. september 2010 - 14:10 Der er 10 kommentarer og
1 løsning

Delegate "Updater form object fra extern klasse"

Hej Eksperter, vil lige høre om der er nogle som kan hjælpe.

Jeg har en form klasse og en serialInterface klasse. I min form klasse er der et tekst-objekt (Angle) som skal updateres på baggrund af den modtagne data fra uarten. Denne køre i en seperat tråd.




--------- Main ------
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialInterface SI = new serialInterface();
        }

        private delegate void UpdateTextBoxDelegate(string message);

        public void UpdateTextBox(string message)
        {
            if (Angle.InvokeRequired == true)
            {
                this.Invoke
            (new UpdateTextBoxDelegate(UpdateTextBox),
            new object[] { message });
            }
            else
            {
                Angle.Text = message;
            }
        }
       
        private void Form1_Load(object sender, EventArgs e)
        {
           
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }



--------- Serial Interface

    class serialInterface
  {
        private SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);

        public serialInterface()
        {
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            port.Open();
        }


        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) {
            if (port.BytesToRead % 4 == 0)
            {
                byte[] Buffer = new byte[4];
                port.Read(Buffer, 0, 4);

                Form1.Angle.Text = Buffer[0]; // Ville jeg gerne
            }
        }
    }
}
Avatar billede lasserasch Juniormester
13. september 2010 - 15:43 #1
Og dit spørgsmål er?

Hvis jeg skal gætte mig lidt frem, så er dit spørgsmål vel at du ikke ved hvordan du får kaldt UpdateTextbox fra din serialinterface tråd? Korrekt?

Du er jo nødt til at have en reference til Form1 for at kunne gøre det.

Altså:


class serialInterface
  {
Form1 sender = null;
        private SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);

        public serialInterface(Form1 form)
        {
            this.sender = form;
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            port.Open();
        }


        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) {
            if (port.BytesToRead % 4 == 0)
            {
                byte[] Buffer = new byte[4];
                port.Read(Buffer, 0, 4);

                Form1.Angle.Text = Buffer[0]; // Ville jeg gerne
            }
        }
    }
}



Og fra din form opretter du så serialinterfaceklassen sådan:

            InitializeComponent();
            serialInterface SI = new serialInterface(this);


Mvh.
Lasse
Avatar billede lasserasch Juniormester
13. september 2010 - 15:44 #2
Og nu fik jeg så ikke rettet i port_DataRecieved metoden.

Der skal du så slette 'Form1.Angle.Text == .....' og i stedet skrive

sender.UpdateTextBox(din tekst værdi);
Avatar billede freesite Nybegynder
13. september 2010 - 21:41 #3
Hej Lasse

Mange tak for svar. Jeg har forsøgt med din løsning direkte, men den vil ikke tillade at jeg skriver:
sender.UpdateTextBox("din tekst værdi");

Men ellers var det lige det som jeg søgte.

M.v.h. Mads
Avatar billede lasserasch Juniormester
13. september 2010 - 22:04 #4
Hvad mener du med at den ikke vil tillade det?

UpdateTextBox er en public metode og skal derfor også være tilgængelig fra den reference du har til Form1.

Får du en fejl eller hvad er problemet?

Mvh.
Lasse
Avatar billede freesite Nybegynder
14. september 2010 - 08:05 #5
Hej Lasse

Ja jeg får følgende fejlmeddelelse knyttet til klassen serialInterface.cs


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

M.v.h. Mads
Avatar billede lasserasch Juniormester
14. september 2010 - 09:17 #6
Jeg bliver nødt til at se den kode hvori du får den fejl.

Kan du poste det du har nu?


Mvh.
Lasse
Avatar billede freesite Nybegynder
14. september 2010 - 09:36 #7
Hej Lasse

Ja meget gerne.

--- serialInterface.cs ------------

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

namespace WindowsFormsApplication1
{
class serialInterface
  {
        Form1 sender = null;
        private SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);

        public serialInterface(Form1 form)
        {
            this.sender = form;
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            port.Open();
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) {
            if (port.BytesToRead % 4 == 0)
            {
                byte[] Buffer = new byte[4];
                port.Read(Buffer, 0, 4);

                sender.UpdateTextBox("din tekst værdi");
            }
        }
    }
}


--- Main -----------------------------------------

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialInterface SI = new serialInterface(this);
        }

        public delegate void UpdateTextBoxDelegate(string message);

        public void UpdateTextBox(string message)
        {
            if (Angle.InvokeRequired == true)
            {
                this.Invoke
            (new UpdateTextBoxDelegate(UpdateTextBox),
            new object[] { message });
            }
            else
            {
                Angle.Text = message;
            }
        }

        private void Form1_Load(object sender, EventArgs e){}

        private void label1_Click(object sender, EventArgs e){}
    }
}

M.v.h. Mads
Avatar billede lasserasch Juniormester
14. september 2010 - 12:08 #8
Det er min fejl.

I serialinterface klassen skal du omdøbe 'sender' til 'senderform'

Altså : Form1 senderform = null;

og i 'port_DataReceived' metoden skal du så kalde
'senderform.UpdateTextBox("din tekst værdi");' i stedet for
'sender.UpdateTextBox("din tekst værdi");'.


Mvh.
Lasse
Avatar billede freesite Nybegynder
15. september 2010 - 08:12 #9
Hej Lasse

Perfekt, det virker, mange tak for det.

Lige et sidste spørgsmål, når programmet har modtaget ca. 760*4 bytes går det i stå. Mangler der en flush buffer ?.


M.v.h. Mads Helle
Avatar billede lasserasch Juniormester
17. september 2010 - 09:36 #10
Hejsa.

Umiddelbart ser din kode til at modtage data via COMX fin ud.

Lad os få lukket denne tråd :-)


Mvh.
Lasse
Avatar billede freesite Nybegynder
17. september 2010 - 10:49 #11
Hej Lasse

Mange tak for hjælpen.

M.v.h. Mads
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