Oppure

Loading
08/07 9:41
alip1
Buongiorno, intanto mi scuserete per la forse banalità della domanda
sto cercando di ristudiare c# per poi convertire un mio progetto da VB 2012 in C# 2012. Sto utilizzando la suite VS 2012 ovviamente..

Ho il seguente codice nel file program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FinancialCalculations
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (startApplication()) 
            {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
            }
            else
            {
                TerminaApp();
            }
        }
        static public bool startApplication()
        {
            // codice apertura login ecc...
            return true;
        }

        static void TerminaApp()
        {
            /// codice di chiusura
            Application.Exit;
        }
    }
}


la riga di comando per terminare l'applicazione
  Application.Exit; 

mi da errore già a livello di progettazione:_doubt:!!

Nella lista degli errori trovo:

Error	1	Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement


e non riesco a capire nè cosa difatto significhi e come risolvererlo:_doubt:
Grazie per ogni aiuto.
Ultima modifica effettuata da alip1 08/07 9:42
aaa
08/07 11:36
Carlo
La sintassi è sbagliata, Application.Exit; si scrive Application.Exit();

Ma il codice che hai proposto non eseguirà mai l'istruzione Application.Exit(); a meno che non ci sia un errore in: startApplication().

Quando apri una nuova applicazione in VS, C# WindowsForm, ti viene proposto un progetto pronto per iniziare.
Il progetto conterrà, Program.cs con questo codice:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace FinancialCalculations
{
    static class Program
    {
        /// <summary>
        /// Punto di ingresso principale dell'applicazione.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}


Che imposta l'oggetto d'ingresso: Application.Run(new Form1()); oppure Application.Run(new frmMain()); se hai rinominato Form1.cs

Per un progetto WinForm il codice in Program.cs solitamente non va modificato.
La tua programmazione deve essere implementata nel codice presente in Form1.cs o ComeSiChiamaIlFormDiAvvio.cs. Per accedere al codice di Form1, clicca su Form1.cs nella finestra Esplora soluzioni con il tasto destro e scegli: Visualizza codice (F7).

Il codice in Form1.cs si presenta così:
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FinancialCalculations
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}


Questo codice è quello che viene eseguito in prima istanza e lanciato da Program.cs
Nello specifico InitializeComponent(); carica il codice presente in: Form1.Designer.cs
Il codice in: Form1.Designer.cs viene autogenerato da VS quando si mettono i vari componenti sul form da designer(progettazione).

Se vuoi eseguire l'istruzione: Application.Exit(); devi attendere che il fom sia creato e caricato, per fare questo vai sulla finestra Form1.cs [Progettazione], clicca due volte sul form vuoto per creare l'evento: LOAD, nell'evento LOAD ora puoi inserire l'istruzione di chiusura:
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FinancialCalculations
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}


Il risultato di questa operazione è:
Program.cs lancia Form1, in Form1 viene creato il form ( InitializeComponent(); ) una volta caricato Form1, nell'evento: Form1_Load viene terminato con: Application.Exit();


Ultima modifica effettuata da Carlo 08/07 19:06
in programmazione tutto è permesso
10/07 8:47
alip1
Grazie Carlo.. risolto..

Ancora una domanda in merito... volendo metterle in un modulo cs le due routine dichiarate public è possibile farlo per poi richiamarle da un qualsiasi altro punto del programma come accade con vb.net??
Ho provato ad aggiungere un modulo StartStopApp.cs al progetto e nel codice ho inserito le due routine così dichiarate:
public bool startApplication()
        {
            // codice apertura login ecc...
            MessageBox.Show("Apertura App", "Enter", MessageBoxButtons.OK, MessageBoxIcon.Information); // temporaneo
            return false;
        }
public void TerminaApp()
        {
            /// codice di chiusura
            MessageBox.Show("Chiusura App", "Exit", MessageBoxButtons.OK, MessageBoxIcon.Information); // mi serve temp 
            Application.Exit();           
        }


