Newsgroup: it.comp.lang.visual-basic
Titolo: Aiuto ad un principiante...

Brevemente: sapevo programmare benino anni fa senza Oggetti e Visual (adesso
insegno filosofia e storia) e mi č tornata passione per Programmazione
Ho fatto questa calcolatrice in VB6 ma credo d aver tradotto il VB nel
vecchio modo di Programmare
La sensazione č giusta?
c'erano procedure  + brevi?
grazie claudio
Dim v(1 To 2) As Double
Dim Generale, Controllo, Blocco As Boolean
Dim Uno, Due, Tre, Quattro, Cinque, Sei, Sette, Otto, Nove, Zero As Boolean
Dim Addizione, Sottrazione, Moltiplicazione, Divisione As Boolean
Private Sub Command0_Click()
Blocco = False
If Controllo = True Then
   If Zero = False Then
   Text1.Text = " "
   Else
   Text1.Text = " "
   Controllo = False
   End If
End If
If Generale = False Then
   Text1.Text = Text1.Text & 0
   Else
   If Zero = False Then
      Text1.Text = 0
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 0
   End If
End If
End Sub
Private Sub Command1_Click(Index As Integer)
Blocco = False
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & 1
   Else
   If Uno = False Then
      Text1.Text = 1
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 1
   End If
End If
End Sub
Private Sub Command2_Click(Index As Integer)
Blocco = False
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & 2
   Else
   If Due = False Then
      Text1.Text = 2
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 2
   End If
End If
End Sub
Private Sub Command3_Click(Index As Integer)
Blocco = False
If Generale = False Then
   Text1.Text = Text1.Text & 3
   Else
   If Tre = False Then
      Text1.Text = 3
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 3
   End If
End If
End Sub
Private Sub Command4_Click(Index As Integer)
Blocco = False
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & 4
   Else
   If Quattro = False Then
      Text1.Text = 4
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 4
   End If
End If
End Sub
Private Sub Command5_Click(Index As Integer)
Blocco = False
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & 5
   Else
   If Cinque = False Then
      Text1.Text = 5
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 5
   End If
End If
End Sub
Private Sub Command6_Click(Index As Integer)
Blocco = False
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & 6
   Else
   If Sei = False Then
      Text1.Text = 6
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 6
   End If
End If
End Sub
Private Sub Command7_Click(Index As Integer)
Blocco = False
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & 7
   Else
   If Sette = False Then
      Text1.Text = 7
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 7
   End If
End If
End Sub
Private Sub Command8_Click(Index As Integer)
Blocco = False
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & 8
   Else
   If Otto = False Then
      Text1.Text = 8
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 8
   End If
End If
End Sub
Private Sub Command9_Click(Index As Integer)
Blocco = False
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & 9
   Else
   If Nove = False Then
      Text1.Text = 9
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & 9
   End If
End If
End Sub
Private Sub CommandAddizzione_Click(Index As Integer)
If Addizione = True Then
   Text1.Text = v(1) + CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
   Else
   If Sottrazione = True Then
      Text1.Text = v(1) - CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Sottrazione = False
   End If
   If Moltiplicazione = True Then
      Text1.Text = v(1) * CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Moltiplicazione = False
   End If
   If Divisione = True Then
   Text1.Text = v(1) / CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
   Divisione = False
   End If
End If
If Blocco = True Then
   Generale = True
   Addizione = True
   Controllo = False
   Zero = False
   Uno = False
   Due = False
   Tre = False
   Quattro = False
   Cinque = False
   Sei = False
   Sette = False
   Otto = False
   Nove = False
   Exit Sub
End If
v(1) = CDbl(Text1.Text)
Addizione = True
Generale = True
Zero = False
Uno = False
Due = False
Tre = False
Quattro = False
Cinque = False
Sei = False
Sette = False
Otto = False
Nove = False
End Sub
Private Sub CommandCancella_Click()
Text1.Text = " "
Generale = False
Controllo = False
Blocco = False
Addizione = False
Sottrazione = False
Moltiplicazione = False
Divisione = False
Zero = False
Uno = False
Due = False
Tre = False
Quattro = False
Cinque = False
Sei = False
Sette = False
Otto = False
Nove = False
End Sub
Private Sub CommandDivisione_Click()
If Divisione = True Then
   Text1.Text = v(1) / CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
   Else
   If Addizione = True Then
      Text1.Text = v(1) + CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Addizione = False
   End If
   If Sottrazione = True Then
      Text1.Text = v(1) - CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Sottrazione = False
   End If
   If Moltiplicazione = True Then
      Text1.Text = v(1) * CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Moltiplicazione = False
   End If
