none
Indizieren und automatisches anordnen von Controllelementen RRS feed

  • Frage

  • Hallo,

    ich habe als VB Express Neuling zwei Fragen bitte, die indirekt miteinander zusammenhängen.

    1. Ich versuche Controlllemente zu indizieren um diese dann über einen Index ansprechen zu können. Das klappt auch soweit, wenn ich z.B. Button oder Textbox verwende.
    Ich möchte aber gerne gefüllte Kreise (die z.B. Leuchtdioden darstellen sollen) verwenden. Wenn ich nun versuche dies mit OvalShape zu realisieren , klappt es nicht. VB Express 2010 sagt mir ".OvalShape kann nicht in System.Windows.Forms.Control konvertiert werden".

    2. Die indizierten "Leuchtdioden" möchte ich dann automatisch in einem Kreis anordnen. Im Prinzip klappt das auch, nur sind die Abstände nicht gleichmäßig. Es sieht so aus, als ob die Positionen zu grob sind und dadurch ein erheblicher Rundungsfehler auftritt. Oder das Raster ist zu grob in das die Elemente gesetzt werden können.
    Ich berechne die Position innerhalb der Schleife so :
    LED.Location = New point(offsetx + Sin(index*5) * radius,offsety + cos(index*5) * radius)

    Kann mir bitte zu beiden Punkten jemand einen Rat geben ?

    Vielen Dank

     

     

    Dienstag, 24. Januar 2012 12:58

Antworten

  • Hallo rotyy.

    Der folgende Code "zeichnet" Deine 72 LED's in einer Linie auf das Formular. Das mit der Anordnng im Kreis habe ich weggelassen, weil's für mich jetzt erstmal einfacher ist. Um den Code verwenden zu können, muss auf dem Formular bereits ein ShapeContainer1 vorhanden sein. Dazu musst Du zur Entwurfszeit mindestens ein Shape auf's Formular ziehen (egal ob OvalShape oder RectagleShape)

    Public Class Form1
    
     Private Index As Integer
     Private LED As New List(Of PowerPacks.OvalShape)
    
     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    	LED(Index).FillColor = Color.Blue
    	Index += 1
     End Sub
    
      Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        COMused = My.Settings.comport_used
        Baudused = My.Settings.combaud_used
        Init_COMPort()
        For t As Integer = 0 To 71
          Dim NeueLED As New PowerPacks.OvalShape
          NeueLED.Size = New Size(8, 8)
          NeueLED.FillStyle = PowerPacks.FillStyle.Solid
          NeueLED.FillColor = Color.Red
          NeueLED.Location = New Point(t * (NeueLED.Size.Width + 2) + 4, 60)
    '      NeueLED.Location = New Point(offsetx + Sin(t * 5) * radius, offsety + Cos(t * 5) * radius)
          LED.Add(NeueLED)
          Me.ShapeContainer1.Shapes.Add(NeueLED)
        Next
        ClearLeds()
        mode = 2
    
     End Sub
    End Class
    
    

    Hoffe, das hilft Dir erstmal weiter.

    VG

    Carsten

    Dienstag, 24. Januar 2012 19:05
  • Nur zur Info.

    Problem 2 ist auch gelöst.

    Man muss bei den Winkelfunktionen nur das Winkelmass benutzen, dann ist die
    Darstellung 100% ok.
    Ein Fehler den ich immer wieder mache.

    Danke nochmals für die Hilfe.

    Gruss

    rotyy

     

    Mittwoch, 25. Januar 2012 07:07

