Newsgroup: it.comp.lang.visual-basic
Titolo: selezione di tutti i controlli

C'è un modo con cui posso effettuare operazioni su, ad esempio, tutte
le label di un form? qualcosa tipo
Me.Control.Labels.text = "prova"

 Me.Control.Labels.text = "prova"
*************************
         Dim obj As Object
         Dim i As Integer = 0
         For Each obj In Me.Controls
             If TypeOf (obj) Is Label Then
                 i += 1
                 obj.text = "AHHHH: " & i
             End If
         Next
*************************
E' molto VB6-Like, ma con .net sono niubbo, esiste sicuramente qualcosa 
di più elegante.
ciao
stefano

> Me.Control.Labels.text = "prova"
*************************************************
         Dim i As Integer = 0
         For Each obj As Control In Me.Controls
             If TypeOf (obj) Is Label Then
                 i += 1
                 obj.Text = "AHHHH: " & i
             End If
         Next
*************************************************
una limatina.
ciao
stefano

Stefano Ferrari ha scritto:

x farlo proprio proprio .net like io farei cosi :-)
For Each obj As Control In Me.Controls
           If 
obj.gettype.name
 ="label" Then
                         msgbox(obj.text)
            End If
Next
Facendo attenzione al fatto che se ad esempio in una form hai un 
groupbox e cicli si me.control i label dentro al group box non li 
becchi. Quindi ti merita fare una cosa ricorsiva che considera i 
contenitori (groupbox, tabcontrol ecc ecc) che quando li trova si 
auto-richiama.
del tipo (è solo una vaga idea...eh non è codice funzionante)
For Each obj As Control In Me.Controls
           If 
obj.gettype.name
 ="label" Then
                         msgbox(obj.text)
            End If
	if 
obj.gettype.name
 ="group box" then
		stessafunzione(obj)
	end if
Next
ciao ciao
A.

 x farlo proprio proprio .net like io farei cosi :-)
[CUT]
Innanzitutto grazie per la dritta,
prendendo spunto dal tuo post ho scritto :
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
         EvaluateControl(Me)
     End Sub
     Private Sub EvaluateControl(ByVal objContainer As Object)
         Static iScorri As Int16 = 0
         For Each obj As Control In objContainer.Controls
             If 
obj.GetType.Name
 = "Label" Then
                 iScorri += 1
                 obj.Text = "Controllo n." & iScorri
             ElseIf obj.Controls.Count > 0 Then
                 EvaluateControl(obj)
             End If
         Next
     End Sub
Così funziona e mi sembra anche che si sia scrollata di dosso la polvere 
di VB6 che aveva prima :-)
Naturalmente qualsiasi suggerimento su come sgrezzarla è sempre ben accetto.
ciao
stefano

 Next
Per farlo proprio .NET like io toglierei anche msgbox!!!
In .NET si usa  MessageBox.Show(.....)
Ciao, Vincenzo 

 Ciao, Vincenzo 
io invece non lo uso mai, uso sempre la vecchia sintassi! bacarsi il 
cazzo per le messagebox è davvero troppo!
saluti

questo è lo scheletro di una mia procedure
Public Sub controllaLivello(ByVal ctrl As Control)
         Dim count As Integer
         Dim ctr As Control
         For Each ctr In ctrl.Controls
          'controlli su tutti i tipi di oggetto non contenitore
             Select Case 
ctr.GetType.Name
                 Case "TabControl"
                     Dim scheda As Control
                     Dim ctrl3 As TabControl
                     ctrl3 = ctr
                     For Each scheda In ctrl3.TabPages
                         controllaLivello(scheda)
                     Next
                 Case "GroupBox"
                     controllaLivello(ctr)
                 Case "FlowLayoutPanel"
                     controllaLivello(ctr)
                 Case "SplitContainer"
                     Dim divisore As SplitContainer
                     divisore = ctr
                     Dim settore As SplitterPanel
                     For Each settore In divisore.Controls
                         controllaLivello(settore)
                     Next
                 Case "ToolStrip"
                     controllaBarraDiStato(ctr)
                 Case "BindingNavigator"
                     controllaBinding(ctr)
             End Select
         Next
     End Sub
