Newsgroup: it.comp.lang.visual-basic
Titolo: Allineamento caselle di testo create a run-time

Oggi è nera! neanche accantonando per un poco questo problema sono riuscito
a risoverlo. Oramai come ci butto su gli occhi mi gira la testa.
Ho un form con tre caselle di testo allineate orizzontalmente ed al cliccare
di un tasto voglio crearne altre tre, sotto, sempre allineate
orizzontalmente, il cui margine superiore tocchi quello inferiore della
casella sopra.
La prima "Riga" di caselle si allinea bene mentre le altre si sfasano
esattamente di un text1.height.
Ho questo codice, sarà una cavolata, una di quelle cose che si hanno sotto
il naso ma non si vedono. ed io non la vedo.
''''''''''''''''''''''''''
Option Explicit
Dim txtD() As VB.TextBox
Dim i As Integer
Private Sub Command1_Click()
i = i + 1
ReDim Preserve txtD(i)
Set txtD(i - 1) = Me.Controls.Add("vb.textbox", "txtA" & i - 1, Me)
If i - 1 = 0 Then
    txtD(i - 1).Move Text1.Left, Text1.Top + Text1.Height, Text1.Width,
Text1.Height
Else
    txtD(i - 1).Move Text1.Left, Text1.Top + txtD(0).Height * (i - 1),
Text1.Width, Text1.Height
End If
txtD(i - 1).Visible = True
i = i + 1
ReDim Preserve txtD(i)
Set txtD(i - 1) = Me.Controls.Add("vb.textbox", "txtB" & i - 1, Me)
If i - 2 = 0 Then
    txtD(i - 1).Move Text2.Left, Text2.Top + Text2.Height, Text2.Width,
Text2.Height
Else
    txtD(i - 1).Move Text2.Left, Text2.Top + txtD(0).Height * (i - 2),
Text2.Width, Text2.Height
End If
txtD(i - 1).Visible = True
i = i + 1
ReDim Preserve txtD(i)
Set txtD(i - 1) = Me.Controls.Add("vb.textbox", "txtC" & i - 1, Me)
If i - 3 = 0 Then
    txtD(i - 1).Move Text3.Left, Text3.Top + Text3.Height, Text3.Width,
Text3.Height
Else
    txtD(i - 1).Move Text3.Left, Text3.Top + txtD(0).Height * (i - 3),
Text3.Width, Text3.Height
End If
txtD(i - 1).Visible = True
End Sub
le caselle ed il command button sono così disposte:
''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''
   text1   |   text2  | text3  |    | command1 |
'''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''
Ciao e grazie, SK
--
La pasienzia non è mai troppo (Totò)
<><><>
Esistono 10 tipi di persone: chi conosce il binario e chi no

 testa.
[SNIP]
Guarda bene il valore di I e il numero di elementi nell'array al termine
della prima aggiunta, dovresti capire subito il problema, che si manifesta
in tutte le istruzioni simili a "Text1.Top + txtD(0).Height * (i - 1)", e
che e' dato dal tipico refuso nel considerare gli indici di un array non
ancora dimensionato.
Dato che in questi casi la parola d'ordine e' sempre *semplificare*, ecco un
punto di partenza per risistemare il tutto, con meno codice e soprattutto
trattando la prima aggiunta, con i=0, allo stesso modo delle successive:
Option Explicit
Dim txtD() As VB.TextBox
Dim i As Integer
Private Sub Form_Load()
'Per trattare uniformemente la prima aggiunta
'(quando l'array non ha dimensione) rispetto alle successive
i = -1
End Sub
Private Sub Command1_Click()
Dim Row As Integer
'aggiungiamo tutto subito
i = i + 3
ReDim Preserve txtD(i)
'determiniamo il nuovo numero di "riga" (una riga = 3 TextBox)
'usiamo '+1' perche' la prima riga esiste gia' in design
Row = (i \ 3) + 1
Set txtD(i - 2) = Me.Controls.Add("vb.textbox", "txtA" & i - 2, Me)
txtD(i - 2).Move Text1.Left, Text1.Top + Text1.Height * Row, Text1.Width,
Text1.Height
Set txtD(i - 1) = Me.Controls.Add("vb.textbox", "txtB" & i - 1, Me)
txtD(i - 1).Move Text2.Left, Text2.Top + Text2.Height * Row, Text2.Width,
Text2.Height
Set txtD(i) = Me.Controls.Add("vb.textbox", "txtC" & i, Me)
txtD(i).Move Text3.Left, Text3.Top + Text3.Height * Row, Text3.Width,
Text3.Height
'questo e' giusto una pignoleria, in modo da visualizzare tutto solo
'quando la riga e' completamente a posto
txtD(i - 2).Visible = True
txtD(i - 1).Visible = True
txtD(i).Visible = True
End Sub
In realta' puo' essere ulteriormente snellito, ad esempio, dato che i 3
textbox sono sempre allienati tra loro, e' sufficiente calcolare il nuovo
Top solo per il primo, e impostare gli altri due su quel valore.
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 delle successive:
Grazie mille, mi stavo incasinando proprio con quella "i", ho provato cosě
tante combinazioni che non ci ho capito piů niente ad un certo punto.
Grazie ancora, SK
--
La pasienzia non č mai troppo (Totň)
