Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con il controllo for each

Ciao a tutti,
ho un problema con un ciclo for each.
Ho costruito un frame con 10x10 textbox, che devono essere spostati in un
array bidimensionale alla pressione di un apposito pulsante. La matrice puň
anche non essere 10x10, ma anche 5x5, 7x7 e cosě via... l'ordine č compreso
tra 1 e 10 e la matrice deve necessariamente essere quadrata.
L'ordine della matrice č noto a priori. I nomi dei textbox vanno sono Val1,
Val2 ... Val100. Avevo pensato di fare un ciclo tipo:
For Each ctlControl In Me.Controls
 If (TypeOf ctlControl Is TextBox) And (ctlControl.Enabled = True) Then
    arrayMatrice(j, i) = ctlControl.Text
    If j < ordineUsato Then
        j = j + 1
    Else
        i = i + 1
        j = 0
    End If
 End If
Next
Che non č proprio ottimizzato bene, ok... cmq il problema principale risiede
ne fatto che il for each... non scorre i controlli in ordine (ad esempio da
Val1 a Val100), ma segue un percorso che reputo pressochč casuale (non
c'entra nemmeno il tabindex)...
Qualcuno ha qualche suggerimento interessante?
Grazie e ciao
Alessandro


For each segue l'ordine con cui i controlli sono stati aggiunti alla form.
Per fare quello che ti interessa forse sarebbe meglio utilizzare una matrice
di controlli (anziché Val1 Val(1)) il che può avere vantaggi e svantaggi.
Un'altra soluzione è quella di usare come tag della textbox un indice oppure
ricavare dal nome del controllo l'indice. Se vuoi un ciclo che fa il tuo
lavoro senza cambiare il progetto potrebbe essere del tipo
dim objTxt as TextBox
For k=1 to 100
    set objtxt=me.controls("Val" & k)
    'e poi fai il resto con objtxt
next
Ok?
Ciao, Rick.

"Alessandro "oVeRRiDe"" <oVeRRiDe@i.i> wrote in message
news:MDn66.772$eB2....@news.infostrada.it...

Usa invece un array di TextBox. Diventa tutto moooolto piu' facile.
Dim riga As Long                      ' contatore delle righe della matrice
Dim colonna As Long                ' contatore delle colonne della matrice
Dim ordine As Long                  ' ordine della matrice
Dim arrayMatrice() As String    '  the matrix !
Dim index As Long                    ' indice delle textbox
' assumiamo che le textbox si chiamino txtVal
ordine = 10                    ' ordine della matrice, percio' le textbox
sono 100
conta = 0
For riga = 0 To (ordine - 1)
        For colonna = 0 To (ordine - 1)
                '// peccato che txtVal(conta++)   non sia permesso !
                arrayMatrice(riga, colonna) = txtVal(index).Text
                index = index + 1
        Next colonna
Next riga
Non l' ho provato, ma dovrebbe funzionare.
Ciao
Aldo

Che non č proprio ottimizzato bene, ok... cmq il problema principale risiede
Scusa, non so dare una risposta precisa al motivo per cui si muove
"casualmente" tra i controlli, pero' non capisco perche' fare un
for..each su tutti i controlli: se sai a priori l'ordine della
matrice, tanto vale che cicli solo su quelle textbox che sono
all'interno della matrice quadrata di ordine noto.
Se non lo sai, cicla su tutte le matrici e buonanotte al secchio: fai
un
for ContatoreX=1 to 10
   for ContatoreY=1 to 10
      if textbox(ContatoreX, ContatoreY).enabled=true...
      endif
   next
next
Saluti che forse non ho capito.
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro RomagnoloŽ, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-IV --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD

> Alessandro "oVeRRiDe":

Non perche' sia una soluzione che sponsorizzo ;-) ma per darti, spero, uno
spunto in piu`. Valido anche nel caso, auspicabile, che tu opti per l'array
di controlli.
Option Explicit
Private a(0 To 2, 0 To 2)
Private Sub Command1_Click( _
)
  Dim i As Integer
  Dim j As Integer
  Dim k As Integer
  k = UBound(a, 1) - LBound(a, 1) + 1
  For i = LBound(a, 1) To UBound(a, 1)
    For j = LBound(a, 2) To UBound(a, 2)
      a(i, j) _
        = Controls("Val" & Format$(i * k + j, "0")) _
            .Text
    Next
  Next
  For i = LBound(a, 1) To UBound(a, 1)
    For j = LBound(a, 2) To UBound(a, 2)
      Debug.Print a(i, j)
    Next
  Next
End Sub
Private Sub Form_Load( _
)
  Dim i As Integer
  For i = 0 To 8
    Controls("Val" & Format$(i, "0")).Text = i
  Next
End Sub
Ovviamente adattando il tutto al tuo caso.
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 Alessandro
Secondo me non ti conviene usare 100 TextBox con 100 nomi diversi, ma 100
Textbox con lo stesso nome e usare la proprietà Index (da 1 a 100).
In questa maniera puoi anche avere un solo textbox sulla tua form
e creare istanze di textbox a tuo piacimento con il comando Load
Ciao
Sir Jo