Index Steuerelement (VB 2008)

Taquar

Grünschnabel
Hallo!

Ich habe schon lange in Forum gesucht aber ich Finde einfach keine passende Antwort...

Ich bin eine Alter VB 6.0 Programmierer und habe das Index Steuerelement in mein Herz geschlossen.
Nun gibt es dieses aber nicht mehr! :mad:
Und unter Vista x64 Funktioniert VB6 nicht mehr 100%.

Ich habe mir gerne desktop Spiele programmiert, bassierend auf Pictureboxen die aneinander gereiht meinen Hintergrund ergaben.
Da kam dann zB. Hg(0) - Hg(120) die ich mit einer "for - next" Schleife problemlos angesprochen habe.

Jetzt gibt es control.controlirgendwas. Ich finde zwar beispiel für Textboxen, aber ich finde nichts für Pictureboxen. Ich verstehe den Code auch nicht. Bei msdn wird auch nichts erklärt.
Gibt es da einen Kniff? Muss das so Kompliziert werden?
Kann mir bitte jemand einen Beispielcode schreiben? Oder muss ich VB an den Nagel hängen?

Danke im voraus für die Hilfe.
mfg Taquar
 
Hallo Taquar,

ich hatte damals beim Umstieg das selbe Problem und anfangs auch geflucht. Bin dann allerdings auf C# umgestiegen und seitdem viel glücklicher. Am Anfang sieht alles ein wenig anders aus, wenn du aber mal durchgestiegen bist, dann wirst du vielleicht die Vorteile erkennen...

Zu deinem Problem:

Erstelle dir dynamisch deine PictureBox-Controls, packe diese dann in eine Hashtable/Dictionary (Key/Value-Pair Collections) und schon hast du, was du suchst auf die schnelle Art. Du kannst dann über den Key auf die PictureBox zugreifen die du haben willst.
 
Danke für die Hilfe.

Aber du Redest für mich Chinesisch. :confused:
Kannst du mir das Veranschaulichen?

Fange gerade erst mit Vb2008 an.

danke
Taquar
 
Also in C# würde das ganze in etwa so aussehen (Ungetestet und ohne Garantie):

Code:
List<PictureBox> myPictureBoxCollection = new List<PictureBox>();

for(int x = 0; x < 500; x++)
{
   PictureBox pb = new PictureBox(); // Momentan keine Ahnung ob das Control so heißt und ob es überladene Constructors hat
   /* Weitere tolle Dinge mit der PictureBox kannst du hier machen */
   myPictureBoxCollection.Add(pb);
}

Damit hättest du dann 500 PictureBox-Objekte in der Liste. Der Zugriff läuft dann so ab:

Code:
PictureBox current = myPictureBoxCollection[5];

...Sorry für den C#-Code, aber mein VB ist nicht so toll... Denke aber es sollte ein leichtes sein das zu übersetzen...
 
In VB.Net:
Code:
        Dim PictureBoxen As New Dictionary(Of String, PictureBox)

        Dim pb1 As New PictureBox With {.Left = 200}
        Me.Controls.Add(pb1)

        Dim pb2 As New PictureBox
        Me.Controls.Add(pb2)

        PictureBoxen.Add("Erste PictureBox", pb1)
        PictureBoxen.Add("Zweite PictureBox", pb2)

        MessageBox.Show("Abstand der Ersten PictureBox zum linken Rand: " & PictureBoxen.Item("Erste PictureBox").Left)
 
Habe das jetzt so Umgeschrieben:

2 Bilder (PictureBox1 und PictureBox2)
2 Buttons (Button1 und Button2)

Code:
Code:
Public Class Form1
    Dim PictureBoxen As New Dictionary(Of String, PictureBox)
______________________________________________________________________
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



        PictureBoxen.Add("1", PictureBox1)
        PictureBoxen.Add("2", PictureBox2)



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

        Dim i As Integer

        For i = 1 To 2

            PictureBoxen.Item("" & i & "").Left = PictureBoxen.Item("" & i & "").Left + 20

        Next



    End Sub
__________________________________________________________________________
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim i As Integer

        For i = 1 To 2

            PictureBoxen.Item("" & i & "").Left = PictureBoxen.Item("" & i & "").Left - 20

        Next



    End Sub
__________________________________________________________________________
End Class

Funkt! ;-)
Ich kann mit einem Klick auf die Buttons die bilder Bewegen.

Jetzt noch eine Frage.

Muss ich wirklich jede PictureBox einzeln Deklarieren so wie im Form1_Load? :confused:
Oder gibts da die möglichkeit eine Schleife zu erstellen die mir das macht?

Weil bei 120 PictureBoxen werd ich Alt! :suspekt:


mfg
Taquar
 
Code:
Dim PictureBoxen As New Dictionary(Of String, PictureBox)
'______________________________________________________________________
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       For i=1 to 120
           Dim pb as new PictureBox
           Me.Controls.Add(pb)
           PictureBoxen.Add (i.ToString(), pb)
       Next
    End Sub

So sollte das gehen... wobei du bei Zahlen natürlich auch ein Dictionary(Of Integer, ...) hernehmen kannst. Du darfst in die Klammern nach dem "Of" jeden beliebigen Datentyp einsetzen. Das nennt sich Generisch.
 
Bestehende in ein Dictionary packen?
Sicher:

Code:
Dim i = 1

For Each Steuerelement in Me.Controls
    If TypeOf(Steuerelement) Is PictureBox Then
        PictureBoxen.Add(i, Steuerelement)
        i += 1
    End If
Next
 

Neue Beiträge

Zurück