vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
For 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel