Categories

Lanciare notepad da un windows form in VB

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:

notepad

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

notepad1

Selezione delle immagini per windows form

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:

 combopicture

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

combopicture2

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

combopicture1

 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?

vbnet e il ciclo do while loop

dowhileloop

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

vbnet ciclo while

ciclowhile

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

Vinci sicuro versione 1.1

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?

tentalafortuna

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!

Benvenuto in vinci sicuro versione 1.0!

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);
}

}

Ereditare proprietà dalla superclasse Veicolo per la ns Automobile

automezzi

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

simuove

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 costruttore NEW

approfondimentoclassi

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

VBNET un occhiataccia alla classe

classe

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

tacchino pari o tacchino dispari?

paridispari

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