Line shapes mit for-Schleife ansprechen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Takahara.

    Line shapes mit for-Schleife ansprechen

    Hallo,

    ich habe mehrer "LineShapes" auf einer Seite "ConnectionGraph" plaziert.

    Ich möchte nun diese LineShapes mit zwei for-schleifen ansprechen und ihre Sichtbarkeit ändert.

    Die Namen lauten:

    1. Name: LSCoil1A1

    2. Name: LSCoil1A2

    3. Name: LSCoil1A3



    Ich habe sowohl unterschiedliche "Coils" als auch unterschieldliche "Anschlüsse"

    For i=0 to 2

    for j=1 to 4

    connectiongraph."LSCoil" & i, "A" & j.visible=true

    Next

    Next



    Ich bekomme immer die Fehlermeldung, dass ein Bezeichner erwartet wird

    Vielen Dank

    Takahara
    so grob :

    genauere auswahl der shapes kannst du über lineshapeX.name bekommen

    VB.NET-Quellcode

    1. For Each shape In Me.ShapeContainer1.Shapes
    2. If shape.GetType Is GetType(Microsoft.VisualBasic.PowerPacks.LineShape) Then
    3. Dim LineshapeX As Microsoft.VisualBasic.PowerPacks.LineShape = CType(shape, PowerPacks.LineShape)
    4. Debug.Print(LineshapeX.Name)
    5. LineshapeX.Visible = False
    6. End If
    7. Next
    Hallo,

    die erste Antwort verstehe ich garnicht.

    Die Klasse auf der ich arbeite heißt: "ConnectionGraph". Auf dieser Klasse sind mehrere LineShapes die ich sichtbar/unsichtbar machen möchte. Jeder LineShape hat einen Namen bekommen.

    Hier noch mal ein Bsp.

    Name: LSCoil1A1

    Name: LSCoil1A2

    Name: LSCoil1A3



    Name: LSCoil2A1

    Name: LSCoil2A2

    Name: LSCoil2A3

    mit folgendem Befehl kann ich einen LineShape sichtbar machen.

    ConnectionGraph.LSCoil1A1.Visible=True

    Soweit ist alles wunderbar. Da ich aber sehr viele LineShape auf der Klasse "ConnectionGraph" plaziert habe möchte ich es mit zwei For-Schleifen versuchen.

    Daher auch meine Idee:

    For i=0 to2

    For j=1 to 3

    ConnectionGraph.("LSCoil" & i, "A" & j).Visible=True

    Next

    next



    Wenn das anprechen eines LineShapes möglich ist, dann muss ich doch auch mehrere Linesphapes mit einer/zwei Schleifen ansprechen können und dessen Eigenschaften ändern können.



    Gruß



    Takahara

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Takahara“ ()

    Ich nehme an ... mit ConnectionGraph meinst du den Namen deiner Form?
    und die Lineshapes sind von den visualbasic Powertools ?



    Ja genau.



    ConnectionGraph ist der Name der Form und Lineshapes sind "Striche" aus dem visualbasic powertool.



    ich habe jetzt folgende Zeile probiert:



    For i = 1 To 1
    For J = 1 To 4
    ConnectionGraph.Controls.Item(
    "LSCoil" & i & "A" & J).Visible = True

    Next

    Next



    Jetzt bekomme ich die Fehlermeldung: "Erstellen Sie eine Objektinstanz mit dem Schlüsselwort "new".



    Gruß

    Takahara
    Alle Lineshapes liegen im Container ! (Das ist immer so , automatisch)
    der container heist ShapeContainer1
    ich nehme an das es immer nur ein Container ist, kann aber bei dynamisch hinzugefügten Shapes(zB lineshape) anders sein
    Warum man auf die lineshapes zugreifen kann, ohne den container anzugeben ... kein Ahnung, typisch MS style

    Kannst du aber nachprüfen mit :

    VB.NET-Quellcode

    1. For Each Control In ConnectionGraph .Controls
    2. Debug.Print(Control.Name.ToString()) 'wie du siehst werden die lineshapes nicht angezeigt , nur der container
    3. 'container suchen
    4. If Control.GetType Is GetType(Microsoft.VisualBasic.PowerPacks.ShapeContainer) Then
    5. Debug.Print("--------Container: " & Control.Name.ToString())
    6. 'Lineshapes durchgehen
    7. For Each shape In Me.ShapeContainer1.Shapes
    8. If shape.GetType Is GetType(Microsoft.VisualBasic.PowerPacks.LineShape) Then
    9. Dim LineshapeX As Microsoft.VisualBasic.PowerPacks.LineShape = CType(shape, PowerPacks.LineShape)
    10. Debug.Print("LineshapeName: " & LineshapeX.Name)
    11. End If
    12. Next
    13. End If
    14. Next


    Frage: willst du immer alle verstecken oder differenziert (also bestimmte)? zB nur LSCoil1A1 oder alle LSCoil1Ax

    Hab das problem noch nie gehabt , object ansprechen von dem ich nur den Namen als string habe
    Ich kann nur das was ich schon mal gebraucht habe, bzw wenn ich was brauche lerne ich das .. nix anderes (speicher sparen) :P
    falls du sie wirklich einzeln ändern willst :

    VB.NET-Quellcode

    1. For Each Control In ConnectionGraph.Controls
    2. 'container suchen
    3. If Control.GetType Is GetType(Microsoft.VisualBasic.PowerPacks.ShapeContainer) Then
    4. For i = 1 To 1
    5. For J = 1 To 4
    6. 'Lineshapes durchgehen
    7. For Each shape In Control.Shapes
    8. If shape.GetType Is GetType(Microsoft.VisualBasic.PowerPacks.LineShape) Then
    9. Dim LineshapeX As Microsoft.VisualBasic.PowerPacks.LineShape =
    10. CType(shape, PowerPacks.LineShape)
    11. 'namen vergleichen
    12. If LineshapeX.Name = "LSCoil" & CStr(i) & "A" & CStr(J)
    13. Then LineshapeX.Visible = True
    14. End If
    15. Next
    16. Next
    17. Next
    18. End If
    19. Next
    Hallo,



    erst mal vielen Dank für deine Hilfe.



    Ich werde mal versuche deinen Vorschlag anzupassen.

    Was ich bei der ganzen Sache nicht verstehe ist die Tatsache, warum es so kompliziert ist.

    Wenn ich z.B. mit



    ConnectionGraph.LSCoil1A1.Visible=True



    einen Lineshape direkt ansprechen kann, warum geht es dann nicht genau so einfach wenn ich mehrere in For-Schleifen ansprechen will.



    Gibt es vielleicht eine einfache Möglichkeit eine Variable vom Typ String auf ein Objekt(Der entsprechende Lineshape) verweisen zu lassen?



    'For k = 1 To 1

    ' For z = 1 To 4
    ' Dim test As String


    ' test = "LSCoil" & k & "A" & z'ConnectionGraph.Controls.Item("LSCoil" & k & "A" & z).Visible = True


    ' Next
    'Next

    In dem obigen Bsp. enthällt die Variable "Test" immer den korrekten Namen des Objektes (Lineshape) Nur weiß ich nicht wie ich die Variable vom Typ String auf das entsprechende Objekt verweisen lasse.

    Vielleicht weiß ja jemand bescheid.

    Takahara
    Das wäre auf jeden fall einfacher , aber ich hab keine Ahnung ob und wie das geht.

    Alternative wäre ein steuerelemente array ,zweidimensional, das sollte machbar sein , dynamisch erzeugen und dann köntest sie mit coil(k,z) ansprechen.
    must mal googeln

    Lineshape direkt ansprechen

    Hallo,



    ich habe mich dem Thema noch mal angenommen und bin auf der Suche nach eine schnelleren Lösung ohne, dass ich jedesmal alles Lineshapes durch gehen muss.

    Meine Fragen:

    Was wird in der Zeile: "Dim LineshapeX As Microsoft.VisualBasic.PowerPacks.LineShape =
    CType(shape, PowerPacks.LineShape)"

    gemacht?



    Wie kann ich LineshapeX direkt einen Namen geben ohne die For-Schleife duruch zugehen und was ist "shape" in diesem Fall?



    Danke Takahara








    For Each Control In ConnectionGraph.Controls
    'container suchen
    If Control.GetType Is GetType(Microsoft.VisualBasic.PowerPacks.ShapeContainer) Then
    For i = 1 To 1
    For J = 1 To 4
    'Lineshapes durchgehen
    For Each shape In Control.Shapes
    If shape.GetType Is GetType(Microsoft.VisualBasic.PowerPacks.LineShape) Then

    Dim LineshapeX As Microsoft.VisualBasic.PowerPacks.LineShape =
    CType(shape, PowerPacks.LineShape)
    'namen vergleichen

    If LineshapeX.Name = "LSCoil" & CStr(i) & "A" & CStr(J)
    Then LineshapeX.Visible = True
    End If
    Next
    Next
    Next
    End If
    Next