|
|
Ci scrive un assiduo lettore di strada del drosso con un problema irrisolvibile:
ho recentemente conosciuto una ragazza che fa la scrittrice e siccome di mestiere faccio l’informatico mi ha chiesto dietro compensi di pagamenti free di creargli un applicazione personalizzata che le consenta di scrivere, ora è da parecchio che non “consumo”, come devo fare per accontentarla e di conseguenza per appagare i miei più irrefrenabili istinti animali?
RISPONDE LA REDAZIONE: no problema, tu potere continuare a esercitare legge di jungla con questa potentissima applicazione:

ecco il codice e buon allenamento!
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Process.Start(”notepad”)
End Sub
End Class

Si vuole costruire una applicazione windows form che vada a pescare una serie di foto a scelta dell’ utente da visionare. Ecco l’effetto finale che si vuole ottenere:

come fare? Si applica una picture box e una combo box sul form

dopodichè bisogna settare la proprietà ITEM del combo per assegnare i valori delle stringhe-nomefoto:

dopodichè bisognerà inserire il seguente codice sul combo sul metodo di selezione dinamica:
Public Class Form1
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Dim valore As String
valore = “C:\prova\” & ComboBox1.SelectedItem
PictureBox1.Image = Image.FromFile(valore)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
Esercizio: fare in modo che la selezione delle foto avvenga direttamente dall’ interno dell’ applicazione senza puntare a un file system esterno
SVOLGIMENTO?

Module Module1
Sub Main()
Dim i As Integer = 0
Do While i < 12
i += 1
Console.WriteLine(”Riga: ” & i)
Loop
Console.ReadLine()
End Sub
End Module

Module Module1
Sub Main()
Dim i As Integer = 1
While i <= 12
Console.WriteLine(i)
i += 1
End While
Console.ReadLine()
End Sub
End Module
Contrariamente alla solita prassi dove il pensatoio in zona WC risolve, questa volta l’illuminazione mi è arrivata lavando una pila di piatti fermi nel lavabo da una settimana, mi sono detto tra una bestemmia e l’altra in serboaramaico ma perchè non passi la variabile random come argomento dell’ array? Le parentesi quadre serviranno pure a qualcosa no?

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class tentalafortuna : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Per generare un numero random in ASP.NET (c#) dobbiamo istanziare un istanza dell’oggetto RANDOM //(System.Random):
//Random RandomClass = new Random();
//A questo punto possiamo scegliere se creare un numero casuale tra 0 e 2.147.483.647:
//int RandomNumber = RandomClass.Next();
//oppure se dare dei parametri per la generazione di un numero da … a…:
//int RandomNumber = RandomClass.Next(4, 14);
//Se invece vogliamo solamente stabilire il massimo numero generabile possiamo usare:
//int RandomNumber = RandomClass.Next(14);
//La stessa cosa vale per la generazione di un numero float, cambiando però il metodo che chiamiamo:
//double RandomNumber = RandomClass.NextDouble();
}
protected void Button1_Click(object sender, EventArgs e)
{
//creo un arrayString con tutte le 22 squadre che partecipano alla serie B
string[] squadreSerieB = { “Atalanta”, “Torino”, “Varese”, “Sassuolo”, “Triestina”, “Portogruaro”, “Empoli”, “Modena”, “Novara”, “Padova”, “Albinoleffe”, “Pescara”, “Siena”, “Crotone”, “Frosinone”,”Reggina”,”Grosseto”, “Piacenza”, “Cittadella”, “Livorno”, “Vicenza” };
//istanzio un oggetto pippo per la generazione di un numero casuale
Random pippo = new Random();
//le squadre di serie B sono 22, determino un range di estrazione
int numCasuale = pippo.Next(1,23);
//stampo a video il risultato convertendo l’int in stringa
Label1.Text = Convert.ToString (numCasuale);
}
protected void Button2_Click(object sender, EventArgs e)
{
//creo un arrayString con tutte le 22 squadre che partecipano alla serie B
string[] squadreSerieB = { “Atalanta”, “Torino”, “Varese”, “Sassuolo”, “Triestina”, “Portogruaro”, “Empoli”, “Modena”, “Novara”, “Padova”, “Albinoleffe”, “Pescara”, “Siena”, “Crotone”, “Frosinone”, “Reggina”, “Grosseto”, “Piacenza”, “Cittadella”, “Livorno”, “Vicenza” };
//istanzio un oggetto pippo per la generazione di un numero casuale
Random pippo = new Random();
//le squadre di serie B sono 22, determino un range di estrazione
int numCasuale = pippo.Next(1, 23);
this.Literal1.Text = “”;
Response.Write(”<table border=’2′; style=’border-color:red’>”);
for (int i = 0; i <= 0; i++)
{
this.Literal1.Text += “<tr><td>”;
this.Literal1.Text += “<br>”;
this.Literal1.Text += “<center>” + squadreSerieB[numCasuale];
this.Literal1.Text += “</td></tr>”;
}
Response.Write(”</table>”);
}
}
in realtà in zona debugging c’è ancora qualche piccola anomalia dovuta alla posizione zero del primo elemento e al fatto che dopo una serie di generazioni prolungate (circa 5) il tutto va in crash, però il novanta per cento è fatto, se uno vuole vincere arriva sul bottone, clicca per sapere dove deve investire affidandosi al caso al culo alla fortuna e voilà il gioco è fatto!
http://www.atonformazione.net/tentalafortuna.aspx
Un evento sportivo si può pevedere con perizia analitica con studi sistematici a 360 gradi del tipo ma la partita in che condizioni climatiche si gioca? Quali attaccanti mancano? Quali sono le quote dei bookmakers? Che posizioni di classifica occupano le due squadre? Da quanto tempo non perdono o non vincono o non pareggiano le due squadre? Insomma la statistica ci può dare una mano o azzeccare la previsione è solo una questione di culo? Io tendo ad abbracciare di più la seconda categoria sono uno di quelli che pensano che Dio potrebbe anche giocare a dadi con l’universo. Partendo da questa prospettiva quello che serve è solo il culo o la fortuna che tradotto in C# sta per generazione di numeri casuali. In questa prima versione ho ancora il problema di associare l’array delle 22 squadre della B che sono delle mine vaganti (vedi l’impossibile 4-0 inflitto dal Sassuolo al Livorno fuori casa nella prima di campionato) all’ oggetto random, ma ci sto lavorando, prima o poi qualche idea mi verrà, magari nel mio pensatoio filosofico in zona WC, la prima intuizione è stata quella di chiamare l’oggetto random con la variabile I di inizializzazione ciclo for che però per convenzione deve essere uguale a zero nella prima delle tre espressioni mentre qui arriva già con un valore:
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class tentalafortuna : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Per generare un numero random in ASP.NET (c#) dobbiamo istanziare un istanza dell’oggetto RANDOM //(System.Random):
//Random RandomClass = new Random();
//A questo punto possiamo scegliere se creare un numero casuale tra 0 e 2.147.483.647:
//int RandomNumber = RandomClass.Next();
//oppure se dare dei parametri per la generazione di un numero da … a…:
//int RandomNumber = RandomClass.Next(4, 14);
//Se invece vogliamo solamente stabilire il massimo numero generabile possiamo usare:
//int RandomNumber = RandomClass.Next(14);
//La stessa cosa vale per la generazione di un numero float, cambiando però il metodo che chiamiamo:
//double RandomNumber = RandomClass.NextDouble();
}
protected void Button1_Click(object sender, EventArgs e)
{
//creo un arrayString con tutte le 22 squadre che partecipano alla serie B
string[] squadreSerieB = { “Atalanta”, “Torino”, “Varese”, “Sassuolo”, “Triestina”, “Portogruaro”, “Empoli”, “Modena”, “Novara”, “Padova”, “Albinoleffe”, “Pescara”, “Siena”, “Crotone”, “Frosinone”,”Reggina”,”Grosseto”, “Piacenza”, “Cittadella”, “Livorno”, “Vicenza” };
//istanzio un oggetto pippo per la generazione di un numero casuale
Random pippo = new Random();
//le squadre di serie B sono 22, determino un range di estrazione
int numCasuale = pippo.Next(1,23);
//stampo a video il risultato convertendo l’int in stringa
Label1.Text = Convert.ToString (numCasuale);
}
}