i metodi x le barre (bindingnavigator toolstrip ecc ecc) vanno fatti 
diversi xke si scorrono con oggetti toolstripitem che è meglio :)
ciao ciao

 accetto.
Quello che segue non è un suggerimento per sgrezzare il codice che hai 
scritto, quanto piuttosto una considerazione riguardo alle prestazioni.
A voler essere puntigliosi, faresti bene a dichiarare iScorri 
semplicemente come Integer (che poi per VB è un alias di System.Int32, 
allo stesso modo di int per C#).
Il mio manuale di preparazione all'esame 70-536, in un rettangolino che 
porta la dicitura "Best Practices" recita testualmente:
"The runtime optimizes the performance of 32-bit integer types (Int32 
and UInt32), so use those types for counters and other frequently 
accessed integral variables. For floating-point operations, Double is 
the most efficient type because those operations are optimized by hardware."
Addirittura potresti usare System.UInt32 (o il suo alias UInteger), 
visto che stiamo parlando di un contatore che non diventerà mai negativo.
Ora, su un form difficilmente avrai centinaia di migliaia di controlli 
(se è per questo nemmeno 32767, che fa taaaanto VB6), ma... tutto fa 
brodo, ecco. Specialmente in contesti dove le prestazioni contano.
S.

 scritto, quanto piuttosto una considerazione riguardo alle prestazioni.
[CUT]
Grazie 1000 per la considerazione,
considera che ho un radicato background VB e in .NET sono solo agli 
inizi. In effetti non so perchè ho messo Int16, negli altri piccoli 
esempi che mi sono fatto ho sempre usato Integer.
In ogni caso utilissima precisazione, grazie.
Ciao
stefano

Stevie ha scritto:

dipende dal tipo di programma...ad esempio in un gestionale dove si fa 
accesso ai dati tutto questo incide circa 0 sulle prestazioni...
saluti MVB

v@nb@sten4eveR99 ha scritto:

Nella maggior parte dei casi, AFAIK, si tratta di una questione di 
preferenza. Sul piano delle funzionalità mi pare che le differenze 
all'atto pratico non granché rilevanti.
Sarebbe bene usare MessageBox perché fa parte del framework, e quindi è 
uguale per tutti gli altri linguaggi.
Inoltre, è essa stessa una classe (non istanziabile) e quindi si integra 
meglio con la svolta "object-oriented" che è stata impressa al linguaggio.
S.

 meglio con la svolta "object-oriented" che è stata impressa al linguaggio.
sisi sapevo tutto ma è solo "abitudine e comodita" tutto qua :-D
ciao ciao

 accesso ai dati tutto questo incide circa 0 sulle prestazioni...
E' proprio per questo che, nella parte del mio post che ho quotato qui 
sopra, ho scritto "Specialmente in contesti dove le prestazioni contano"!
Il mio voleva essere un suggerimento generico, non di certo concentrato 
sul codice postato da Stefano, dove, chiaramente, il dichiarare la 
variabile come intero con/senza segno a 32 bit avrebbe un impatto 
decisamente impercettibile sulle prestazioni.
S.

Stefano Ferrari ha scritto:

Ma figurati.
Avevo inteso che fossi agli inizi con .net, mi pareva anche di averlo 
letto in un tuo post.
Venendo da VB6 sono tante le cose che sarebbe utile sapere.
Come ad esempio usare la classe StringBuilder invece di String quando ti 
trovi a fare del lavoro intensivo con le stringhe.
S.

 sisi sapevo tutto ma è solo "abitudine e comodita" tutto qua :-D
E io mi sono dimenticato una riga in fondo al post. Era:
"Detto questo, io uso MsgBox perché nell'arco della stessa giornata mi 
trovo a cambiare da VB6 a VB2005 anche tre o quattro volte".
:P
S.