Intanto mi sottolinea sia il bool che il void! dicendomi: Error    3    Expected class, delegate, enum, interface, or struct!!
Inoltre ovviamente la chiamata dal program.cs :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FinancialCalculations
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (startApplication()) 
            {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
            }
            else
            {
               // Application.Exit;
                TerminaApp();
            }
        }
    }
}



mi dice che Error    1    The name 'startApplication' does not exist in the current context    
e la stessa cosa per 'terminaApp()!!
Non riesco proprio a capire come fare; eppure in VB è così semplice e banale... mi son letto parecchie guide ma di fatto non riesco a capire dov'è il problema e l'impostazione scorretta.. Grazie per ogni aiuto
Ultima modifica effettuata da alip1 10/07 8:50
aaa
10/07 10:41
Thejuster
Se hai messo le due funzioni in una classe vuota ovvio che ti dia errore.

in c# il tutto deve avere una struttura

--- Eventuali using

namespace MioNameSpace {

public class MiaClasse
{

//Mie Funzioni boo o void.



}

}





using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace FinancialCalculations
{

    public class MieiMetodi
    {

       public bool startApplication()
        {
            // codice apertura login ecc...
            MessageBox.Show("Apertura App", "Enter", MessageBoxButtons.OK, MessageBoxIcon.Information); // temporaneo
            return false;
        } 


        public void TerminaApp()
        {
            /// codice di chiusura
            MessageBox.Show("Chiusura App", "Exit", MessageBoxButtons.OK, MessageBoxIcon.Information); // mi serve temp
            Application.Exit();          
        }


     }



}




Creata la classe, dal un'altro Form o punto dell'applicazione


MieiMetodi mm = new MieiMetodi();

bool risultato = mm.startApplication();

if(risultato == true)
{

  //prosegue
}else
{
     mm.TerminaApp();
}

mire.forumfree.it/ - Mire Engine
C# UI Designer
10/07 10:49
Carlo
Postato originariamente da alip1:
Volendo metterle in un modulo cs le due routine dichiarate public è possibile farlo per poi richiamarle da un qualsiasi altro punto del programma come accade con vb.net??
Ho provato ad aggiungere un modulo StartStopApp.cs al progetto...


In C# si aggiunge una classe.

Il codice in Program.cs, non lo devi modificare, serve per il punto di ingresso dell'applicazione.
Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace FinancialCalculations
{
    static class Program
    {
        /// <summary>
        /// Punto di ingresso principale dell'applicazione.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
        }
    }
}

Aggiungi una classe, StartStopApp
StartStopApp.cs:
using System.Windows.Forms;

namespace FinancialCalculations
{
    public class StartStopApp
    {
        public bool startApplication()
        {
            // codice apertura login ecc...
            MessageBox.Show("Apertura App", "Enter", MessageBoxButtons.OK, MessageBoxIcon.Information); // temporaneo
            return false;
        }
        public void TerminaApp()
        {
            /// codice di chiusura
            MessageBox.Show("Chiusura App", "Exit", MessageBoxButtons.OK, MessageBoxIcon.Information); // mi serve temp
            Application.Exit();
        }
    }
}


Ora in frmMain.cs puoi dichiarare la classe StartStopApp l'ho chiamata modulo usando i metodi contenuti ed esposti con public
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 FinancialCalculations
{
    public partial class frmMain : Form
    {
        private StartStopApp modulo = new StartStopApp(); // modulo, conterrà la tua classe

        public frmMain()
        {
            InitializeComponent();
            modulo.startApplication();
            modulo.TerminaApp();
        }
    }
}


Questo esempio serve solo per farti capire come rendere visibili le classi tra di loro, a livello di logica non fa nulla di funzionale.
Nota che Application.Exit(); viene eseguito quando il form non è stato ancora caricato e non avrà nulla da chiudere.

