Newsgroup: it.comp.lang.visual-basic
Titolo: VBNET - line vs lineshape

Premetto che provengo da VB6
-e prima ancora da Qbasic e prima ancora dal Basic v.2 commodore :) -
mi sto rendendo conto che form1.line
form1.circle cosi come picture1.line picture.circle...non esistono piu,
ho visto che ci sono i vari lineshape oval etc nella casella strumenti,
in vb6 potevo creare una "vettore" di  Line1 ad esempio
creando Line1 copiandola e reincollandola... ovviamente in vbnet
non va pi�...
se volessi pre-creare come facevo in vb6
ad esempio 1001 lineshape1(xxxx) come potrei fare? 

 ad esempio 1001 lineshape1(xxxx) come potrei fare?
A design, non puoi più creare matrici di controlli, ma non sono
nemmeno più necessarie, perchè puoi ottenere gli stessi comportamenti
(e anche di più) semplicemente usando degli array/collection
convenzionali e i metodi AddHandler/RemoveHandler per gli eventi in
comune.
Fai pure i tuoi copia e incolla normalmente in design; a runtime, se
hai bisogno di raggruppare tutte o gruppi di linee, dichiara un
insieme qualunque (es: Dim MyLines as New List(Of LineShape) e
aggiungili

 aggiungili
non ho capito bene: mi dovrei copia-incollare 1000 lineshape
che saranno lineshape1 lineshape2 lineshape3..etc e poi raggrupparle?
ma non sapendo a priori quante lineshape mi serviranno come fare? 

 ma non sapendo a priori quante lineshape mi serviranno come fare?
Quando hai parlato di "copia e incolla" e "pre-creare" credevo dicessi
che volevi farle tutte in design-time.
Se vuoi crearle a runtime, allora non è molto diverso da come si
faceva in VB6, semplicemente generi nuove istanze di controlli e, se
vuoi, li raggruppi in uno o più array.
Prendi una form vuota e prova:
Public Class Form1
   Dim labelList As New List(Of Label)
   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
      'Esempio basato su Label, ma è analogo per LineShape o qualunque
altro controllo
      Dim lbl As Label
      For i As Integer = 0 To 100
         lbl = New Label
         lbl.Name = "MiaLabel" & i
         lbl.Text = lbl.Name
         lbl.Location = New Point(0, i * 20)
         lbl.Size = New Size(100, 20)
         'esempio di evento condiviso da tutte le label della lista
         AddHandler lbl.Click, AddressOf MiaLabel_Click
         'le raggruppiamo in un array per simulare, eventualmente, il
vecchio sistema di VB6
         labelList.Add(lbl)
         'Aggiungiamo infine ogni controllo alla form stessa
         Me.Controls.Add(lbl)
      Next
   End Sub
   Private Sub MiaLabel_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs)
      'in VB6 si usava "Index" per distinguere l'oggetto di una
matrice di controlli,
      'in .NET ogni evento riceve "sender" che è un riferimento
all'oggetto stesso
      'che ha scatenato l'evento
      Dim currentLabel As Label = DirectCast(sender, Label)
      For Each lbl As Label In labelList
         lbl.BackColor = Me.BackColor
      Next
      Me.Text = "Click su " & currentLabel.Name
      currentLabel.BackColor = Color.LightYellow
   End Sub
End Class

se pu� servire anche ad altri ho mescolato un po di roba e sto
ottenendo il risultato voluto:
Public Class Form1
    Dim labelList As New List(Of System.Windows.Forms.Label)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles MyBase.Load
        Dim Line As Label
        For i As Integer = 0 To 100
            Line = New System.Windows.Forms.Label
            Line.Location = New Point(0, 14 * i)
            Line.Size = New System.Drawing.Size(Me.Width, 3)
            Line.BackColor = System.Drawing.Color.Blue
            AddHandler Line.Click, AddressOf MiaLabel_Click
            labelList.Add(Line)
            Me.Controls.Add(Line)
        Next
    End Sub
    Private Sub MiaLabel_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs)
        Dim currentLabel As Label = labelList(1) 'DirectCast(sender, Label)
        Dim Line As Label
        'For Each Line As Label In labelList
        Line = currentLabel
        Line.BackColor = Color.Red
    End Sub
End Class
 

 End Class
Non capisco il significato di "Dim currentLabel As Label = labelList
(1)" (ad ogni click peschi la seconda label nell'array, qualunque sia
il sender); ma se va bene a te...

 il sender); ma se va bene a te...
nemmeno io...
se non facevo cosi non mi permetteva di metterci il valore 1 o 2 o 100
in labelList(xxx) e non riuscivo a usare la line che volevo...
ma i controlli activex sono spariti ... vero? 

 ma i controlli activex sono spariti ... vero?
Non sono più "activex" ma ci sono sempre

 ?!?
prima non riuscivo a usare la labelList() che volevo io,
il tuo programma al click su una qualsiasi linea le
colorava tutte...cmq sei stato ... fondamentale!
 Private Sub MiaLabel_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs)
        Dim Line As Label
        Line = labelList(1)
        Line.BackColor = Color.Red
end sub
quando clicco una qualsiasi linea mi si colora la seconda (quella che 
voglio).
Private Sub MiaLabel_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs)
              Dim Line As Label
              Line = DirectCast(sender, Label)
              Line.BackColor = Color.Red
    End Sub
cosi invece mi si colora quella che clicco.