Zählvariable mit Label anzeigen

  • VB.NET
  • .NET 4.0

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Zählvariable mit Label anzeigen

    Hallo
    Ich möchte innerhalb einer Schleife Variablen Inhalte anzeigen.
    Zum testen habe ich unten die paar Zeilen in eine Form eingetragen.
    Das Form1 Fenster geht erst nach durchlaufen der Schleife auf und
    zeigt halt nur den Endwert an. Ich habe das auch schon mit TextBox
    versucht geht aber auch nicht. Warum?
    Was ich auch nicht verstehe, für z1 bekomme ich eine unverständliche
    Warnung, für z2 aber nicht.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim z1 As Integer
    3. Dim z2 As Integer = 255
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. For z1 = 1 To 3
    6. Label1.Text = z1
    7. Threading.Thread.Sleep(3000)
    8. Next
    9. End Sub
    10. Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    11. End Sub
    12. End Class
    Hilfe den Nichtwissenden :thumbsup:

    mindanao schrieb:

    für z1 bekomme ich eine unverständliche Warnung
    Welche?
    Du weist einer Property vom Typ String eine Integer-Variable zu, fang also an mit Option Strict On (hatten wir bereits).
    Warum sollte da bei z2 eine WQarnung kommen? Mit dieser Variable machst Du doch gar nix.
    Und:
    Solcghe Experimente gehören nicht in die Form_Load, sondern in eine Timer_Tick-Prozedur.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo
    Deine Antwort war aber fix da, aber ich kann mit Deinem Tip erstmal nix anfangen.
    Ich bin absoluter VB Anfänger, mit 30 Jahren Basic vorbelastet. Um es wenigstens
    ansatzweise zu verstehen mache ich mir diese Progrämmchen. Ich wüsste jetzt nicht
    wo das >Option Strict On< hin müsste, und Timer_Tick lese ich hier das erste mal.

    Ich habe gerade ein Timer_Tick in Form1 gezogen, und die Schleife da reingemacht
    jetzt passiert gar nix mehr.
    Hilfe den Nichtwissenden :thumbsup:

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

    mindanao schrieb:

    Option Strict On
    im einfachsten Fall als erste Zeile jeder Quelltextklasse, da gilt es ausschließlich für diese Datei.
    Dann in den Projekteigenschaften: Projekt -> Eigenschaften -> Kompilieren, da gilt es für das ganze Projekt,
    und schließlich Studio -> Extras -> Optionen -> Projekte und Projektmappen -> VB-Standard, das gilt dann für alle neu erstellten Projekte.
    Gugst Du Visual Studio - Empfohlene Einstellungen
    ======================
    Welche Warnung wurde Dir angezeigt :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Was passiert in Post#1, Z#5-10: Schau erstmal in Visual Studio in Z#5 nach, was Dir IntelliSense ganz zum Schluss für MyBase.Load anzeigt, indem Du mit der Maus über das Load gehst und dort mit dem Mauszeiger verweilst. Dann dürfte klar werden, warum Du erstmal 9 Sekunden warten musst, bevor Du überhaupt erstmal das Endergebnis siehst.
    Das mit dem Timer:
    Es reicht nicht, den Timer auf das Form zu ziehen und im Timer1_Tick-EventHandler Deinen Code reinzuschreiben. Du musst auch den Timer auch per Timer1.Start irgendwo starten. Das Timer-Intervall ist standardmäßig auf 0,1 Sekunden eingestellt, ggf. sollte vor nem Test der Wert etwas erhöht werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    die Warnung lautet:
    Der Typ für die Variable "z1" wird nicht abgeleitet, da er an ein Feld in einem einschliessenden Bereich gebunden ist.
    Ändern Sie den Namen von "z1", oder verwenden Sie den vollqualifizierten Namen (z.B. "Me.z1" oder "MyBase.z1")

    Ich habe beide Optionen "probiert", leider ohne erfolg, aus der Warnung werden Fehlermeldungen
    Hilfe den Nichtwissenden :thumbsup:

    mindanao schrieb:

    die Warnung lautet:
    Klar.
    Du hast zwei Variablen, die z1 heißen:
    Dim z1 As Integer
    und
    For z1 = 1 To 3
    Nimm die Zeile Dim z1 As Integer einfach raus und mach Label1.Text = z1.ToString().
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    An VaporiZed
    OK, mit Maus erkundet hab ich. Muss aber ehrlich gestehen, was da steht sind für mich Böhmische Dörfer.
    Ich mir letzte Woche ein 930 Seiten Buch über Visual Basic gekauft. Ich habe lange darin rumgeblättert
    versucht etwas zu finden was mir bei meinen problemen weiterhilft. Ich habe nichts gefunden was mir
    irgentwie hilft. Das zu meinem jetzigen Wissensstand.
    Mit dem Timer starten hat geklappt. Wo ich das Timer-Intervall einstellen kann, nichts gefunden.
    Ich habe die Schleife in die Timer-Sub kopiert, aber Label1 zeigt nur "Label1" an. Den Befehl zum Timer Start
    kann ich nur in die Timer-Sub selber legen. An anderer Stelle werden Fehler angezeigt.

    An RFG
    OK, gelöscht, Warnung ist weg.
    Wenn ich das jetzt in der Sub Form_Load laufen lasse bekomme ich als Ausgabe wieder nur "3".
    Wenn ich es in der Timer Sub laufen lasse zeigt Label1 nur "Label1"
    Hilfe den Nichtwissenden :thumbsup:

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

    Du willst doch offensichtlich in Label1 die Zahlen 1, 2 und 3 der Reihe nach anzeigen lassen.

    Dazu musst du wissen, dass standardmäßig deine Bildschirmanzeige erst NACH dem Ende der Prozedur akutualisiert wird. Deshalb siehst du immer nur die 3.

    Wenn du die Anzeige vorher aktualisieren willst must du die Update Methode aufrufen:

    VB.NET-Quellcode

    1. Label1.Update()


    Hinzu kommt, dass die Load Prozedur das Display erst nach Abschluss zeichnet. Deshalb funktioniert das in der Load Prozedur nicht.

    Verschiebe deine Schleife in die Label1.Click Prozedur und klicke nach dem Start deiner Anwendung das Label1 an. Und schon klappt das.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim z1 As Integer
    3. Dim z2 As Integer = 255
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. End Sub
    6. Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    7. For z1 = 1 To 3
    8. Label1.Text = z1
    9. Label1.Update()
    10. Threading.Thread.Sleep(3000)
    11. Next
    12. End Sub
    13. End Class

    Böhmische Dörfer? Ich weiß nicht, was bei Dir auftauchte, aber bei mir:

    Und genau das was es, was ich sagen wollte. Der Code aus Post#1 wird ausgeführt, bevor das Form überhaupt das erste Mal angezeigt wird => klar, dass Du nix zu sehen bekommst.
    Wie @Peter329 bereits mit seinem Verweis auf die Update()-Funktion klar machen wollte: Wenn Das Programm Code ausführen sollte, hält es das immer für maximale Priorität. Das heißt, wenn Du eine For-Schleife mit Label- (oder anderer CE-)Veränderung durchführt, sieht das Programm jenen Code als so wichtig an, dass innerhalb Deines Programms sonst nix anderes in der Zeit stattfinden darf. Und solange Du sagst: »Hey, ändere die Variable und schreib sie in das Label rein.«, dann geschieht das aus. Wenn Du es aber auch angezeigt haben willst, dann muss man mit Code auch explizit darauf hinweisen. Da ist das Programm kleinlich. Woher soll es auch wissen, dass Dir daran soviel liegt, das Ergebnis auch zu sehen?
    Bzgl. Timer:
    Das Intervall kannst Du im Designer bei den Eigenschaften oder im Code festlegen:

    per Code: Timer1.Interval = 3000
    Im Code wird dann aber keine For-Schleife verwendet (s. o., Thema Prioritäten), sondern z.B.

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private z As Integer = 0
    3. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Timer1.Start()
    5. End Sub
    6. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    7. Label1.Text = z.ToString
    8. z += 1
    9. If z = 5 Then Timer1.Stop()
    10. End Sub
    11. End Class
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    Der Code von Peter mit Label1.Update() geht bei mir nicht.
    Von Dir der Code geht. Leider fehlt mir jetzt der Anschluss. Wenn der Timer 5 stehenbleibt, wo macht das Programm dann weiter.
    Ich habe nach Timer1.Start() versucht in Label1 "ENDE" probiert, passiert aber nix.

    Die 4. Aussage unter dem Code trifft auf mich 100% zu !!
    Hilfe den Nichtwissenden :thumbsup:

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

    Der Timer ist ja eine zusätzliche Komponente, die eben neben dem sonstigen Programm eben nebenbei noch läuft. Das heißt, wenn der Timer auf Interval = 1000 steht, dann würde der folgende Code

    VB.NET-Quellcode

    1. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Timer1.Start()
    3. Label1.Text = "bla"
    4. End Sub

    zuzüglich dem Code aus Post#9, Z#9-13 den Timer starten und den Labeltext zu "bla" ändern. Der Timer wird nach 1 Sekunde den Labeltext auf 1 setzen, eine Sek. später auf 2., ... und nach insgesamt 4 Sekunden ist der Labeltext bei 4 und der Timer schaltet sich automatisch aus. Das war's. Was Du in der Zwischenzeit machst (Buttons drücken, Texte schreiben, was im mer Dein Programm sonst noch hergibt) wird dadurch nicht beeinflusst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    Wieder habe ich etwas dazugelernt. Alles verstanden aber noch nicht !
    Ich möchte mich hier noch einmal bei allen beteiligten ganz herzlich bedanken.
    Hilfe den Nichtwissenden :thumbsup:

    mindanao schrieb:

    Alles verstanden aber noch nicht !
    Dann liegt es an Dir zu fragen, wo das 5-Cent-Stück noch nicht gefallen ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«