Cosa vuoi ottenere?
Ultima modifica effettuata da Carlo 10/07 11:06
in programmazione tutto è permesso
10/07 15:15
alip1
Grazie Carlo.

Veramente io pensavo (come in VB) di poter dichiarare in un modulo .cs una serie di routine (funzioni o meno) pubbliche da poter richiamare per poter fare delle cose prima di lanciare il form principale di apertura. Ciò perché vorrei poter andare a leggere, ad es., un file che mi permette di settare delle variabili globali (ad esempio una variabile è per conoscere il path del server SQL..) poi lanciare un form di login che mi controlla e mi definisce l'utente che accede con le relative autorizzazioni (lette da apposita tabella nel db... ) e solo allora se tutto ok mi apre un form mdi col quale l'utente gestisce l'applicazione vera e propria... L'applicazione l'ho già completamente sviluppata in vb.net (2012) e funziona perfettamente... Ora stavo cercando di riprendere lo studio di C# con un'applicazione di esempio per reimpararlo per poi migrare l'applicazione vera propria da vb a c#. Ma prima di farlo sto cercando di chiarirmi le idee...
Ora da quando mi hai postato, di cui ti ringrazio, mi pare di capire che anche per le routine, diciamo così, di servizio devo definire una classe che poi dovrò istanziare quando devo usare le routine... Però non capisco perché sono obbligato a doverle istanziare in un form che non aprirò mai... E' questo che non capisco e probabilmente sono fortemente condizionato dal modo di pensare e programmare in vb...
Io pensavo (come fatto in vb) di definire le routine di servizio in modalità public e poi richiamarle nella routine Main e dopo aver superato tutti i controlli lanciare il frmMain che gestirà l'applicazione.

Scusami, per la mia grassa ignoranza, e spero di essere riuscito a spiegarmi e ti sarei veramente grato di ogni utile consiglio.

Aggiungo una nota provando e riprovando ho risolto così:
ho creata la classe StartStopApp con le due routine di prova... come da te suggerito quindi nel program.cs ho fatto:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace FinancialCalculations
{
    class Program
    {
        /// <summary>
        /// Punto di ingresso principale dell'applicazione.
        /// </summary>
        [STAThread]
        static void Main()
        {
            StartStopApp Start = new StartStopApp(); // modulo, contiene le routine pubbliche
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (Start.startApplication())
            {
                Application.Run(new frmMain());
            }
            else
            {
                Start.TerminaApp();
            }            
        }
    }
}


Funziona mi apre i messaggi e quindi se restituisce true mi apre il formMain.
Pensi che possa considerarsi corretto??
Grazie
Ultima modifica effettuata da alip1 10/07 15:50
aaa
10/07 18:33
nessuno
Ma esattamente che tipo di progetto hai creato?

Console o Windows Form?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
10/07 21:36
Carlo
Postato originariamente da alip1:
Io pensavo (come in VB) di poter dichiarare in un modulo .cs una serie di routine (funzioni o meno) pubbliche da poter richiamare per poter fare delle cose prima di lanciare il form principale di apertura...


Si può fare con le variabili statiche (static) che sono visibili in tutte le classi.
Ti sconsiglio di usare tale pratica in C# perché ti perdi tutti i vantaggi delle classi. Una classe è riutilizzabile in più forms e routine e le variabili entro contenute resteranno valide solo per le istanze scelte.

Nel tuo caso semplicemente ti devi creare un form aggiuntivo con tutto quello che ti serve per fare login, scelta db ecc. ecc.
Il form2 lo istanzierai e renderai visibile prima del form1...

Ho già aiutato un utente per un motivo simile e ho ancora l'esempio che gli postai, te lo allego.

Non fa quello che ti serve ma una volta capito non ti dovrebbe restare difficile fare quello che ti sei prefisso.
Prova e chiedi.
Ultima modifica effettuata da Carlo 16/07 7:33
in programmazione tutto è permesso