Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

C# Pretplata metode iz forme na DataRecive dogadjaj klase koja se nalazi u istom projektu

  • 4 odgovora
  • 3.893 pregleda

Najnovija ↓

C# Pretplata metode iz forme na DataRecive dogadjaj klase koja se nalazi u istom projektu 11.08.2012. u 13:06 · pre 173 meseca #1
Nikako da mi podje za rukom sledece. Razvio sam klasu koja mi sluzi za rad sa SerialPortom. U klasi se nalazi jedna promenljiva nazvana _ComPort tipa SerialPort. Kada se desi DataRecive event ove promenljive pokrece se jedna metoda iz iste klase (pretplacena je na ovaj dogadjaj). Prikaz te metode je dat ispod.

Code:

        private void ComSaveExisting(object sender, SerialDataReceivedEventArgs e)
        {
            _Respone = _comPort.ReadExisting();
        }


u konsktruktoru klase pretplatio sam se na ovu metodu

Code:

        public IOOperations()
        {
            _comPort = new SerialPort();
            _comPort.DataReceived += new SerialDataReceivedEventHandler(ComReadExisting);
        }


Kreiran je C# Windows Form projekat (ne WPF). Iza forme se nalazi sledeci kod

Code:

        IOOperations instIO;
        public Main()
        {
            InitializeComponent();

            instIO = new IOOperations();
            instIO.FindDeviceComPortAndSet();
            instIO.ComBaudRate = 112500;
            instIO.ComHandshake = Handshake.None;
            instIO.ComStopbits = StopBits.One;
            instIO.ComDataBits = 8;
            instIO.ComOpen();
        }


instIO - je instanca klase koja je zaduzena za rad sa Serial Portom (u ovoj klasi se nalazi gore navedena metoda ComSaveExisting).

Kada se desi DataRecive dogadjaj, i pokrene metoda ComSaveExisting, izvrsava se linja koda koja cita podatke i cuva ih u promenljivu _Respone. Posto su podaci sacuvani meni treba da se pokrene metoda koja se nalazi u Formi. Ova metoda treba da se svaki put pozove kada se pokrene metoda ComSaveExisting iz klase. Pozivanje metode iz forme treba da se izvrsi iz metode koja se nalazi u klasi, a posle linije koda ._Respone = _comPort.ReadExisting(). U metodi u formi se nalazi kod koji obradjuje sadrzaj _Respone promenljive, pristupa mu preko GET PROPRERTY.

Code:

_Respone = _comPort.ReadExisting();
 --> KOD KOJI POZIVA METODU KOJA SE NALAZI U FORMI
 // KRAJ METODE 


Ja sam nesto pokusavao i sa delegatima, i eventima, i sa prosledjivanjem ref parametara ali nije mi uspelo.


Moguce je pretplatiti metodu na isti dogadjaj iz klase, DataRecive dogadjaj. Ovo je bila moja prva ideja ali sam odustao od toga. Kao sto znamo kada se desi dogadjaj sve metode koje su pretplacene na njega u isto vreme se obavestavaju o promenama. To moze da izazove Exception (ispali izuzetak), ili u jos gorem slucaju da se metoda u formi prva izvrsi, pokusa da procita vrednost promenljive _Respone, a da se tek posle toga izvrsi metoda iz klase koja cita podatke sa Serial Porta.

Da li je moguce odrediti redosled izvrsavanja metoda koje su pretplacene na isti dogadjaj?
Re: C# Pretplata metode iz forme na DataRecive dogadjaj klase koja se nalazi u istom projektu 11.08.2012. u 21:40 · pre 173 meseca #2
Dodaj u klasu promenljivu MyForm (tj. onako kako ti se zove izvedena klasa) i promeni konstruktor:

Code:

class IOOperations {
     private MyForm _mf; //promenljiva koja cuva referencu na formu

    public IOOperations(MyForm mf) { // novi konstruktor
        _mf = mf;
    }

    private void ComSaveExisting(object sender, SerialDataReceivedEventArgs e) {
            _Respone = _comPort.ReadExisting();
            _mf.MyMethod(); // poziv public metoda iz forme
        }
}


Zatim u formi:

         public Main() {
            InitializeComponent();

            instIO = new IOOperations(this); // kreiras objekat tako sto prosledis referencu na formu
            instIO.FindDeviceComPortAndSet();
            instIO.ComBaudRate = 112500;
            instIO.ComHandshake = Handshake.None;
            instIO.ComStopbits = StopBits.One;
            instIO.ComDataBits = 8;
            instIO.ComOpen();
        }
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme