Zeit Hochzählen für Erstelltes Label

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von xX-Nick-Xx.

    Zeit Hochzählen für Erstelltes Label

    Moin Zusammen,

    Ich habe ein Label per Code erstellt dieses soll Hochgezählt werden (also ab 0 Hochzählen)
    Das ganze klappt auch bei dem 1. Label
    Sobald ich aber ein Zweites Label erstelle möchte ich das auch das Label ab 0 Hochzählt,
    Stattdessen übernimmt es die Zeit vom 1. Label.

    Wie löse ich dies das jedes Label für sich selbst Zählt?

    Aktueller Code: (Option Strict = True)

    VB.NET-Quellcode

    1. Private Sub EinsatzTime_Tick(sender As Object, e As EventArgs) Handles EinsatzTime.Tick
    2. For Each panel As Control In FlowLayoutPanel2.Controls
    3. For Each panelx As Control In panel.Controls
    4. ' For Each panelz As Control In panelx.Controls
    5. If panelx.Name.Contains("FolderLBL_Path") Then
    6. Static lSekTimer As Long
    7. ' sekundenweise hochzählen
    8. lSekTimer = lSekTimer + 1
    9. ' zu bereits vergangener Zeit die Sekunden hinzuzählen
    10. n = DateAdd("s", lSekTimer, dProgStart)
    11. panelx.Text = Format(n, "HHHH:mm:ss")
    12. End If
    13. Next
    14. ' Next
    15. Next
    16. End Sub


    Danke im Voraus
    Mfg Nick

    @xX-Nick-Xxnull
    Wie genau muss die Zeitmessung sein?

    Nimm doch statt Long-Ticks die Systemuhr. Das Hochzählen über den Timer ist bekanntlich sehr ungenau. Genau so kann das dann auch beim zweiten Label gehandhabt werden.


    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Public Class LabelCounter
    4. Private LabelInfo() As LabelInfos
    5. Private Sub Buttons_Click(sender As Object, e As EventArgs)
    6. Dim idx = Convert.ToInt32(DirectCast(sender, Button).Tag)
    7. Me.LabelInfo(idx).Enable = Not Me.LabelInfo(idx).Enable
    8. Me.LabelInfo(idx).Button.Text = If(Me.LabelInfo(idx).Enable, "Activate", "Inactive")
    9. If Me.LabelInfo(idx).Enable Then
    10. Me.LabelInfo(idx).StartTime = DateTime.Now
    11. End If
    12. End Sub
    13. Private Sub ButtonStopStart_Click(sender As Object, e As EventArgs) _
    14. Handles BtStart.Click, BtStop.Click
    15. Select Case True
    16. Case sender Is Me.BtStart
    17. Me.StartButton()
    18. Case sender Is Me.BtStop : Me.StopButton()
    19. End Select
    20. End Sub
    21. Private Sub NudLabels_ValueChanged(sender As Object, e As EventArgs) Handles NudLabels.ValueChanged
    22. Me.NewLabelList()
    23. End Sub
    24. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    25. For i = 0 To Me.LabelInfo.Length - 1
    26. If Me.LabelInfo(i).Enable Then
    27. Me.LabelInfo(i).Label.Text = (DateTime.Now - Me.LabelInfo(i).StartTime).ToString("hh\:mm\:ss")
    28. Me.LabelInfo(i).Label.Invalidate()
    29. End If
    30. Next
    31. Me.Invalidate()
    32. End Sub
    33. Private Sub StartButton()
    34. Me.BtStop.Enabled = True
    35. Me.BtStart.Enabled = False
    36. Me.NudLabels.ReadOnly = True
    37. If Not Me.CheckEnable() Then Return
    38. Dim now = DateTime.Now
    39. For i = 0 To Me.LabelInfo.Length - 1
    40. If Me.LabelInfo(i).Enable Then
    41. Me.LabelInfo(i).StartTime = now
    42. End If
    43. Next
    44. Me.TimerActivate(True)
    45. End Sub
    46. Private Sub StopButton()
    47. Me.BtStop.Enabled = False
    48. Me.BtStart.Enabled = True
    49. Me.NudLabels.ReadOnly = False
    50. Me.TimerActivate(False)
    51. End Sub
    52. Private Sub TimerActivate(activate As Boolean)
    53. If activate Then
    54. Me.Timer1 = New Timer With {
    55. .Interval = 101
    56. }
    57. Me.Timer1.Start()
    58. Me.Timer1.Enabled = True
    59. Return
    60. End If
    61. Me.Timer1.Stop()
    62. Me.Timer1.Enabled = False
    63. Me.Timer1 = Nothing
    64. End Sub
    65. Private Function CheckEnable() As Boolean
    66. For i = 0 To Me.LabelInfo.Length - 1
    67. If Me.LabelInfo(i).Enable Then Return True
    68. Next
    69. Return False
    70. End Function
    71. Private Sub NewLabelList()
    72. Me.LabelListDispose()
    73. Me.SuspendLayout()
    74. Dim size = Convert.ToInt32(Me.NudLabels.Value)
    75. Me.LabelInfo = New LabelInfos(size - 1) {}
    76. For i = 0 To Me.LabelInfo.Length - 1
    77. 'Me.Index = i
    78. Me.LabelInfo(i) = New LabelInfos With {
    79. .Button = Me.ToNewButton(i),
    80. .Label = Me.ToNewLabel(i),
    81. .Enable = False
    82. }
    83. AddHandler Me.LabelInfo(i).Button.Click, AddressOf Me.Buttons_Click
    84. Me.Controls.Add(Me.LabelInfo(i).Label)
    85. Me.Controls.Add(Me.LabelInfo(i).Button)
    86. Next
    87. Me.LabelInfo(0).Button.Text = "Activate"
    88. Me.LabelInfo(0).Enable = True
    89. Me.BtStop.Enabled = False
    90. Me.ResumeLayout()
    91. End Sub
    92. Private Sub LabelListDispose()
    93. If Me.LabelInfo Is Nothing Then Return
    94. For i = 0 To Me.LabelInfo.Length - 1
    95. Me.LabelInfo(i).Label.Dispose()
    96. Me.LabelInfo(i).Button.Dispose()
    97. Next
    98. Me.LabelInfo = Nothing
    99. End Sub
    100. Function ToNewLabel(idx As Int32) As Label
    101. 'Dim x = Me.LabelInfo(idx).Button.Location.X
    102. Return New Label With
    103. {
    104. .Text = "00:00:00",
    105. .Name = "Lb" & idx.ToString,
    106. .Location = New Point(15, idx * (22 + 16) + 90),
    107. .Size = New Size(90, 22),
    108. .TabIndex = 4 + idx
    109. }
    110. End Function
    111. Function ToNewButton(idx As Int32) As Button
    112. Return New Button With
    113. {
    114. .Text = "Inactive",
    115. .Name = "Btn" & idx.ToString,
    116. .Location = New Point(111, idx * (33 + 5) + 85),
    117. .Size = New Size(95, 33),
    118. .TabIndex = 4 + idx,
    119. .Tag = idx,
    120. .UseVisualStyleBackColor = True
    121. }
    122. End Function
    123. Public Sub New()
    124. Me.InitializeComponent()
    125. End Sub
    126. Private Class LabelInfos
    127. Public Button As Button
    128. Public Label As Label = Nothing
    129. Public Enable As Boolean = False
    130. Public StartTime As DateTime = Nothing
    131. End Class
    132. End Class



    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Die Idee mit dem Timer hatte ich jetzt auch schon, diese werden jetzt auch per Code Erstellt.

    Jetzt ist das Problem aber das die beiden Timer die selbe Variable Nutzt
    ne Idee dafür?

    VB.NET-Quellcode

    1. Dim dProgStartx As Date
    2. Dim n As Date
    3. Static lSekTimer As Long
    4. ' sekundenweise hochzählen
    5. lSekTimer = lSekTimer + 1
    6. ' zu bereits vergangener Zeit die Sekunden hinzuzählen
    7. n = DateAdd("s", lSekTimer, dProgStartx)
    8. ' auf dem Label aktuell die vergangene Zeit seit Programmstart anzeigen
    9. ' .Text = "Aktivität für den Monat " & DateTime.Now.ToString("MMMM")
    10. panelx.Text = Format(n, "HHHH:mm:ss")

    Also n,dProgStartx, lSekTimer, etc.

    Da müsste ich noch ein paar Infos mehr haben.

    Sobald das Label 2 hinzugezogen wird, wird von 0 hochgezählt.
    Wird das zweite Label synchron zum Label 1 hochgezählt? Dann reicht 1 Variable. Der Wert in Label 2 wäre dann immer die Differenz des Wertes in Label 1, ab dem Zeitpunkt wo es hinzugeschaltet wird.

    Freundliche Grüsse

    exc-jdbi

    exc-jdbi schrieb:

    wird von 0 hochgezählt.
    sobald Label 2 hinzugefügt wird zählt das Label die gleiche Zeit wie Label 1, fängt also nicht bei 0 an sondern bei der Zeit von Label1 (Was es ja nicht soll)

    Die Label sollen beide ab dem Zeitpunkt Hochzählen ab dem sie hinzugefügt wurden.
    Nur zur Info: Die Label werden beide per Code erstellt. Label1 und 2 sind nur Beispiele, das ganze kann auch bis 99 gehen


    Aktueller Code

    VB.NET-Quellcode

    1. Private Sub Timer_Tick(ByVal sender As clsTimer)
    2. For Each panel As Control In FlowLayoutPanel2.Controls
    3. For Each panelx As Control In panel.Controls
    4. Dim st() As String = sender.TimerName.Split("_")
    5. Dim st1() As String = panelx.Name.Split("_")
    6. If st1(0) = st(0) Then
    7. If panelx.Name.Contains("FolderLBL_Path") Then
    8. Dim dProgStartx As Date
    9. Dim n As Date
    10. Static lSekTimer As Long
    11. ' sekundenweise hochzählen
    12. lSekTimer = lSekTimer + 1
    13. ' zu bereits vergangener Zeit die Sekunden hinzuzählen
    14. n = DateAdd("s", lSekTimer, dProgStartx)
    15. ' auf dem Label aktuell die vergangene Zeit seit Programmstart anzeigen
    16. ' .Text = "Aktivität für den Monat " & DateTime.Now.ToString("MMMM")
    17. panelx.Text = Format(n, "HHHH:mm:ss")
    18. End If
    19. End If
    20. Next
    21. ' Next
    22. Next
    23. End Sub

    Dann kannste aber keine Static-Variable nutzen. Die wird ja klassenweit einmalig verwendet.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann wär es sinnvoll, entweder ein UserControl zu machen, welches das Label und die Zeit als Variable enthält oder Du machst Dir ein Speziallabel, welches von Label erbt und zusätzlich die Zeitvariable enthält. Oder notfalls ein Label-Zeitvariablen-Klassenpaket.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. Friend Class MyLabel : Inherits Label
    2. Property TimerCounter As Integer
    3. End Class

    kopilieren und dann kannst Du das MyLabel erzeugen wie ein normales Label und dann eben im Timer_Tick die MyLabel-Property TimerCounter hochzählen. Denn dann hat jede MyLabel-Instanz seinen eigenen Counter.

    Wobei mir einfällt: Das lässt sich eigentlich auch mit normalen Labels machen: Du kannst nämlich die Tag-Property des Labels nutzen, um da Deinen TimerCounter reinzuzimmern. Da Tag allerdings vom Typ Object ist, musste immer casten. Wie Du lustig bist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @xX-Nick-Xx Du kannst auch ein Tuple(Of Label, Integer) machen. In .Item1 das Label, in .Item2 der Wert.
    docs.microsoft.com/de-de/dotne…uiltin-types/value-tuples
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Auch das Dictionary( Of Label, Integer) würde sich anbieten. Denke aber, die Tag Property des Labels ist die einfachste Lösung.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen