Visual Basic Simple
Corso Intermedio - Lezione 9
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo

Il progetto fino a questa lezione sviluppato si limita alle interazioni semplici con l'utente: reagire ai click sui pulsanti o alla selezione di un brano dall'elenco sulla sinistra: introdurremo in questa lezione una primaria gestione dei pulsanti ovvero stati e azioni legate ai pulsanti in funzione del contesto. In particolare il pulsante Modifica brano effettuerà una triplice azione:

  1. Abilitarsi alla selezione di un brano e disabilitarsi alla cancellazione del brano scelto;
  2. Attivazione della fase di modifica per permettere il cambiamento dei dati presenti nelle caselle di testo;
  3. Accettazione dei dati immessi e quindi salvataggio degli stessi nell'archivio.

La prima delle azioni è naturalmente la più semplice; vediamo subito come è gestita:

  1. Private blnModifica As Boolean
  2. Private Sub Form_Load()
  3.   ... Codice trattato nelle lezioni precedenti ...
  4.   cmdModificaBrano.Enabled = False
  5.   cmdEliminaBrano.Enabled = False
  6.   blnModifica = False
  7.   ... Codice trattato nelle lezioni precedenti ...
  8. End Sub

Dichiareremo in testa al codice del form una variabile di nome blnModifica che verrà utilizzata successivamente per identificare la fase di modifica, compresa tra il click sul pulsante modifica ed il successivo salvataggio.

All'interno dell'evento Load del Form - senza eliminare il codice precedentemente esposto - aggiungeremo le righe 5-7; la prima disattiverà inizialmente il pulsante cmdModifica, mentre la seconda di queste era stata eliminata nella lezione precedente e disattiverà il pulsante di eliminazione all'avvio del programma, infine la riga 7 inizializzerà il valore della variabile blnModifica.

  1. Private Sub lstBrani_Click()
  2.   If lstBrani.ListIndex >= 0 Then
  3.     ... Codice trattato nelle lezioni precedenti ...
  4.     cmdEliminaBrano.Enabled = True
  5.     cmdModificaBrano.Enabled = True
  6.   End If
  7. End Sub

Così alla selezione di un brano dall'elenco riattiveremo i due pulsanti precedentemente disattivati.

  1. Private Sub cmdEliminaBrano_Click()
  2.   If lstBrani.ListIndex >= 0 Then
  3.     If MsgBox("Sei sicuro di voler eliminare il brano" _
  4.       & vbNewLine & Trim$(udtDiscoCorrente.strTitoloBrano) _
  5.       & "?", vbCritical Or vbYesNo Or vbDefaultButton2, _
  6.       "Elimina brano") = vbYes Then
  7.       udtDiscoCorrente.blnEliminato = True
  8.       Put #intFileDati, udtDiscoCorrente.intIndice, udtDiscoCorrente
  9.       lstBrani.RemoveItem lstBrani.ListIndex
  10.       cmdEliminaBrano.Enabled = False
  11.       cmdModificaBrano.Enabled = False
  12.     End If
  13.   End If
  14. End Sub

L'azione del pulsante cmdEliminaBrano è stata già trattata nella lezione precedente; ad essa aggiungeremo due semplici righe che si occuperanno di disattivare i due pulsanti al termine della cancellazione del brano selezionato. Si occuperà di riattivarli la funzione precedentemente vista legata alla selezione di un brano.

Resta da trattare la fase di modifica che sarà richiamata in occasione del primo click sul pulsante Aggiungi oppure sul pulsante Modifica; nel primo caso saranno anche svuotate tutte le caselle di testo. Vediamo inizialmente il primo di questi due casi: l'operazione di inserimento, aggiornata con le ultime modifiche.

  1. Private Sub cmdAggiungiBrano_Click()
  2.   If blnModifica = False Then
  3.     txtTitoloBrano.Text = ""
  4.     txtAutoreBrano.Text = ""
  5.     txtTitoloCD.Text = ""
  6.     txtNumeroTraccia.Text = ""
  7.     txtAnnoPubblicazione.Text = ""
  8.     txtNote.Text = ""
  9.     cmdAggiungiBrano.Caption = "S&alva brano"
  10.     txtTitoloBrano.SetFocus
  11.   Else
  12.     With udtDiscoCorrente
  13.       .intIndice = LOF(intFileDati) / Len(udtDiscoCorrente) + 1
  14.       .strTitoloBrano = txtTitoloBrano.Text
  15.       .strAutore = txtAutoreBrano.Text
  16.       .strTitoloCD = txtTitoloCD.Text
  17.       .intTraccia = CInt(txtNumeroTraccia.Text)
  18.       .intAnnoPubblicazione = CInt(txtAnnoPubblicazione.Text)
  19.       .strNote = txtNote.Text
  20.       .blnEliminato = False
  21.       Put #intFileDati, .intIndice, udtDiscoCorrente
  22.       lstBrani.AddItem Trim$(.strTitoloBrano)
  23.       lstBrani.ItemData(lstBrani.NewIndex) = .intIndice
  24.     End With
  25.     cmdAggiungiBrano.Caption = "&Aggiungi brano"
  26.   End If
  27.   blnModifica = Not blnModifica
  28.   txtTitoloBrano.Locked = Not blnModifica
  29.   txtAutoreBrano.Locked = Not blnModifica
  30.   txtTitoloCD.Locked = Not blnModifica
  31.   txtNumeroTraccia.Locked = Not blnModifica
  32.   txtAnnoPubblicazione.Locked = Not blnModifica
  33.   txtNote.Locked = Not blnModifica
  34.   cmdEliminaBrano.Enabled = Not blnModifica
  35.   cmdModificaBrano.Enabled = Not blnModifica
  36.   lstBrani.Enabled = Not blnModifica
  37. End Sub