un veicolo è una tipologia generica che non specifica il mezzo di trasporto. E’ un autocarro oppure un automobile?
Abbiamo quindi la ns superclasse veicolo dove l’attributo inMovimento viene impostato a True quando si muove, veicolo.vb
Public Class Veicolo
Private inMovimento As Boolean = False
Public Sub New()
inMovimento = True
End Sub
Public Function siMuove() As Boolean
Return inMovimento
End Function
End Class
e se ho una automobile e voglio sapere se è ferma oppure in movimento? Da una classe derivata è possibile richiamare il costruttore della classe da cui deriva. E’ possibile farlo con l’istruzione MyBase.New() ereditando (Inherits) dalla classe Veicolo tutti i metodi e gli attributi definiti da questa ultima, creo automobile.vb:
Public Class Automobile
Inherits Veicolo
Public Sub New()
MyBase.New()
End Sub
End Class
il modulo si comporta esattamente come se fosse collegato alla matrice base del settore terziaro sette di nove (uscendo dalla metafora di star trek voyager significa che abbiamo attinto ai metodi primigeni per settare il comportamento su un caso specifico vicino alla realtà, quella della ns automobile). Come risultato vedremo che la ns automobile si muove, per modificare il valore dobbiamo andare nel costruttore e switchare da True a False la proprietà inMovimento

Supponendo che nella classe Automobile siano stati definiti altri attributi come Targa, Colore e Cilindrata è possibile definire ulteriori costruttori da utilizzare in alternativa. Flessibilità e parametrizzazione. Comportamenti diversi a seconda dei contesti dove sono utilizzati. Le firme dei vari costruttori devono essere diverse, in fase di esecuzione verrà eseguito solo il costruttore identificato da una certa firma. Ecco la stessa classe Automobile.vb arricchità con vari costruttori
Public Class Automobile
Inherits Veicolo
Private m_targa As String
Private m_colore As String
Private m_cilindrata As Integer
Public Sub New()
MyBase.New()
End Sub
Public Sub New(ByVal targa As String)
m_targa = targa
End Sub
Public Sub New(ByVal targa As String, ByVal colore As String)
m_targa = targa
m_colore = colore
End Sub
Public Sub New(ByVal targa As String, ByVal cilindrata As Integer, ByVal colore As String)
m_targa = targa
m_cilindrata = CType(cilindrata, Integer)
m_colore = colore
End Sub
End Class

il form: alla pressione del pulsante verifica se la label contiene uno zero oppure un altro valore, poi crea l’oggetto con il corretto parametro per il costruttore. Il valore della Label dipende dal valore della TextBox per effetto del codice inserito nel metodo TextChanged. Inizia un ciclo che verrà ripetuto 100 volte, dove al suo interno prima viene valorizzato il conteggio aggiornato nella Label e poi viene incrementato il contatore. Da notare che System.Threading.Thread.Sleep(100) permette di fermare momentaneamente l’esecuzione del programma per un numero di millesecondi pari al numero inserito tra parentesi (1 decimo di secondo nel caso specifico) mentre My.Application.DoEvents()dà il controllo al processore consentendo così di aggiornare il Form, ci fa vedere in sostanza i valori intermedi da zero a cento
Public Class Form1
Private counter As Contatore
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If CType(Me.Label1.Text, Integer) = 0 Then
‘da notare l’ingresso della parola chiave NEW che indica il costruttore della classe che può anche essere omesso dove non strettamente necessario
counter = New Contatore
Else
counter = New Contatore(CType(Me.Label1.Text, Integer))
End If
Do While counter.Leggi <= 100
Me.Label1.Text = CType(counter.Leggi, String)
counter.Incrementa()
System.Threading.Thread.Sleep(100)
My.Application.DoEvents()
Loop
End Sub
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Me.Label1.Text = Me.TextBox1.Text
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
la classe contatore.vb
Public Class Contatore
Private numero As Integer = 0
Public Sub New(Optional ByVal valoreIniziale As Integer = 0)
‘il parametro valore iniziale è opzionale e permette di definire da quale numero deve iniziare il conteggio, se omesso il conteggio inizierà da 0 per default
numero = valoreIniziale
End Sub
Public Function Leggi() As Integer
Return numero
End Function
Public Sub Incrementa()
numero += 1
End Sub
End Class