End If
If Blocco = True Then
   Divisione = True
   Generale = True
   Controllo = False
   Zero = False
   Uno = False
   Due = False
   Tre = False
   Quattro = False
   Cinque = False
   Sei = False
   Sette = False
   Otto = False
   Nove = False
   Exit Sub
End If
v(1) = CDbl(Text1.Text)
Divisione = True
Generale = True
Zero = False
Uno = False
Due = False
Tre = False
Quattro = False
Cinque = False
Sei = False
Sette = False
Otto = False
Nove = False
End Sub
Private Sub CommandMoltiplicazione_Click()
If Moltiplicazione = True Then
   Text1.Text = v(1) * CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
   Else
   If Addizione = True Then
      Text1.Text = v(1) + CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Addizione = False
   End If
   If Sottrazione = True Then
      Text1.Text = v(1) - CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Sottrazione = False
   End If
   If Divisione = True Then
      Text1.Text = v(1) / CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Divisione = False
   End If
End If
If Blocco = True Then
   Moltiplicazione = True
   Generale = True
   Controllo = False
   Zero = False
   Uno = False
   Due = False
   Tre = False
   Quattro = False
   Cinque = False
   Sei = False
   Sette = False
   Otto = False
   Nove = False
   Exit Sub
End If
v(1) = CDbl(Text1.Text)
Moltiplicazione = True
Generale = True
Zero = False
Uno = False
Due = False
Tre = False
Quattro = False
Cinque = False
Sei = False
Sette = False
Otto = False
Nove = False
End Sub
Private Sub CommandSottrazione_Click()
If Sottrazione = True Then
   Text1.Text = v(1) - CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
   Else
   If Addizione = True Then
      Text1.Text = v(1) + CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Addizione = False
   End If
   If Moltiplicazione = True Then
      Text1.Text = v(1) * CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Moltiplicazione = False
   End If
   If Divisione = True Then
      Text1.Text = v(1) / CDbl(Text1.Text)
      v(1) = CDbl(Text1.Text)
      Divisione = False
   End If
End If
If Blocco = True Then
   Sottrazione = True
   Generale = True
   Controllo = False
   Zero = False
   Uno = False
   Due = False
   Tre = False
   Quattro = False
   Cinque = False
   Sei = False
   Sette = False
   Otto = False
   Nove = False
   Exit Sub
End If
v(1) = CDbl(Text1.Text)
Sottrazione = True
Generale = True
Zero = False
Uno = False
Due = False
Tre = False
Quattro = False
Cinque = False
Sei = False
Sette = False
Otto = False
Nove = False
End Sub
Private Sub CommandUguale_Click()
If Addizione = True Then
   Text1.Text = v(1) + CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
End If
If Sottrazione = True Then
   Text1.Text = v(1) - CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
End If
If Moltiplicazione = True Then
   Text1.Text = v(1) * CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
End If
If Divisione = True Then
   Text1.Text = v(1) / CDbl(Text1.Text)
   v(1) = CDbl(Text1.Text)
End If
Blocco = True
Controllo = True
Addizione = False
Sottrazione = False
Moltiplicazione = False
Divisione = False
Generale = False
Zero = False
Uno = False
Due = False
Tre = False
Quattro = False
Cinque = False
Sei = False
Sette = False
Otto = False
Nove = False
End Sub
Private Sub CommandVirgola_Click()
Blocco = False
If CStr(Text1.Text) = "0," Then
   Exit Sub
End If
If Controllo = True Then
   Text1.Text = " "
   Controllo = False
End If
If Generale = False Then
   Text1.Text = Text1.Text & "0,"
   Else
   If Nove = False Then
      Text1.Text = "0,"
      Zero = True
      Uno = True
      Due = True
      Tre = True
      Quattro = True
      Cinque = True
      Sei = True
      Sette = True
      Otto = True
      Nove = True
      Else
      Text1.Text = Text1.Text & ","
   End If
End If
End Sub
Private Sub Uscita_Click()
End
End Sub

    Text1.Text = Text1.Text & 0
    Meglio non comandare mai a Visual Basic di fare qualcosa "come pare
a lui" ma chiedergli sempre di farla come desideriamo noi, esplicitando
le nostre intenzioni:
        Text1.Text = Text1.Text & "0"
        -oppure-
        Text1.Text = Text1.Text & CStr(0)
[...]
    Per ora puo' bastare.
--
Ciao :o)
Maurizio
--------
?SPQR(C)
 X
--------

 c'erano procedure  + brevi?
