[VB 2005]Array di controlli

giovedì 28 gennaio 2010 - 16.36

rerupippo Profilo | Newbie

Salve a tutti,
per riutilizzare il codice di un programmino che mi crea una serie di picturebox vorrei spostare la Sub Crea e PictureClick in un modulo, così da poter essere riusati da altre Form.
Come posso fare ?
Il codicino è questo:

Public Class Form1
Dim AnteprimaEtichetta() As PictureBox
Dim MyPicture As PictureBox

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Crea(Panel1)
End Sub

Private Sub PictureClick(ByVal sender As Object, ByVal e As EventArgs)
MyPicture = CType(sender, PictureBox)
Panel1.BackColor = Color.Coral
End Sub

Private Sub Crea(ByVal Contenitore As Windows.Forms.Panel)
Dim i As Integer
For i = 0 To 1
'======================
'CREO LE PICTUREBOX SUL FORM
ReDim Preserve AnteprimaEtichetta(i)
AnteprimaEtichetta(i) = New PictureBox
AnteprimaEtichetta(i).Tag = i
AnteprimaEtichetta(i).Left = 20
AnteprimaEtichetta(i).Top = 10
AnteprimaEtichetta(i).Width = 50
AnteprimaEtichetta(i).Height = 50
AddHandler AnteprimaEtichetta(i).Click, AddressOf PictureClick
Contenitore.Controls.Add(AnteprimaEtichetta(i))
Next
End Sub
End Class

Grazie mille a tutti
R.Z.

Jeremy Profilo | Guru

Ciao.
ma questo non è VB6 .... è Vb.Net! ....e mi sembra che sia già strutturato come serve a te ..... mi sfugge qualcosa?
Cosa ti serve sapere nello specifico?

facci sapere....
Ciao

rerupippo Profilo | Newbie

Grazie per l'interessamento,
si, è .NET.
Nella speigazione forse sono stato troppo veloce (purtroppo è un mio difetto).
Il "problema" è questo : ho un programmino che utilizza una cinquantina di Picturebox per form e, così com'è (tutte le funzioni nel form che uso, funziona bene.
Ora devo implementare altri form che andrebbero ad utilizzare le medesime Picturebox del form precedente, quindi pensavo di poter riutilizzare il codice, mettendolo in un modulo.
Purtroppo mi sono incastrato nell'assegnazione dell'evento Click alle Picturebox create.Ti allego un esempio, pensa possa "parlare meglio di me"...

Grazie mille

PS
se mi potessi rispondere mi leveresti un gran brutta gatta!


R.Z.

Jeremy Profilo | Guru

Ciao
Sostituisci TUTTO il codice del modulo con questo:
Module Module1 Public AnteprimaEtichetta() As PictureBox Public MyPicture As PictureBox Public Sub Crea(ByVal Contenitore As Windows.Forms.Panel) Dim i As Integer For i = 0 To 1 '1 E' SOLO PER ESEMPIO... '====================== 'CREO LE PICTUREBOX SUL FORM ReDim Preserve AnteprimaEtichetta(i) AnteprimaEtichetta(i) = New PictureBox AnteprimaEtichetta(i).Tag = i AnteprimaEtichetta(i).Left = 20 AnteprimaEtichetta(i).Top = 10 AnteprimaEtichetta(i).Width = 50 AnteprimaEtichetta(i).Height = 50 AnteprimaEtichetta(i).WaitOnLoad = True AnteprimaEtichetta(i).SizeMode = PictureBoxSizeMode.StretchImage AnteprimaEtichetta(i).Cursor = Cursors.Hand AnteprimaEtichetta(i).BackColor = Color.LightGray AddHandler AnteprimaEtichetta(i).Click, AddressOf PictureClick Contenitore.Controls.Add(AnteprimaEtichetta(i)) Next End Sub Public Sub PictureClick(ByVal sender As Object, ByVal e As EventArgs) MyPicture = CType(sender, PictureBox) If MyPicture.BorderStyle = BorderStyle.None Then MyPicture.BorderStyle = BorderStyle.FixedSingle For Each cnt As Control In MyPicture.Parent.Parent.Controls If cnt.Name = "Button2" Then DirectCast(cnt, Button).Enabled = True End If Next Else MyPicture.BorderStyle = BorderStyle.None For Each cnt As Control In MyPicture.Parent.Parent.Controls If cnt.Name = "Button2" Then DirectCast(cnt, Button).Enabled = False End If Next End If End Sub End Module

se ho capito e risolto il tuo problema .... poi ne parliamo.
Probabilmente l'ho risolto solo in parte .... poi ti spiego perchè e come bisogna procedere in queste situazioni.

Facci sapere...
Ciao

rerupippo Profilo | Newbie

