Benutzer mit den meisten Antworten
Indizieren und automatisches anordnen von Controllelementen

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
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
- Als Antwort markiert Robert Breitenhofer Montag, 13. Februar 2012 15:30
-
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
- Als Antwort markiert Robert Breitenhofer Montag, 13. Februar 2012 15:30
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 -1VG
Carsten
-
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
-
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 SubVerschiedene Versuche die og. Vorschläge hier anzwenden haben haben bei mir nicht funktioniert.
Bin für jeden Tip dankbar.
Gruss
rotyy
-
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
- Als Antwort markiert Robert Breitenhofer Montag, 13. Februar 2012 15:30
-
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
- Als Antwort markiert Robert Breitenhofer Montag, 13. Februar 2012 15:30