Senza offesa ma ... penso proprio di si. :-)
Non ho ben capito tutte quelle serie di "uno, due, tre " impostati a true.
Se serve per disabilitare i pulsanti numerici era piu' rapido inserire tutti
i pulsanti numerici in un frame e poi disabilitare o abilitare solo il
frame. (Frame_TastiNumerici.Enabled = True / False)
Prendi con le molle questi giudizi, non ti offendere. :-)
Non e' troppo agevole comprendere un sorgente cosi' lungo e non commentato.
Sono giudizi fatti un po' a intuito.
Di solito quando vedo in un sorgente molte istruzioni estramemente simili
ripetute mi viene da pensare che ci sia un modo per sintetizzarlo parecchio
usando vettori o funzioni, ma potrei anche sbagliarmi.
Che tipo di funzionalita' ha questa calcolatrice?
Gestisce anche diversi livelli di parentesi o lavora in notazione polacca
inversa?
ciao
Paolo

 intenzione di far fare a "Command0"...
    Vuoi vedere che...
    Vuoi vedere che quel pulsante e' proprio il tasto zero della tua
calcolatrice? Allora ritiro (quasi) tutto ma tu, a questo punto, devi
spiegare perche' scrivi:
        Private Sub Command0_Click()
e
        Private Sub Command1_Click(Index As Integer)
cioe' uno un pulsante "semplice", l'altro (anzi, tutti gli altri, mi
pare) matrici di controlli pulsante. Una svista?


 c'erano procedure  + brevi?
Sě, vedi anche le obiezioni degli altri.
Se mi posso permettere (scusandomi per la lunghezza), giusto un esempio come
strumento di studio e, ovviamente, di critica e libero adattamento:
'   Creare sul form:
'       10  bottoni con nome "cifra", con Index da 0 a 9 e con caption da
"0" a "9"
'       1   bottone con nome "CommandVirgola" e caption qualsiasi (verra'
adeguata)
'       5   bottoni con nome "CommandOperazione", con Index da 0 a 4 e con
caption "+", "-", "*", "/", "Sgn"
'       1   bottone con nome "CommandUguale" e caption "="
'       1   bottone con nome "CommandCancella" e caption "C"
'       1   bottone con nome "Uscita" e caption "&Uscita"
'       1   TextBox con nome "txt_carta", Multiline, allineamento a destra,
Font a passo fisso e scrollbar verticale
'       1   TextBox con nome "txt_display", Multiline, allineamento a
destra, Font a piacere
'Incollare il codice che segue:
Option Explicit
Dim risultato As Double             'Risultato progressivo o finale
Dim cifra_corrente As Double
Dim operazione_corrente As Integer  '-1=Nessuna, 0=+, 1=-, 2=*, 3=/
Dim azzerare_cifra As Boolean
Dim sep_int_dec As String
Private Sub cifra_Click(Index As Integer)
    If azzerare_cifra = True Then
        txt_display.Text = ""
        azzerare_cifra = False
    End If
    txt_display.Text = txt_display.Text & CStr(Index)
    Call ab_dis_operazioni(True)
End Sub
Private Sub CommandOperazione_Click(Index As Integer)
    If Index = 4 Then 'Sgn
        cifra_corrente = CDbl(txt_display.Text)
        If cifra_corrente Then
            If cifra_corrente >= 0 Then
                txt_display.Text = "-" & txt_display.Text
            Else
                txt_display.Text = Mid(txt_display.Text, 2)
            End If
        Else
            Beep
        End If
    Else
        If calcola_risultato_corrente = True Then
            operazione_corrente = Index
            CommandUguale.Enabled = True
            CommandCancella.Enabled = True
            txt_carta.Text = txt_carta.Text & cifra_corrente & " " &
Choose(operazione_corrente + 1, "+", "-", "*", "/") & " " & vbCrLf
            txt_carta.SelStart = Len(txt_carta.Text)
            txt_carta.Text = txt_carta.Text & risultato & "  =" & vbCrLf
            txt_carta.SelStart = Len(txt_carta.Text)
        End If
    End If
    txt_display.SetFocus
End Sub
Private Sub CommandCancella_Click()
    txt_display.Text = ""
    risultato = 0
    operazione_corrente = -1
    azzerare_cifra = True
    CommandUguale.Enabled = False
    CommandCancella.Enabled = False
    Call ab_dis_operazioni(False)
    txt_carta.Text = txt_carta.Text & "Clear" & vbCrLf
    txt_carta.SelStart = Len(txt_carta.Text)
    If txt_display.Visible Then txt_display.SetFocus
End Sub
Private Sub CommandUguale_Click()
    If calcola_risultato_corrente = True Then
        txt_carta.Text = txt_carta.Text & cifra_corrente & "   " & vbCrLf
        txt_carta.SelStart = Len(txt_carta.Text)
        txt_carta.Text = txt_carta.Text & risultato & " =!" & vbCrLf &