Gli elementi principali della definizione di una classe sono i seguenti:
public è un modificatore di accesso della classe e serve a definire l’ambito di visibilità della classe stessa. Class e End class rappresentano l’inizio e la fine di una classe, su nome classe non ci dovrebbero essere malintesi
Vediamo in azione queste briciole di fantascienza progettando un satellite che deve partire su Marte, pardon, un contatore per tacchini che opportunamente inizializzato, ci fornisce a ogni richiesta il numero intero successivo. Quindi si dovrà definire una variabile privata di tipo Integer per ricordare al contatore dove è arrivato, inizializzare la variabile privata al momento della creazione dell’ oggetto e creare un METODO per LEGGERE il VALORE del contatore.
la classe Contatore.vb sarà:
Public Class Contatore
‘inizializzo una variabile privata di nome contatore con un valore nullo così parte sempre dall’ inizio
Private numero As Integer = 0
Public Function Leggi() As Integer
‘la variabile numero è stata dichiarata privata ma io qui sono dentro una funzione PUBLIC
‘chiamata al metodo incrementa
Incrementa()
‘il numero incrementato sarà restituito al chiamante
Return numero
End Function
Public Sub Incrementa()
numero += 1
End Sub
End Class
che fa riferimento a un modulo esecutivo:
Module Module1
Sub Main()
Dim i As Integer = 0
‘ creo una nuova variabile di nome counter con il tipo di dato Contatore che corrisponde al nome classe
Dim counter As New Contatore
‘do..while come ciclo termina la visualizzazione dopo il 100, leggo il valore e lo incremento
Do While i < 100
i = counter.Leggi
Console.WriteLine(i)
Loop
Console.ReadLine()
End Sub
End Module
A video vedremo scorrere sull’ oggetto Console una serie di numeri da 0 a 100
adesso miglioriamo l’accrocchio perchè qui la classe fa riferimento a un metodo interno incrementa che si può ulteriormente scomporre richiamandolo direttamente dal modulo, il codice semplificato quindi diventa con la classe Contatore.vb revisionata:
Public Class Contatore
Private numero As Integer = 0
Public Function Leggi() As Integer
Return numero
End Function
Public Sub Incrementa()
numero += 1
End Sub
End Class
e con il modulo che migliora in leggibilità e ordine:
Module Module1
Sub Main()
Dim counter As New Contatore
Do While counter.Leggi < 100
counter.Incrementa()
Console.WriteLine(counter.Leggi)
Loop
Console.ReadLine()
End Sub
End Module

In questo codice che ha meritato l’attenzione della Nasa, il titolare della Aton Consulting sas attingendo al libro magico di VB iniettato a mia nonna, ha creato in maniera primitiva una funzione e poi l’ha collegata all’ evento Handles Button1.Click con una finestra di dialogo (il famoso MessageBox). La funzione applica i contenuti del post precedente dove viene mostrato il potenziale della funzione MOD. In pratica scrivendo un numero nella texbox voglio sapere se ho digitato pari (even) o dispari (odd). Poi cercheremo di migliorare questo portentoso applicativo da 10000 euro al mese lo con un metodo statico namespace che attinge a una libreria denominata System.Runtime.CompilerServices per mettere in piedi un codice più pulito con il concetto di EXTENSION METHOD.
Public Class Form1
Dim numero As Integer
Public Function ammovedi (ByVal numero As Integer) As String
Select Case (numero Mod 2)
Case 0
Return “Pari”
Case Else
Return “Dispari”
End Select
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show(ammovedi)
End Sub
End Class
ed ecco il secondo metodo più pulito ed efficace, in pratica <EXTENSION()> richiama una funzione statica che estende il tipo INTEGER con una caratteristica che di default non ha: ossia la possibilità di determinare se un numero è pari o dispari.
extensionmethod.vb
Imports System.Runtime.CompilerServices
Module IntegerExtensions
<Extension()> Public Function PariDispari(ByVal numero As Integer) As String
Select Case (numero Mod 2)
Case 0
Return “Pari”
Case Else
Return “Dispari”
End Select
End Function
End Module
e il form conterrà il richiamo alla funzione PariDispari
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim numero As Integer = CType(TextBox1.Text, Integer)
MessageBox.Show(numero.PariDispari)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
End Sub
End Class
|
|