[Visual C#] Suddivisione del codice in file diversi

di il
3 risposte

[Visual C#] Suddivisione del codice in file diversi

Ho un programma fatto in visual c# su wpf net4 e visual basic 2010. Vorrei dichiarare le variabili usate nel programma in un file diferso da MainWindow.xaml.cs.

Mi é stato consigliato di nominare il nuovo file:

variabili.cs

di scriverci dentro:
public static class VariabiliGlobali
{
double a = 1;
double b = 2;
double c = 3;
}
e di aggiungere al nuovo progetto:

WpfApplication1.Software.VariabiliGlobali.a;
WpfApplication1.Software.VariabiliGlobali.b;
WpfApplication1.Software.VariabiliGlobali.c;

NomeDellaTuaApplicazione.NomeDellaCartella.NomeDellaClasse.nomedellavariabile:

Ho già fatto questa domanda su altri forum ma mai nessuno ha saputo darmi una soluzione valida che funzionasse. L'esigenza nasce dal fatto che a, b , c, ecc... sono matrici enormi...
Mi é anche stato detto di aggiungere la cartella del progetto al lavoro ma in esplora risorse non trovo nessun riferimento a questa operazione...

3 Risposte

  • Re: [Visual C#] Suddivisione del codice in file diversi

    Ho poi scoperto che si possono anche usare le classi parziali e ho scritto il seguente codice ma non funziona:

    MainWindow.xaml.cs
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApplication1
    {
        /// <summary>
        /// Logica di interazione per MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                lunghezza.KeyUp += new KeyEventHandler(calcoloconinvio);
                neve.KeyUp += new KeyEventHandler(calcoloconinvio);
                permanente.KeyUp += new KeyEventHandler(calcoloconinvio);
                scelta.KeyUp += new KeyEventHandler(calcoloconinvio);
            }
    
            void calcoloconinvio(object sender, KeyEventArgs e)
            {
                if (e.Key == Key.Return)
                {
                    METODO(lunghezza, neve, permanente, scelta);
                }
            }
            partial void preventivo_Click(object sender, RoutedEventArgs e)
            {
                METODO(lunghezza, neve, permanente, scelta);
            }
            private void METODO(TextBox lunghezza, TextBox neve, TextBox prevenivo, ComboBox scelta)
            
            {
                double L = 0; 
                double Cn = 0; 
                double Cp = 0;
                double COSTO; 
                double H = 0; 
                double psi_correttivo; 
                int r_abaco; 
                int c_abaco; 
                int errore = 0; 
                try
                {
                    L = double.Parse(lunghezza.Text);
                    Cn = double.Parse(neve.Text);
                    Cp = double.Parse(permanente.Text);
                }
                catch (Exception)
                {
                    MessageBox.Show("I dati di input sono sbagliati! Verificare di non aver inserito lettere, spazi o numeri 
    
    troppo grandi.", "ERRORE!", MessageBoxButton.OK, MessageBoxImage.Stop);
                    errore = 1;
                }
    
                ComboBoxItem Item = (ComboBoxItem)scelta.SelectedItem;
                if (Item.Content.ToString() == "<= 1000 m s.l.m.")
                {
                    psi_correttivo = 1;
                }
                else
                {
                    psi_correttivo = 0.7/0.5;
                }
                double Ctot = (Cn*psi_correttivo + Cp) ; //Carico neve + permanente non fattorizzati
                //double[,] abaco = { 
                //{ 30 , 0 , 0 , 0 },
                //{ 40 , 5 , 3*0.7/0.5+3 , 999 },
                //{ 40 , 5 , 6 , 99 },
                //{ 50 , 5 , 6 , 6 },
                //{ 50 , 5 , 6 , 6 },
                //{ 50 , 5 , 6 , 3 },
                //{ 50 , 5 , 6 , 6 }};
                r_abaco = abaco.GetLength(0);
                c_abaco = abaco.GetLength(1);
                double COSTOmax = 0;
                for (int i = 0; i < r_abaco; i++)
                {
                    if (abaco[i, 3] > COSTOmax)
                    {
                        COSTOmax = abaco[i, 3];
                    }
                }
                double Hi = 0;
                double COSTOi = 0;
                int Variabile_Test = 1;
                if (errore == 0)
                {
                    COSTO = COSTOmax;
                    for (int i = 0; i < r_abaco; i++)
                    {
                        if (abaco[i, 1] == L && abaco[i, 2] == Ctot)
                        {
                            Hi = abaco[i, 0];
                            COSTOi = abaco[i, c_abaco - 1];
                            if (COSTO >= COSTOi)
                            {
                                COSTO = COSTOi;
                                H = Hi;
                                altezza.Text = H.ToString("0");
                                costo.Text = COSTO.ToString("0.00");
                                Variabile_Test = 0;
                            }
                        }
                    }
                }
                if (Variabile_Test == 1 && errore != 1)
                {
                    MessageBox.Show("Lunghezza tegolo e carichi inaccettabili oppure valori scelti fuori range dal dominio 
    
    analizzato.", "ERRORE!", MessageBoxButton.OK, MessageBoxImage.Stop);
                    altezza.Text = "Altezza non valutabile!";
                    costo.Text = "Prevetivo non calcolabile!";
                }
                if (errore == 1)
                {
                    altezza.Text = "Errore nei dati di input!";
                    costo.Text = "Errore nei dati di input!";
                }
    
                //costo.SelectionStart = 0;
                //costo.SelectionLength = costo.Text.Length;
                //costo.Focus();
                //MessageBox.Show(COSTO.ToString());
            }
            private void scelta_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
     
    
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                Application.Current.Shutdown();
            }
    
            private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
            {
    
            }
    
            private void neve_TextChanged(object sender, TextChangedEventArgs e)
            {
    
            }
    
            private void permanente_TextChanged(object sender, TextChangedEventArgs e)
            {
    
            }
    
            private void altezza_TextChanged(object sender, TextChangedEventArgs e)
            {
    
            }
    
            private void costo_TextChanged(object sender, TextChangedEventArgs e)
            {
    
            }
    
        }
    }
    
    variabili.cs
    
    partial class VariabiliGlobali
    {
        double[,] abaco = { 
                { 30 , 0 , 0 , 0 },
                { 40 , 5 , 3*0.7/0.5+3 , 999 },
                { 40 , 5 , 6 , 99 },
                { 50 , 5 , 6 , 6 },
                { 50 , 5 , 6 , 6 },
                { 50 , 5 , 6 , 3 },
                { 50 , 5 , 6 , 6 }};
    }
    Nessuno mi può aiutare? Nessuno di voi divide il codice? Non ci credo!
  • Re: [Visual C#] Suddivisione del codice in file diversi

    forzamatlab ha scritto:


    public static class VariabiliGlobali
    {
    	double a = 1;
    	double b = 2;
    	double c = 3;
    }
    
    ... e di aggiungere al nuovo progetto:
    WpfApplication1.Software.VariabiliGlobali.a;
    1) Non puoi dichiarare campi non statici in una classe statica.
    2) Se non dichiari i campi pubblici non puoi accedervi dall' esterno della classe (se non scrivi niente sono privati).

    La forma corretta è:
    
    public static class VariabiliGlobali
    {
    	public static double a = 1;
    	public static double b = 2;
    	public static double c = 3;
    }
    
    e puoi usarla scrivendo in questo modo da qualsiasi punto del programma:
     VariabiliGlobali.a = 5;  
    P.S. Non è necessario che la classe sia statica (anche se magari è una buona norma), puoi anche scrivere:
    
    public class VariabiliGlobali
    {
    	public static double a = 1;
    	public static double b = 2;
    	public static double c = 3;
    }
    
    -------------------------------------------------------------------------------------------

    forzamatlab ha scritto:


    public partial class MainWindow : Window
    {
      ....
    }
    
    partial class VariabiliGlobali
    {
        double[,] abaco = { 
                { 30 , 0 , 0 , 0 },
                { 50 , 5 , 6 , 6 },
                { 50 , 5 , 6 , 3 },
                { 50 , 5 , 6 , 6 }};
    }
    
    La partial class serve per spezzare una classe e scriverla in più file per comodità pur rimanendo una classe unica, tu stai usando due classi (MainWindow e VariabiliGlobali). Devi scrivere:
    
    // file1.CS
    public partial class MainWindow : Window
    {	....
    	void MyFunc()
    	{
    	   abaco[i, 1] == L;    ...
    	}
    }
    // file2.CS
    partial class MainWindow 
    {
        double[,] abaco = { 
                { 30 , 0 , 0 , 0 },
                { 50 , 5 , 6 , 6 }};
    }
    
    A questo punto 'abaco' è un campo della classe accessibile da qualsiasi suo metodo.
    (n.b. ricorda che se non scrivi nulla il campo è privato, quindi non sarà visibile all' esterno della classe MainWindow).

    Spero di esserti stato utile, ciao.
  • Re: [Visual C#] Suddivisione del codice in file diversi

    Si moltissimo, grazie infinite
Devi accedere o registrarti per scrivere nel forum
3 risposte