Grazie,
sei veramente gentile nel rispondermi.
Così funziona benissimo, ho però un problemino che, per mia stupidità e superficialità non ti avevo esposto nel precedente messaggio.
Il ciclo che scandisce i controlli " For Each cnt As Control In MyPicture.Parent.Parent.Controls" se ho ben capito è in grado di rilevare solo i controlli appartenenti al form sul quale risiede la MyPicture. In realtà ho anche altri controlli da gestire che sono contenuti in un pannello, questi non sono visti dal ciclo.Come posso fare per vedere tutti i controlli ?
Purtroppo ero abituato con VB6 quando era sufficiente passare il form seguendo il "flusso" dei controlli che venivano mostrati.
I parole povere come posso ad una Sub/Func (se possibile...) passare il form e da li gestire i controlli in esso contenuti ?.

Grazie ancora per la tua disponibilità
R.Z.

Aggiornamento (h11.01)......
cosa ne dici delle collezzioni ?E' una stupidata ?
Ti allego il codicillo

Grazie

Jeremy Profilo | Guru

Ciao.
Lascia perdere la collezione di bottoni .....
Usa questo codice e poi facci sapere....
Ciao
Module Module1 Public AnteprimaEtichetta() As PictureBox Public MyPicture As PictureBox Public Bottoni As New Collection() Public Sub Crea(ByVal Contenitore As Windows.Forms.Panel) Dim i As Integer For i = 0 To 1 '1 E' SOLO PER ESEMPIO... '====================== 'CREO LE PICTUREBOX SUL FORM ReDim Preserve AnteprimaEtichetta(i) AnteprimaEtichetta(i) = New PictureBox AnteprimaEtichetta(i).Tag = i AnteprimaEtichetta(i).Left = 20 AnteprimaEtichetta(i).Top = 10 AnteprimaEtichetta(i).Size = New Size(50, 50) AnteprimaEtichetta(i).WaitOnLoad = True AnteprimaEtichetta(i).SizeMode = PictureBoxSizeMode.StretchImage AnteprimaEtichetta(i).Cursor = Cursors.Hand AnteprimaEtichetta(i).BackColor = Color.LightGray AddHandler AnteprimaEtichetta(i).Click, AddressOf PictureClick Contenitore.Controls.Add(AnteprimaEtichetta(i)) Next End Sub Public Sub PictureClick(ByVal sender As Object, ByVal e As EventArgs) MyPicture = CType(sender, PictureBox) Dim obj As Object = MyPicture Dim IsForm As Boolean While Not IsForm If TypeOf DirectCast(obj, Control).Parent Is Form Then IsForm = True obj = DirectCast(obj, Control).Parent Else obj = DirectCast(obj, Control).Parent End If End While Dim frm As Form = CType(obj, Form) If MyPicture.BorderStyle = BorderStyle.None Then MyPicture.BorderStyle = BorderStyle.FixedSingle For Each cnt As Control In frm.Controls If TypeOf cnt Is Panel Then For Each _cnt As Control In cnt.Controls If _cnt.Name = "Button2" Then DirectCast(_cnt, Button).Enabled = True End If Next End If If cnt.Name = "Button2" Then DirectCast(cnt, Button).Enabled = True End If Next Else MyPicture.BorderStyle = BorderStyle.None For Each cnt As Control In frm.Controls If TypeOf cnt Is Panel Then For Each _cnt As Control In cnt.Controls If _cnt.Name = "Button2" Then DirectCast(_cnt, Button).Enabled = True End If Next End If If cnt.Name = "Button2" Then DirectCast(cnt, Button).Enabled = False End If Next End If End Sub End Module

rerupippo Profilo | Newbie

Grazie, mi sei stato di grandissimo aiuto ...
La stessa logica posso usarla anche in altre Sub/Fun (correggimi se dico una stupidata) per poter "loopare" i controlli che desidero usare, tipo :

Public Sub Procedi(ByVal Contenitore As Windows.Forms.Form)
Dim frm As Form = CType(Contenitore, Form)
For Each cnt As Control In frm.Controls
If TypeOf cnt Is Panel Then
For Each _cnt As Control In cnt.Controls
If _cnt.Name = "Button2" Then
DirectCast(_cnt, Button).Text = "Pippo"
End If
Next
End If
Next
End Sub

Ancora un secondo,
hai un buon libro da consigliarmi ? Ho acquistato "Visual Basic 2005 Passo per Passo" della Microsoft ma, ok che sono un principiante/autodidatta ma mi sembra un pochino troppo elementare (spero di non passare per "so tutto io")...
...queste richieste cmq mi smentirebbero

Grazie ancora e,buona giornata/serata



R.Z.

Jeremy Profilo | Guru

Ciao.
Di libri ce ne sono tanti e di tutti i tipi .... difficile dirti quale il più completo, comunque un libro va tenuto come meorandum delle cose più elementari .... per il resto puoi trovare molto in rete ... e da noi!

Riguardo al codice che hai postato ti metto qualche commento in mezzo
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Ciao

rerupippo Profilo | Newbie

grazie mille per i tuoi preziosi consigli e disponibilità (rara di questi tempi).

Tanti saluti e buona giornata
R.Z.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5