Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C#] Gestire oggeti Form da altre classi

    Sono alle prime armi e vorrei sapere come fare a gestire oggetti Form da un'altra classe o file?
    Esempio:
    File: Form1.cs (legato al Form1.Designer.cs)
    codice:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    
    namespace Csharp_Simple_CDC_Demo
    {
        public partial class Form1 : Form    
        {
            delegate void SetTextCallback(string text);
        
            public Form1()
            {
                InitializeComponent();
                lstBaudRate.SelectedIndex = 5;
                rxdPcDataReceived.Clear();
                txdPcDataReceived.Clear();
                UpdateCOMPortList();
                btnSendData.Enabled = false;
                txtData.Enabled = false;
            }
    
            public void UpdateCOMPortList()
            {
                int i;
                bool foundDifference;
               
                i = 0;
                foundDifference = false;
    
                if (lstCOMPorts.Items.Count == SerialPort.GetPortNames().Length)
                {
                    foreach (string s in SerialPort.GetPortNames())
                    {
                        if (lstCOMPorts.Items[i++].Equals(s) == false)
                        {
                            foundDifference = true;
                        }
                    }
                }
                else
                {
                    foundDifference = true;
                }
    
                if (foundDifference == false)
                {
                    return;
                }
    
                lstCOMPorts.Items.Clear();
    
                foreach (string s in SerialPort.GetPortNames())
                {
                    lstCOMPorts.Items.Add(s);
                }
                lstCOMPorts.SelectedIndex = 0;
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                UpdateCOMPortList();
            }
    
            private void btnConnect_Click(object sender, EventArgs e)
            {
                Int32 i;
                bool conversion;
                try
                {
                    serialPort1.PortName = lstCOMPorts.Items[lstCOMPorts.SelectedIndex].ToString();
                    conversion = Int32.TryParse(lstBaudRate.Text,out i);
                    if (conversion != true)
                    {
                        throw new Exception();
                    }
                    serialPort1.BaudRate = i;
                    serialPort1.DataBits = 8;
                    serialPort1.Parity = Parity.None;
                    serialPort1.Open();
                    btnConnect.Enabled = false;
                    lstCOMPorts.Enabled = false;
                    lstBaudRate.Enabled = false;
                    btnClose.Enabled = true;
                    //
                    comStatText.Text = "Connected";
                }
                catch
                {
                    comStatText.Text = "Error Opening";
                }
            }
    
            private void btnClose_Click(object sender, EventArgs e)
            {
                btnClose.Enabled = false;
                btnConnect.Enabled = true;
                lstCOMPorts.Enabled = true;
                lstBaudRate.Enabled = true;
                comStatText.Clear();
    
                try 
                {
                    serialPort1.DiscardInBuffer();
                    serialPort1.DiscardOutBuffer();
                    serialPort1.Close();
                }
                catch { }
            }
    
            private void SetText(string text)
            {
                byte i;
                // InvokeRequired required compares the thread ID of the
                // calling thread to the thread ID of the creating thread.
                // If these threads are different, it returns true.
                if (this.txdPcDataReceived.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.Invoke(d, new object[] { text });              
                }
                else
                {             
                    if (text.Contains("T"))
                    {
                        this.txdPcDataReceived.AppendText(text.Remove(0,1));                    
                        for (i =1; i < (text.Length - 1); i++)
                        {    
                            this.txdPcDataHex.AppendText(Convert.ToString(text[1], 16));
                            this.txdPcDataHex.AppendText(" ");
                        }                            
                    }
                    else if (text.Contains("R"))
                    {
                        this.rxdPcDataReceived.AppendText(text.Remove(0,1));
                        for (i = 1; i < (text.Length - 1); i++)
                        {
                            this.rxdPcDataHex.AppendText(Convert.ToString(text[1], 16));
                            this.rxdPcDataHex.AppendText(" ");
                        }
                    }
                }
            }
    
            private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                this.SetText(serialPort1.ReadExisting());
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                serialPort1.DiscardInBuffer();
                serialPort1.Write("pippo", 0, 5);
            }     
    }
    Vorrei però gestire (read/write) gli oggeti di Form1 da quest'altro file:
    codice:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    
    
    public class SerialProto
    {
        public Smsp()  
        {
            pendingAnswersCtr = 0;
            broad_packet = 0;
        }
    
        private void SmspAvvioTx()
        {
    //      serialPort1.Write("pluto", 0, 5); // <-- Per esempio vorrei poter utilizzare questa 
        }
    }
    Se la classe SerialProto la chiamo: public partial class Form1 : Form sotto il namespace
    Csharp_Simple_CDC_Demo (come il file Form1.cs) l'oggetto serialPort1 riesco a gestirlo ma vorrei trovare un'altra strada.
    Grazie.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    I linguaggi .NET hanno il loro forum dedicato: VisualBasic e .NET Framework.

    Sposto.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    se vuoi usare degli oggetti di una classe (il form è una classe) da un'altra classe, allora li devi passare al costruttore in modo da evere dei riferimenti es:

    codice:
    public class SerialProto
    {
        tipoDiSerialPort serialPort1;
    
        public Smsp(tipoDiSerialPort parametroPassato) //passaggio al costruttore 
        {
            pendingAnswersCtr = 0;
            broad_packet = 0;
            serialPort1 = parametroPassato; //riferimento
        }
    
        private void SmspAvvioTx()
        {
    //      serialPort1.Write("pluto", 0, 5); // <-- ora puoi
        }
    }

  4. #4
    Grazie per l'informazione ma avrei bisogno di ulteriori delucidazioni.
    Intendi dire così:
    codice:
    public class Smsp
    {
    //  tipoDiSerialPort serialPort1; 
        Form1 serialPort1;
    
    //  public Smsp(tipoDiSerialPort parametroPassato) //passaggio al costruttore 
        public Smsp(Form1 parametroPassato) // passaggio al costruttore 
        {
            pendingAnswersCtr = 0;
            broad_packet = 0;
            serialPort1 = parametroPassato; // riferimento
        }
    
        private void SmspAvvioTx()
        {
    //      serialPort1.Write("pluto", 0, 5); // <-- così non posso 
            serialPort1.serialPort1.Write("pluto", 0, 5); // ma così sì
        }
    }
    Se volessi chiamare il metodo SmspAvvioTx() dalla classe Form1 come devo fare
    visto che ora è presente un parametro al costruttore?
    Es. questa istanza non è piu' valida: Smsp ser1Smsp = new Smsp();
    Grazie.

  5. #5
    Intanto devi dargli una visibilità pubblica e non private

    codice:
    public void SmspAvvioTx()
        {
    //      serialPort1.Write("pluto", 0, 5); // <-- così non posso 
            serialPort1.serialPort1.Write("pluto", 0, 5); // ma così sì
        }
    Poi ci sarebbe da affrontare un discorso di istanza.
    Le form, essendo di fatto degli oggetti, vanno trattati come tali, pertanto, ad un form, non dovrai accedere o mostrarlo semplicemente scrivendo

    codice:
    form1.show
    ma in questo modo:

    codice:
    Form1 frm1=new Form1
    frm1.show
    In questo modo non hai usato l'istanza di classe, ma hai creato una nuova istanza con un riferimento ad un oggetto al quale potrai accedere a tutti i suoi metodi e proprietà di visibilità pubblica.

    Facci sapere...
    Ciao

  6. #6
    Ma se istanzio Form1 frm1 = new Form1(); poi nella classe qui sotto non posso istanziare
    l'altra classe (Smsp) se no mi genera un eccezzione di stack overflow:
    Ho eliminato il codice superfluo per riuscire a focalizzare il problema.
    Questo nel file Form1.cs:
    codice:
    namespace Csharp_Simple_CDC_Demo
    {
        public partial class Form1 : Form    
        {
            Smsp ser1Smsp = new Smsp(); 
      
            public Form1()
            {
                
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                ser1Smsp.SmspAvvioTx(); 
            }
    }
    Questo nel file Smsp.cs:
    codice:
    public class Smsp
    {
        Form1 frm1 = new Form1(); // <-- Questa mi genera un eccezzione di stack overflow
    
        public Smsp()  
        {
    
        }
    
        public void SmspAvvioTx()
        {
            frm1.serialPort1.Write("pluto", 0, 5);   
        }
    }
    Come faccio a richiamare un oggetto del form(serialPort1) da un'altra classe?
    Grazie

  7. #7
    Certo....il mio era solo un esempio....l'errore di stack overflow è normale scritto come lo hai scritto tu(o come ti ho fatto capire male io).

    Praticamente, scritto così continuerebbe a creare istanze di form infinite....form1 crea smsp che crea form1 che crea smsp che crea form1...etc...etc..etc...


    Nel SerialPort1 scrivi il metodo che devi rendere di visibilità pubblica.
    codice:
     public void QuestoEilMetodoPubblico()
        {
    //qui scrivi il codice
        }
    nel Form1 scrivi questo:
    codice:
    public partial class Form1 : Form    
        {
           SerialPort1 sp1 = new SerialPort1(); 
      
          private void button1_Click(object sender, EventArgs e)
            {
                sp1.QuestoEilMetodoPubblico(); 
            }
    Facci sapere...
    Ciao

  8. #8
    OK chiarito il problema di stack overflow.
    Ma quello che vorrei riuscire a fare, come ho descritto nel mex precedente, chiamare l'oggetto del form da un'altra classe, senza utilizzare quello che mi hai descritto tu.
    Grazie

  9. #9
    Vediamo se ho capito.....
    Tu hai Form1 e Form2(esempio) nel Form1 inserisci un controllo TextBox....Tu vorresti sapere come fai a scrivere nella textbox del form1 dal form2??
    Altrimenti scusa .... ma sono io che non capisco quale è il tuo problema.

    Facci sapere...
    Ciao

  10. #10
    No, ho solo Form1 e vorrei utilizzare un oggetto di esso da un'altra classe come ho descritto nell'esempio precedente.
    L'esempio che ho fatto è molto semplice e verrebbe da risolverlo come hai giustamente descritto tu, ma per la mia applicazione avrei bisogno di gestire oggetti Form anche da altre classi istanziando nel file Form1 anche altre classi per poter chiamare metodi altrui, senza rincorrere in quella eccezzione di stack overflow.
    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.