vbCrLf
        txt_carta.SelStart = Len(txt_carta.Text)
        operazione_corrente = -1
        risultato = 0
    End If
    If operazione_corrente = -1 Then
        CommandUguale.Enabled = False
        'CommandCancella.Enabled = False
    End If
    txt_display.SetFocus
End Sub
Private Sub CommandVirgola_Click()
    If azzerare_cifra = True Then
        txt_display.Text = "0"
        azzerare_cifra = False
    End If
    If InStr(txt_display.Text, sep_int_dec) Then
        Beep
        Exit Sub
    End If
    txt_display.Text = txt_display.Text & sep_int_dec
    txt_display.SetFocus
End Sub
Private Sub Form_Activate()
    txt_display.SetFocus
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
    Select Case UCase(Chr(KeyAscii))
        Case "0" To "9"
            cifra(KeyAscii - 48) = 1
        Case sep_int_dec
            CommandVirgola = 1
        Case "+", "-", "*", "X", "/", ":", "S"
            If CommandOperazione(0).Enabled Then
                Select Case UCase(Chr(KeyAscii))
                    Case "+"
                        CommandOperazione(0) = 1
                    Case "-"
                        CommandOperazione(1) = 1
                    Case "*", "X"
                        CommandOperazione(2) = 1
                    Case "/", ":"
                        CommandOperazione(3) = 1
                    Case "S"
                        CommandOperazione(4) = 1
                End Select
            Else
                Beep
            End If
        Case "=", vbCr
            If CommandUguale.Enabled Then
                CommandUguale = 1
            Else
                Beep
            End If
        Case "C"
            If CommandCancella.Enabled Then
                CommandCancella = 1
            Else
                Beep
            End If
        Case "U"
            uscita = 1
        Case vbBack
            If txt_display.Text = "" Then
                Beep
            Else
                txt_display.Text = Left(txt_display.Text,
Len(txt_display.Text) - 1)
            End If
        Case Else
            Beep
    End Select
    KeyAscii = 0
End Sub
Private Sub Form_Load()
    Me.KeyPreview = True
    sep_int_dec = Mid(Trim(1.2), 2, 1)  'Ricava separatore interi/decimali
corrente
    CommandVirgola.Caption = sep_int_dec
    CommandCancella = 1
    txt_carta.Text = ""
    'txt_carta.TabStop = False
    txt_carta.Locked = True
End Sub
Private Sub Uscita_Click()
    Unload Me
End Sub
Function calcola_risultato_corrente() As Boolean
    'Dim cifra_corrente As Double
    calcola_risultato_corrente = True   'Tutto OK
    cifra_corrente = CDbl(txt_display.Text)
    Select Case operazione_corrente
        Case -1 'Nessuna
            risultato = cifra_corrente
        Case 0  '+
            risultato = risultato + cifra_corrente
        Case 1  '-
            risultato = risultato - cifra_corrente
        Case 2  '*
            risultato = risultato * cifra_corrente
        Case 3  '/
            If cifra_corrente = 0 Then
                Call MsgBox("Divisore nullo", vbOKOnly + vbExclamation)
                calcola_risultato_corrente = False  'Non OK
            Else
                risultato = risultato / cifra_corrente
            End If
    End Select
    txt_display.Text = risultato
    azzerare_cifra = True
End Function
Sub ab_dis_operazioni(abilita As Boolean)
    Dim comodo As Integer
    For comodo = 0 To 4
        CommandOperazione(comodo).Enabled = abilita
    Next comodo
End Sub

 > La sensazione è giusta?


p.d.n.c. ha scritto:
Il quoting, un po' d'attenzione e cura ...

 ha scritto nel messaggio
news:b3aed0$1it2es$1...@ID-52090.news.dfncis.de...


 Option esplicit cosa mi migliora?
    N.B.: "Option Explicit". (L'hai cercato sulla guida?)
    Migliora l'affidabilita' del codice che scrivi. Esempio:
        Dim Pippo As String
        Pipo = "Ciao, mondo."
        Msgbox Pippo
    Se avessi usato Option Explicit, in fase di compilazione avresti
avuto la segnalazione "Variabile non definita" riguardo "Pipo" e ti
saresti risparmiato un bel mal di testa per cercare di capire come mai
il msgbox invece di salutare il mondo come previsto, restasse mutolo.
(Ovviamente ipotizzando un programma con molto molto piu' di tre
righe...)
[...]
    Riprendo l'appello di Lupo ad una "confezione" dei tuoi post piu'
ordinata ed in linea con gli usi del ng, che puoi leggere, se ancora non
li conosci, andando al Sito comune di questo ng:
 
http://it-lang-vb.net/
    Grazie.
