Newsgroup: it.comp.lang.visual-basic
Titolo: creare controlli

come si fa a creare al click di un pulsante altri X pulsanti su una form
in base ad un numero inserito
e distribuirle in modo affiancato su 2 o piu' righe.
esempio inserisco all'inizio 2 righe e 3 colonne
praticamente al click su un pulsante crea controlli devo inserire sulla
form
una riga di tre pulsanti la cui larghezza di ognuno è uguale a quella
della form diviso 3
ed affiancati uno al'altro e idem per la seconda riga: inoltre la 2a
riga deve essere allineata
(adicente) a quella sopra.
grazie

 e distribuirle in modo affiancato su 2 o piu' righe.
.
[Cut]
Aggiungere pulsanti a Runtime non è difficile Guarda sulla guida il metodo
Controls.Add()
Il problema e gestirne gli eventi che dovresti preventivamente dichiarare
con una WithEvents e questa non accetta MATRICI
Ora se non hai necessità di aggiungere un numero *indefinito* di pulsanti
questo esempio potrebbe aiutarti ;)
'Da inserire in un Form
Dim WithEvents al1 As VB.CommandButton
Dim WithEvents al2 As VB.CommandButton
Dim WithEvents al3 As VB.CommandButton
Private Sub Command1_Click()
'Contempliamo una sola riga e 3 colonne
colonne = 3
Select Case colonne
        Case 1
        'Vedi 2 a scalare
        Case 2
        '......Vedi 3 a scalare
        Case 3
            Set al1 = Me.Controls.Add("VB.CommandButton", "al" & 1, Me)
            'rendi visibile il controllo
            al1.Visible = True
            'lo muovi dove ti pare
            al1.Move 100, 0
            Set al2 = Me.Controls.Add("VB.CommandButton", "al" & 2, Me)
            al2.Visible = True
            al2.Move al1.Left + al1.Width + 100, 0
            Set al3 = Me.Controls.Add("VB.CommandButton", "al" & 3, Me)
            al3.Visible = True
            al3.Move al2.Left + al2.Width + 100, 0
End Select
End Sub
'Evento click aggiunto prima
Private Sub al1_Click()
MsgBox al1.Name
End Sub
Private Sub al2_Click()
MsgBox al2.Name
End Sub
Private Sub al3_Click()
MsgBox al3.Name
End Sub
Ciao
Alessandro
--
Morfeus®
Free Joint
:PII

 WithEvents e questa non accetta MATRICI
In alternativa (e mi pare una soluzione molto piu' efficiente ;) ) puoi
creare *un solo* pulsante (chiamiamolo RuntimeButton) con Index = 0 e
Visible = False e posizionarlo dove vuoi che "comincino" ad apparire i
controlli creati a runtime.
Se devi creare (mettiamo) 10 controlli rendi il primo (index 0) visibile ed
i successivi li carichi con l'istruzione
Load RuntimeButton(1)
'[...] <- Imposta le coordinate
RuntimeButton(1).Visible = True
Naturalmente la cosa e' piu' semplice in un ciclo (per semplicita' i
controlli sono su un unica colonna):
RuntimeButton(0).Visible = True
For i = 1 To NumeroControlliDaCaricare - 1
    Load RuntimeButton(i)
    RuntimeButton(i).Left = RuntimeButton(i-1).Left
    RuntimeButton(i).Top = RuntimeButton(i-1).Top +
RuntimeButton(i-1).Height
    RuntimeButton(i).Visible = True
Next i
Per metterli su piu' colonne potresti verificare che il Top + Height del
Pulsante appena posizionato non superi Height del Form, e in tal caso
impostare il Top come quello del primo controllo (Index 0) e il Left ...
mmmh ... a te i calcoli ;)
hth,
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

 Lokar


 Next i
ma quando si chiude la form si deve riscaricare i controlli con unload ?
inoltre in rete ho trovato un modo anche per pulire i controlli messi, nel caso
si vuole rimettere
gli stessi con altri valori sulla stessa maschera:
do while not controllo.ubound=0
     unload controllo(controllo.ubound)
loop
volevo chiedere ma è una tecnica valida oppure puo' dare problemi ?
non mi ricordo se da qualche parte avevo letto di evitare i loop perchè possono
non chiudersi mai
inoltre se una volta messi i controlli al clicjk su un pulsante provo a rifar
click mi dà (giustamente errore);
che trucco si puo' usare per evitare di far partire il click se i controlli
sono già stati messi e quindi l'operazione
si puo' fare solo se prima si ripulisce la maschera

 la maschera
(magari metti il punto interrogativo alla fine di una
domanda... ;) )
Beh basta che all'inizio del codice dell'evento Click del
pulstante che carica i controlli a runtime verifichi che non
siano gia' caricati e, in tal caso:
1) li scarichi e li ricarichi;
2) se devi caricarne di piu', carichi solo la differenza
(carichi da Controllo.UBound + 1 a quanti ne devi mettere in
tutto);
2bis) se devi caricarne di meno, scarichi solo quelli in
eccesso (scarichi da Controllo.Ubound a quanti ne devi
mettere + 1).
Per verificare puoi fare un controllo su
Controllo(0).Visible = True, e' meglio di controllare
l'UBound perche' se l'ubound e' 0 ma il controllo 0 e'
visibile vuol dire che il controllo 0 e' gia' usato.


 visibile vuol dire che il controllo 0 e' gia' usato.
cioè visible è meglio di ubound ?