Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

C# - Come si fa: esempi vari, parte 1

C#

Arrotondare una variabile decimale

  • Utilizzare il metodo 'Round':

   decimal _Valore = 1234.5678M;
   decimal _ValoreArrotondato = decimal
.Round(_Valore, 1);

Generazione di numeri casuali
  • Definire l’oggetto:

   Random Rnd = new Random();

  • Esempio, per ottenere un numero tra 1 e 100:

   Rnd.Next(1, 101)

Messaggi (MessageBox)
Messaggio di informazione
  • Messaggio con il bottone "OK" e una icona con la 'i' di informazione:

   MessageBox.Show("Messaggio informativo!", "ProjectName",
                  MessageBoxButtons.OK, MessageBoxIcon.Information);

Messaggio di attenzione
  • Messaggio con il bottone "OK" e una icona con punto esclamativo:

   MessageBox.Show("Messaggio importante!", "ProjectName",
                  MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

Messaggio di conferma
  • Messaggio con i due bottoni "Sì" e "No" e una icona con punto interrogativo:

   DialogResult dialogResult = MessageBox.Show("Confermi ...?", "ProjectName",
                  MessageBoxButtons.YesNo, MessageBoxIcon.Question);
   
if (dialogResult == DialogResult.Yes)
   {
       
// Se premuto 'Sì'
   }
   
else
   {
       
// Se premuto 'No'
   }


Avviare o terminare un altro processo
  • Utilizzare la classe 'Process' contenuta in 'System.Diagnostics'.

   using System.Diagnostics;

   
// Avvia il 'notepad'
   
Process p = new Process();
   p.StartInfo.FileName =
"notepad.exe";
   p.StartInfo.Arguments =
"doc1.txt";
   p.Start();

   
// Attende la pressione di un tasto
   
Console.ReadKey();

   
// Termina tutti i processi di tipo 'notepad'
   
foreach (Process p1 in Process.GetProcesses())
   {
       
if (p1.ProcessName == "notepad")
           p1.Kill();
   }


  • Utilizzare anche la proprietà Id del processo per averne un riferimento univoco.

Checksum di un barcode EAN13
  • Funzione che calcola il Checksum di un barcode di tipo EAN13 partendo dalla prime cifre.
  • L'algoritmo è il seguente:

- si sommano tra loro tutte le 12 cifre con l'accortezza di moltiplicare per 3 le cifre in posizione pari;
- una volta ottenuta la somma, si calcola il complemento alla decina superiore (p. es. se la somma è 56, il complemento alla decina superiore è 4).


   static byte CheckSum(long Numero)
   {
       string s = Numero.ToString();
       byte cifra = 0;
       byte somma = 0;
       for (byte i = 1; i <= s.Length; i++)
       {
           cifra = Convert.ToByte(s.Substring(i - 1, 1));
           if (i % 2 == 0)
               somma += (byte) (cifra * 3);
           else
               somma += cifra;
       }
       return (byte) ((10 - (somma % 10)) % 10);
   }

   private void button1_Click(object sender, EventArgs e)
   {
       MessageBox.Show(CheckSum(Convert.ToInt64(txt1.Text.ToString())).ToString());
   }


Passare degli argomenti ad un programma

  • Per passare uno o più argomenti a un programma, basta aggiungere nella Main() un array di stringhe.
  • Tramite codice, si accede poi a tutti gli elementi dell'array.

   static void Main(string[] args)
   {
       for (int i = 0; i < args.Length; i++ )
           MessageBox.Show("Argument: " + args[i]);
   }


Controllare la pressione di un bottone in un evento
  • È possibile controllare se in un evento, per esempio Click() o DoubleClick(), è premuto un bottone, per esempio Ctrl. Ecco un esempio dove viene controllata la pressione del Ctrl nell'evento Click() della Form.

   private void Form1_Click(object sender, EventArgs e)
   {
       
if ((ModifierKeys & Keys.Control) == Keys.Control)
       {
           
MessageBox.Show("Ctrl is pressed!");
       }
   }


Rilevare i tempi di esecuzione
  • Spesso è utile rilevare esattamente i tempi di esecuzione di procedure o funzioni per capire dove è necessario ottimizzare il codice.
  • Per fare questo è comodo utilizzare la classe ‘Stopwatch’ contenuta in ‘System.Diagnostics’.
  • Ecco un esempio di utilizzo.

   using System.Diagnostics;

   Stopwatch swTimer = new Stopwatch();
   swTimer.Start();

   
// Codice da cronometrare
   
// ...

   swTimer.Stop();
   
MessageBox.Show(swTimer.Elapsed.ToString());


Verificare che una stringa sia numerica
  • A volte è utile controllare che una stringa sia numerica, cioè composta solo da cifre: da 0 a 9.
  • Partendo dalla funzione sotto, si può apportare qualche modifica affinché il controllo sia più complesso. Per esempio per verificare se una stringa è composta da numeri e lettere.
  • Si possono ottenere però risultati più ampi utilizzando le Regular Expression.
  • La semplice funzione "IsNumeric" restituisce un boolean.

   if (IsNumeric("1234"))
   { }
   
else
   { }

  • Definizione della funzione.

   private bool IsNumeric(string s)
   {
       
int i;
       
for (i = 0; i < s.Length; i++)
       {
           
if (!Char.IsDigit(s, i))
               
break;
       }
       
if (i < s.Length)
           
return false;
       
else
           
return true;
   }


Impostare l'icona dell'applicazione
  • Selezionare la form, andare nelle proprietà (con F4) e impostare la proprietà 'Icon'.
  • Menu -> Project -> Properties -> Selezionare la scheda 'Application', impostare l'icona nella Text Box 'Icon'.

Versione del file e dell'assembly
  • In .NET la versione del file eseguibile può essere diversa da quella dell’assembly.
  • Esiste anche la versione del prodotto.
  • Per leggere la versione del file e anche altre informazioni riguardanti il file eseguibile, utilizzare il seguente codice.

   // File info.
   // Necessita di 'using System.Diagnostics'.
   Assembly assembly = Assembly.GetExecutingAssembly();
   FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
   Console.WriteLine("FileMajorPart: " + fvi.FileMajorPart);
   Console.WriteLine("FileMinorPart: " + fvi.FileMinorPart);
   Console.WriteLine("FileBuildPart: " + fvi.FileBuildPart);
   Console.WriteLine("FilePrivatePart: " + fvi.FilePrivatePart);
   Console.WriteLine("FileVersion: " + fvi.FileVersion);
   Console.WriteLine("CompanyName: " + fvi.CompanyName);
   Console.WriteLine("FileDescription: " + fvi.FileDescription);
   Console.WriteLine("FileName: " + fvi.FileName);
   Console.WriteLine("LegalCopyright: " + fvi.LegalCopyright);

  • Output:

   FileMajorPart: 1
   FileMinorPart: 2
   FileBuildPart: 3
   FilePrivatePart: 4
   FileVersion: 1.2.3.4
   CompanyName:
   FileDescription: ConsoleApplication1
   FileName: D:\C# Experiments\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
   LegalCopyright: Copyright © ******** 2017

  • Per leggere la versione dell’assembly, utilizzare il seguente codice.

   // Assembly info.
   // Necessita di 'using System.Reflection'.
   Version assemblyVersion = Assembly.GetEntryAssembly().GetName().Version;
   Console.WriteLine("Major: " + assemblyVersion.Major);
   Console.WriteLine("Minor: " + assemblyVersion.Minor);
   Console.WriteLine("Build: " + assemblyVersion.Build);
   Console.WriteLine("Revision: " + assemblyVersion.Revision);

  • Output:

   Major: 5
   Minor: 6
   Build: 7
   Revision: 8


Applicazione nella System Tray
  • Le applicazioni, quando vengono ridotte a icona, sono visibili nella ‘Barra delle applicazioni’.
  • In alcune situazioni, si vuole che l’applicazione ridotta a icona, non sia visibile nella ‘Barra delle applicazioni’, ma lo sia nella ‘System Tray’. Questa è l’area generalmente in basso a destra, dove risiedono alcune applicazioni che restano ‘in ascolto’, come antivirus, firewall, vpn, eccetera.
  • Con il codice seguente si imposta che l’applicazione venga ridotta nella System Tray. Un messaggio configurabile apparirà al momento della riduzione ad icona e un altro messaggio al passaggio del mouse sulla piccola icona. Infine è possibile configurare un menu per richiamare specifiche funzioni.
  • Al progetto è necessario aggiungere il controllo ‘NotifyIcon’ (cercarlo nella Toolbox); in questo esempio gli è stato dato il nome ‘notIcon’.
  • Ecco tutto il codice da aggiungere all’interno della classe Form.

   ContextMenu myMenu;

   public Form1()
   {
       InitializeComponent();
   }

   private void Form1_Load(object sender, EventArgs e)
   {
       // Aggiungere al progetto il controllo 'Notify Icon'
       this.notIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
       this.notIcon.BalloonTipText = "[Balloon Text when Minimized]";
       this.notIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
       this.notIcon.Icon = null;
       this.notIcon.Text = "[Message shown when hovering over tray icon]";

       // Menu contestuale
       myMenu = new ContextMenu();
       myMenu.MenuItems.Add(0, new MenuItem("First", new System.EventHandler(First_Click)));
       myMenu.MenuItems.Add(1, new MenuItem("Second", new System.EventHandler(Second_Click)));
       myMenu.MenuItems.Add(2, new MenuItem("Third", new System.EventHandler(Third_Click)));
       this.notIcon.ContextMenu = myMenu;
   }

   private void Form1_Resize(object sender, EventArgs e)
   {
       if (this.WindowState == FormWindowState.Minimized)
       {
           this.notIcon.Icon = new Icon(@"C:\Temp\myicon.ico");
           notIcon.Visible = true;
           notIcon.ShowBalloonTip(1000);
           this.ShowInTaskbar = false;
           this.Hide();  // Opzionale: nasconde finestra dalla lista Alt-Tab
       }
       else
       {
           this.notIcon.Icon = null;
       }
   }

   private void notIcon_DoubleClick(object sender, EventArgs e)
   {
       this.Show();
       this.WindowState = FormWindowState.Normal;
       this.ShowInTaskbar = true;
       notIcon.Visible = false;
   }

   protected void First_Click(Object sender, System.EventArgs e)
   {
       MessageBox.Show("First");
   }

   protected void Second_Click(Object sender, System.EventArgs e)
   {
       MessageBox.Show("Second");
   }

   protected void Third_Click(Object sender, System.EventArgs e)
   {
       MessageBox.Show("Third");
   }

  • In questo esempio è stato aggiunto un menu contestuale con tre voci, che – se cliccate – fanno apparire un semplice messaggio.
  • Si noti la possibilità di configurare i messaggi che appaiono al momento della riduzione ad icona (titolo, testo, durata e visibilità nel Task Manager) e al passaggio del mouse sull’icona (testo).

L'algoritmo della Pasqua
  • Con il seguente algoritmo si calcola il giorno e il mese della Pasqua, dato l'anno.
  • L'anno è letto dalla TextBox 'txtYear'; il risultato è nella variabile 'easter'.

   // In TextBox txtYear, insert the Year.
   int year = Convert.ToInt32(txtYear.Text);
   int a = year % 19;
   int b = year / 100;
   int c = year % 100;
   int d = b / 4;
   int e = b % 4;
   int f = (b + 8) / 25;
   int g = (b - f + 1) / 3;
   int h = (19 * a + b - d - g + 15) % 30;
   int i = c / 4;
   int j = c % 4;
   int k = (32 + 2 * e + 2 * i - h - j) % 7;
   int l = (a + 11 * h + 22 * k) / 451;
   int month = (h + k - 7 * l + 114) / 31;
   int day = ((h + k - 7 * l + 114) % 31) + 1;
   DateTime easter = new DateTime(year, month, day);   // This is the easter.




© 2022 Carlo Vecchio
Torna ai contenuti