| |
VB.NET - Ein- und UmsteigerFor Next schleife | | | Autor: flexxer | Datum: 25.07.21 10:09 |
| Hallo,
ich habe in meiner Form 30 Labels (L1 - L30)
Diese würde ich gerne mit einer For Next schleife durchlaufen.
Dim i As Integer
For i = 30 To 1 Step -1
If L(i) > 0 Then
ForeColor = Color.Red
Else
ForeColor = Color.Green
End If
Next i Fehlermeldung: BC30451 "L" wurde nicht deklariert. Aufgrund der Schutzstufe ist unter Umständen kein Zugriff möglich. | |
Re: For Next schleife | | | Autor: Manfred X | Datum: 25.07.21 16:00 |
| Hallo!
Ich vermute,Du hast diese Labels im Designer auf die Form gezogen.
Um indiziert zugreifen zu können, ist zusätzlich eine Liste oder ein Array
erforderlich, wobei den Items die Referenzen auf die Labels zugewiesen werden.
Eine andere Möglichkeit des Zugriffs bietet die Controls-Auflistung
der Form, die Referenzen auf alle enthaltenen Steuerelemente umfasst.
Über den Namen der Controls kannst Du die Labels in der Schleife filtern.
Die dritte Variante wäre die Anordnung der Labels in einem
eigenen Container, dessen Controls-Auflistung dann nur diese Labels enthält. | |
Re: For Next schleife | | | Autor: flexxer | Datum: 25.07.21 17:01 |
| Hallo Manfred,
wie vermutet habe ich die Labels im Designer auf die Form gezogen.
Was würde am meisten Sinn machen ? Bzw. was geht am schnellsten und leichtesten ?
Ich wäre für ein kleines Beispiel dankbar. | |
Re: For Next schleife | | | Autor: Manfred X | Datum: 25.07.21 18:57 |
| Das hängt davon ab, was Du erreichen möchtest.
Hier ein Beispiel für den Zugriff auf die Controls-Auflistung.
Angenommen, Du hast den Labels die Namen L1, L2, L3 usw.
zugewiesen (Name-Eigenschaft):
'Referenz-Variable
Dim lbl As Label
'Alle Controls auf der Form
For Each ctl As Control In Me.Controls
'Labels, deren Name mit L beginnt, filtern
If TypeOf ctl Is Label AndAlso ctl.Name.StartsWith("L") Then
'Control als Label casten
lbl = DirectCast(ctl, Label)
'ab hier Zugriff z.B.
Select Case lbl.Name
Case "L1"
'....
End Select
End If
Next ctl Du kannst über diese Schleife auch ein Label-Array füllen und dann
indiziert auf die Referenz zugreifen.
Dim labels(30) As Label
'Referenz-Variable
Dim lbl As Label
'Alle Controls auf der Form
For Each ctl As Control In Me.Controls
'Labels deren NamemitL beginnt filteren
If TypeOf ctl Is Label AndAlso ctl.Name.StartsWith("L") Then
'Control als label casten
lbl = DirectCast(ctl, Label)
labels(CInt(lbl.Name.Substring(1))) = lbl
End If
Next ctl
Beitrag wurde zuletzt am 25.07.21 um 19:10:43 editiert. | |
Re: For Next schleife | | | Autor: flexxer | Datum: 25.07.21 19:19 |
| Ich muss den Mittelwert der letzten 30 Sekunden bilden.
Damit ich noch alles nachvollziehen kann, habe ich diese 30 Werte in den Labels abgebildet.
L30.Text = L29.Text
L29.Text = L28.Text
L28.Text = L27.Text
L27.Text = L26.Text
L26.Text = L25.Text
L25.Text = L24.Text
L24.Text = L23.Text
L23.Text = L22.Text
L22.Text = L21.Text
L21.Text = L20.Text
L20.Text = L19.Text
L19.Text = L18.Text
L18.Text = L17.Text
L17.Text = L16.Text
L16.Text = L15.Text
L15.Text = L14.Text
L14.Text = L13.Text
L13.Text = L12.Text
L12.Text = L11.Text
L11.Text = L10.Text
L10.Text = L9.Text
L9.Text = L8.Text
L8.Text = L7.Text
L7.Text = L6.Text
L6.Text = L5.Text
L5.Text = L4.Text
L4.Text = L3.Text
L3.Text = L2.Text
L2.Text = L1.Text
L1.Text = Label1.Text
Dim teiler As Decimal = 30
Dim xx As Decimal = (CDec(L1.Text) + CDec(L2.Text) + CDec(L3.Text) + _
CDec(L4.Text) + CDec(L5.Text) + CDec(L6.Text) + CDec(L7.Text) + CDec( _
L8.Text) + CDec(L9.Text) + CDec(L10.Text) _
+ CDec(L11.Text) + CDec(L12.Text) + CDec(L13.Text) + _
CDec(L14.Text) + CDec(L15.Text) + CDec(L16.Text) + CDec( _
L17.Text) + CDec(L18.Text) + CDec(L19.Text) + CDec( _
L20.Text) _
+ CDec(L21.Text) + CDec(L22.Text) + CDec(L23.Text) + _
CDec(L24.Text) + CDec(L25.Text) + CDec(L26.Text) + CDec( _
L27.Text) + CDec(L28.Text) + CDec(L29.Text) + CDec( _
L30.Text)) / teiler
Dim txt As String = xx.ToString("0.00")
mittel.Text = txt Die positiven Werte hätte ich gerne rot dargestellt, die negativen grün.
Leider reichen meine Kenntnisse noch nicht ganz | |
Re: For Next schleife | | | Autor: Manfred X | Datum: 25.07.21 19:31 |
| Anknüpfend an mein obiges Beispiel:
dim sum as decimal
For i As Integer = 1 To 30
labels(i).BackColor = Color.Red
If CDec(labels(i).Text) < 0 Then labels(i).BackColor = Color.Green
sum += cdec(labels(i).text)
Next i
dim mw as decimal = sum / 30
Beitrag wurde zuletzt am 25.07.21 um 19:37:02 editiert. | |
Re: For Next schleife | | | Autor: flexxer | Datum: 25.07.21 20:41 |
| Danke für deine Hilfe,
aber es hat leider noch nicht klick gemacht.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click
Dim Label(30) As Label
'Referenz-Variable
Dim lbl As Label
'Alle Controls auf der Form
For Each ctl As Control In Me.Controls
'Labels deren Name mitL beginnt filteren
If TypeOf ctl Is Label AndAlso ctl.Name.StartsWith("L") Then
'Control als label casten
lbl = DirectCast(ctl, Label)
Label(CInt(lbl.Name.Substring(1))) = lbl
End If
Next ctl
Dim sum As Decimal
For i As Integer = 1 To 30
Label(i).BackColor = Color.Red
If CDec(Label(i).Text) <= 0 Then Label(i).BackColor = Color.Green
sum += CDec(Label(i).Text)
Next i
Dim mw As Decimal = sum / 30
End Sub
End Class Habe 30 Labels auf die Form gezogen, und mit Zahlen belegt.
Sollte doch so gehen ? | |
Re: For Next schleife | | | Autor: Manfred X | Datum: 25.07.21 21:05 |
| Der Code sollte funktionieren.
Und was geschieht nicht?
Hast Du die Labels L1,L2,L3... L30 usw. genannt?
Kommt es irgendwo im Code zu einer Ausnahme?
Du musst eventuell auf den DezimalPUNKT achten (deutsch: Dezimalkomma).
(oder die Decimal.Tryparse-Methode nutzen.)
CDEC beachtet die Windows-Kultureinstellungen beim Parsen.
Beitrag wurde zuletzt am 25.07.21 um 21:13:27 editiert. | |
Re: For Next schleife | | | Autor: flexxer | Datum: 26.07.21 06:35 |
| Wenn ich das ganze in einer neuen Form erstelle, macht es seine Arbeit
Die Labels sind richtig benannt L1,L2 ....
Das ganze läuft bei mir in einem Timer.
Der älteren Wert wird immer 1 nach unten geschoben.
siehe oben
L30.Text = L29.Text
L29.Text = L28.Text
L28.Text = L27.Text
L27.Text = L26.Text Hier kommen anscheinen noch keine Daten an.
L0 = immer der aktuelle Wert
L1 = L0
L2 = L1 vor 1 Sekunde
https://ibb.co/kH7XWfk
Die For schleife habe ich in
For i As Integer = 30 To 0
umgewandelt | |
Daten-Liste an Listbox binden | | | Autor: Manfred X | Datum: 26.07.21 13:29 |
| Warum nicht so?
Code in ein neues Winforms-Formular kopieren
Datenbindung einer Liste (myData) an eine Listbox (lboData),
deren Items per Code gezeichnet werden (DrawItem-Event)
Im Beispiel werden neue Daten per Random im Timer-Event ergänzt.
Public Class frmRunningList
Dim WithEvents lboData As New ListBox With
{.Parent = Me, .Top = 10, .Left = 10, .Width = 100, .Height = 300,
.DrawMode = DrawMode.OwnerDrawFixed}
Dim bs As New BindingSource 'für steuerbare Datenbindung
Dim myData As New List(Of Decimal) 'Daten-Liste
Dim WithEvents timData As New Timer With {.Interval = 1000}
Dim rndm As New Random(123456) 'Datenlieferant
Private Sub frmRunningList_Load(sender As Object, e As EventArgs) _
Handles MyBase.Load
'Datenbindung einrichten
bs.DataSource = myData
lboData.DataSource = bs
timData.Enabled = True
End Sub
Private Sub timData_Tick(sender As Object, e As EventArgs)_
Handles timData.Tick
'Listenlänge auf 10 begrenzen
If myData.Count = 10 Then myData.RemoveAt(0)
'neuen Zufallswert anfügen an Liste
myData.Add(CDec(Math.Round(rndm.NextDouble, 2)))
'Datenbindung der Daten-Liste an die Box aktualisieren
bs.ResetBindings(False)
'aktuellen Mittelwert berechnen
Dim mw As Decimal
For i As Integer = 0 To myData.Count - 1
mw += myData(i)
Next i
mw /= myData.Count
Me.Text = "Mittel: " & Math.Round(mw, 2).ToString
End Sub
Private Sub lboData_DrawItem(sender As Object,
e As DrawItemEventArgs) Handles lboData.DrawItem
If e.Index < 0 Then Exit Sub
'Item in verschiedenen Farben zeichnen
e.DrawBackground()
Dim txt As String = myData(e.Index).ToString
'farbige Pinsel erstellen
Using redbrush As New SolidBrush(Color.Red),
greenbrush As New SolidBrush(Color.Green)
'Text-Farbe anhand der Datenausprägung wählen
'und an die richtige Stelle zeichnen (e.bounds)
If CDec(txt) > 0.5 Then
e.Graphics.DrawString(txt & " ", lboData.Font, greenbrush,
e.Bounds.Location)
Else
e.Graphics.DrawString(txt & " ", lboData.Font, redbrush,
e.Bounds.Location)
End If
End Using
End Sub
End Class
Beitrag wurde zuletzt am 26.07.21 um 13:51:03 editiert. | |
Re: For Next schleife | | | Autor: flexxer | Datum: 24.10.21 19:34 |
| @ Manfred
wie kann ich den Datenlieferant ändern ?
Mein Datenlieferant ist Verbrauch.text
Ich sehe das das Beispiel vom 26.7 super arbeitet. Leider verstehe ich es noch nicht ganz. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere Infos
|