Un primo click sopra il pulsante Aggiungi farà scattare la fase di modifica; basti ricordare che inizialmente la variabile blnModifica ha assunto valore Falso (riga 7) mentre cambia di valore nel momento in cui viene avviata la fase di modifica. Così, all'avvio della fase di modifica tutti i campi saranno svuotati (righe 35-40) e lo stesso pulsante cambierà la sua etichetta in Salva brano.

Nel caso in cui fossimo già nella fase di modifica, il click sul pulsante Aggiungi farà scattare l'operazione di salvataggio vera e propria già trattata nelle lezioni precedenti. In maniera analoga, sarà modificata l'etichetta del pulsante in Aggiunti brano. Le righe 54 e 55 sono state aggiunte al codice preesistente per tenere l'elenco lstBrani sempre aggiornato, senza la necessità di chiudere il programma ei riavviarlo come nelle lezioni precedenti.

Ogni click sul pulsante Aggiungi invertirà il valore della variabile blnModifica (riga 59) ed i controlli si adatteranno di conseguenza: le caselle di testo saranno sbloccate (righe 60-65), mentre i pulsanti Elimina e Modifica e l'elenco con i brani verranno bloccati all'avvio dell'operazione di inserimento. Al termine lo stato di questi controlli verrà invertito, in funzione del cambiamento del valore di blnModifica.

La gestione del pulsante Modifica è molto similare alla precedente:

  1. Private Sub cmdModificaBrano_Click()
  2.   If blnModifica = False Then
  3.     cmdModificaBrano.Caption = "Salva &Modifiche"
  4.     txtTitoloBrano.SetFocus
  5.   Else
  6.     With udtDiscoCorrente
  7.       .strTitoloBrano = txtTitoloBrano.Text
  8.       .strAutore = txtAutoreBrano.Text
  9.       .strTitoloCD = txtTitoloCD.Text
  10.       .intTraccia = Int(Val(txtNumeroTraccia.Text))
  11.       .intAnnoPubblicazione = Int(Val(txtAnnoPubblicazione.Text))
  12.       .strNote = txtNote.Text
  13.       .blnEliminato = False
  14.       Put #intFileDati, .intIndice, udtDiscoCorrente
  15.       lstBrani.List(lstBrani.ListIndex) = Trim$(.strTitoloBrano)
  16.     End With
  17.     cmdModificaBrano.Caption = "&Modifica brano"
  18.   End If
  19.   blnModifica = Not blnModifica
  20.   txtTitoloBrano.Locked = Not blnModifica
  21.   txtAutoreBrano.Locked = Not blnModifica
  22.   txtTitoloCD.Locked = Not blnModifica
  23.   txtNumeroTraccia.Locked = Not blnModifica
  24.   txtAnnoPubblicazione.Locked = Not blnModifica
  25.   txtNote.Locked = Not blnModifica
  26.   cmdEliminaBrano.Enabled = Not blnModifica
  27.   cmdAggiungiBrano.Enabled = Not blnModifica
  28.   lstBrani.Enabled = Not blnModifica
  29. End Sub

All'avvio della fase di modifica (riga 72) i vari controlli con le informazioni saranno già stati aggiornati, durante la selezione del brano dall'elenco; resta quindi solo da cambiare l'etichetta del pulsante in Salva Modifiche. Al termine dell'operazione di modifica i dati delle varie caselle saranno ricopiati nella variabile udtDiscoCorrente (righe 76-83) che, lo ricordiamo, contiene le informazioni recuperate dal file con l'ultima estrazione. La stessa sarà salvata all'interno del file con una semplice istruzione Put, accompagnata dal numero del record da scrivere (riga 84). Sarà anche aggiornato l'elenco sulla sinistra con il nuovo titolo del brano. Il pulsante di modifica riprenderà la sua etichetta iniziale Modifica brano.

Come già visto nell'evento precedente, in funzione della fase in cui ci troviamo (modifica o salvataggio) i controlli saranno bloccati o sbloccati.
Poiché sarà compito dei pulsanti gestire lo stato di blocco delle varie caselle di testo in funzione della fase in cui ci si trova, sarà opportuno inizializzare lo stato di blocco di tutte le caselle di testo impostando la proprietà Locked su False durante la fase di progettazione.

Questa lezione si conclude qui; il codice sin qui presentato è davvero molto semplice e si limita a pochissime interazioni, tutte legate agli eventi click dei controlli. Con le prossime lezioni cercheremo di affrontare argomenti un po' più complessi, iniziando dalla gestione dei dati in input e dalla gestione degli errori.

Fibia FBI
26 Novembre 2003

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'ottava lezione Vai alla decima lezione