Alle Antworten

  • Hallo rotyy.

    Zu 1. kann ich vielleicht weiterhelfen:

    Die Shapes befinden sich in einem ShapeContainer (siehe Controls-Auflistung im Eigenschaftenfenster des Formulares).

    Eine Möglichkeit die Shapes mit einem Index anzusprechen ist im folgenden Code enthalten

    Public Class Form1
    
    	Private IdNr As Integer
    
    	Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    		Dim os As PowerPacks.OvalShape = CType(Me.ShapeContainer1.Shapes(IdNr), PowerPacks.OvalShape)
    		os.FillColor = Color.Blue
    		IdNr += 1
    	End Sub
    End Class
    
    


    Scheinbar hat aber das zuletzt hinzugefügte Shape den Index 0 und das zuerst hinzugefügte Shape den Index Shapes.Count -1

     

    VG

    Carsten

    Dienstag, 24. Januar 2012 14:05
  • Hallo rotyy.

    Eine weitere Möglichkeit zu 1. wäre die folgende:

    Public Class Form1
    
      Private IdNr As Integer
      Private myShapes As New List(Of PowerPacks.OvalShape)
    
      Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        myShapes(IdNr).FillColor = Color.Blue
        IdNr += 1
      End Sub
    
      Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        For Each shape In Me.ShapeContainer1.Shapes
          myShapes.Add(CType(shape, PowerPacks.OvalShape))
        Next
      End Sub
    End Class
    
    

    VG

    Carsten

    Dienstag, 24. Januar 2012 14:15
  • Danke sehr für den Versuch mir zu helfen.

    Leider komme ich damit aber nicht ganz zurecht. Ich bin noch sehr unbedarft mit VB 2010 EX und weiss teilweise
    nicht ganz  genau was ich eigentlich mache (wenn ich ehrlich bin).

    Vielleicht hier mal so wie es mit Buttons klappt. Möchte aber gerne runde Shapes mit OvalShape realisieren.


    Public Class Form1

    ......  

    Dim LED As List(Of Button) = New List(Of Button)
    .....

     

      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            COMused = My.Settings.comport_used
            Baudused = My.Settings.combaud_used
            Init_COMPort()
            For t As Integer = 0 To 71
                Dim L As Button = New Button
                L.Size = New Size(8, 8)
                REM         L.Location = New Point(offsetx + Sin(t * 5) * radius, offsety + Cos(t * 5) * radius)
                LED.Add(L)
                Me.Controls.Add(L)
            Next
            ClearLeds()
            mode = 2
        End Sub

    Verschiedene Versuche die og. Vorschläge hier anzwenden haben haben bei mir nicht funktioniert.

    Bin für jeden Tip dankbar.

     

    Gruss

    rotyy

     

     

     

     

    Dienstag, 24. Januar 2012 16:49
  • Hallo rotyy.

    Der folgende Code "zeichnet" Deine 72 LED's in einer Linie auf das Formular. Das mit der Anordnng im Kreis habe ich weggelassen, weil's für mich jetzt erstmal einfacher ist. Um den Code verwenden zu können, muss auf dem Formular bereits ein ShapeContainer1 vorhanden sein. Dazu musst Du zur Entwurfszeit mindestens ein Shape auf's Formular ziehen (egal ob OvalShape oder RectagleShape)

    Public Class Form1
    
     Private Index As Integer
     Private LED As New List(Of PowerPacks.OvalShape)
    
     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    	LED(Index).FillColor = Color.Blue
    	Index += 1
     End Sub
    
      Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        COMused = My.Settings.comport_used
        Baudused = My.Settings.combaud_used
        Init_COMPort()
        For t As Integer = 0 To 71
          Dim NeueLED As New PowerPacks.OvalShape
          NeueLED.Size = New Size(8, 8)
          NeueLED.FillStyle = PowerPacks.FillStyle.Solid
          NeueLED.FillColor = Color.Red
          NeueLED.Location = New Point(t * (NeueLED.Size.Width + 2) + 4, 60)
    '      NeueLED.Location = New Point(offsetx + Sin(t * 5) * radius, offsety + Cos(t * 5) * radius)
          LED.Add(NeueLED)
          Me.ShapeContainer1.Shapes.Add(NeueLED)
        Next
        ClearLeds()
        mode = 2
    
     End Sub
    End Class
    
    

    Hoffe, das hilft Dir erstmal weiter.

    VG

    Carsten

    Dienstag, 24. Januar 2012 19:05
  • Tausend Dank Carsten!!

    Es funktioniert hervorragend. Super , mein Projekt ist gerettet!!!

    Hätte ich nie hingekriegt, dafür benutzte ich VB 2010 EX zu selten.

    Den Rest schaffe ich dann schon noch.

    Vielen Dank nochmals.

    Gruss

    rotyy

     

    Dienstag, 24. Januar 2012 21:02
  • Nur zur Info.

    Problem 2 ist auch gelöst.

    Man muss bei den Winkelfunktionen nur das Winkelmass benutzen, dann ist die
    Darstellung 100% ok.
    Ein Fehler den ich immer wieder mache.

    Danke nochmals für die Hilfe.

    Gruss

    rotyy

     

    Mittwoch, 25. Januar 2012 07:07