Stevie ha scritto:

esatto vedo che mi hai capito :D LOL
ciao ciao

 all'atto pratico non granché rilevanti.
MsgBox() è una funzione contenuta in Microsoft.VisualBasic.dll, e non è 
altro che un wrapping del metodo MessageBox.Show().
Se si va a guardare il codice con Reflector, si capisce che non ci sono 
motivi per non usare direttamente MessageBox.Show().
-- 
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Saluti, VITRIOL

 trovi a fare del lavoro intensivo con le stringhe.
Questa la sapevo :-)
ciao
stefano

 motivi per non usare direttamente MessageBox.Show().
si ci sono...se un domani tolgono il wrapper non funge + :-D
saluti!

 si ci sono...se un domani tolgono il wrapper non funge + :-D
Appunto. Non che motivo di usare MsgBox, perché comunque richiama il 
metodo della classe del Framework.
Se poi un domani vuoi convertire in C#, puoi lasciare tutto com'è, 
invece se usi MsgBox devi comunque sostituirli.


 motivi per non usare direttamente MessageBox.Show().
Ecco lì, non ho controllato ma mi fido (ci mancherebbe).
Come dicevo a v@nb@sten4eveR99 mi capita spesso di usare MsgBox() perché 
cambio spesso da VB6 a VB2005.
Possiamo dire che, alla fine, usando MessageBox.Show() si salta un 
passaggio (almeno in teoria, perché credo/spero che il compilatore poi 
riconduca il tutto al medesimo codice IL).
S.

 invece se usi MsgBox devi comunque sostituirli.
Beh, se la mettiamo su questo piano non credo sia il caso di 
preoccuparsi. Se per convertire da VB a C# si usa qualche sorta di tool, 
molto probabilmente questa cosa viene gestita.
Se si fa la conversione a manina, credo che MsgBox sia di nuovo l'ultimo 
motivo per cui darsi pensiero  ;)
S.

 perché credo/spero che il compilatore poi riconduca il tutto al medesimo codice IL
No, perché dovrebbe? MsgBox è una funzione contenuta in una libreria del 
Framework, quindi chiama quella. Poi quello che fa quella funzione sono 
fatti suoi.
Quindi in questo caso hai un passaggio in più anche in esecuzione.


 motivo per cui darsi pensiero  ;)
Sì, ma se tu cerci di utilizzare il più possibile le classi del 
Framework, che sono comuni a tutti i linguaggi, se devi convertire ti 
devi preoccupare quasi solo della sintassi.
Se invece usi funzioni specifiche del linguaggio, allora dovrai trovare 
una alternativa e/o scrivere altro codice.
Ovvio che il caso di MsgBox è banale, però può essere didattico :-)


a ragà...basta! stiamo discutendo sul sesso degli angeli! usiamo il 
tempo in modo + proficuo LOL!!
ciao ciao

 tempo in modo + proficuo LOL!!
Questo è proficuo, perché conoscere l'architettura del Framework può 
permetterti di capire cose che altrimenti magari ti sfuggirebbero :-)


 Ovvio che il caso di MsgBox è banale, però può essere didattico :-)
Mi trovi completamente d'accordo, usare gli standard messi a 
disposizione dal framework ha molti vantaggi :)
Domani faccio un trova & sostituisci a tappeto  ;)
S.

 Quindi in questo caso hai un passaggio in più anche in esecuzione.
E' vero, non ci avevo pensato :)
Quindi, utilizzare a tutti i costi MessageBox, per risparmiare 
sull'overhead di un passaggio in più.
Tutto fa brodo  :P
S.

 tempo in modo + proficuo LOL!!
Pokerino?
S.

Stevie ha scritto:

ok ci sto...ma come si gioca qua :-)??
saluti

 ok ci sto...ma come si gioca qua :-)??
Non importa.
Vedo.
S.