German Button werden graphisch nicht aktualisiert - bleiben als gedrückt hängen

Petrus

Member
Licensed User
Longtime User
Hallo Leute, allen ein frohes Osterfest!

Ich hänge in meinem Projekt an einem Problem fest, das ich mit dem nachfolgenden Beispiel verdeutlichen möchte. Eine Zahl wird über zwei Button hoch- bzw. runtergezählt:
button01.png


Wird ein Button länger gedrückt, so startet ein Timer, der automatisch weiter zählt. Lasse ich den Button danach wieder los, so wird in der Sub ButtonHochRunter_Up der entsprechende Button gesperrt, falls Null oder der Maximalwert erreicht ist. Das Problem ist, dass der Button in diesem Fall in gedrückter Form verharrt:
button02.png


Ich habe es schon mit DoEvents und mit Invalidate versucht - beides bringt aber nichts. Kann mir da jemand weiterhelfen?

Hier der Code:
B4X:
Sub ButtonHochRunter_Up

   Timer1.Enabled = False
   
   DoEvents                ' bringt nichts!
   ButtonRunter.Invalidate ' bringt nichts!
   ButtonHoch.Invalidate   ' bringt nichts!
   
   If Zahl < 1 Then ButtonRunter.Enabled = False Else ButtonRunter.Enabled = True
   If Zahl < ZahlMax Then ButtonHoch.Enabled = True Else ButtonHoch.Enabled = False
   
End Sub

und hier noch mal das gesamte Beispiel:
B4X:
'Activity module
Sub Process_Globals
   Dim Timer1 As Timer
   Timer1.Initialize("Timer1", 100)
   Dim Zahl, ZahlMax As Int
   Dim TimerArt As String
   
End Sub

Sub Globals
   Dim ButtonHoch, ButtonRunter As Button
   Dim Label1 As Label

End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("Layout01")   'Controls laden
   Zahl = 0
   ZahlMax = 10
   Label1.Text = Zahl
   ButtonRunter.Enabled = False
End Sub

Sub Timer1_Tick()
   Select TimerArt
   Case "Hoch"
      If Zahl < ZahlMax Then
         Zahl = Zahl +1
         Label1.Text = Zahl
      End If      
   Case "Runter"
      If Zahl > 0 Then
         Zahl = Zahl -1
         Label1.Text = Zahl
      End If      
   End Select
End Sub

Sub ButtonHochRunter_Up
   Timer1.Enabled = False
   
   DoEvents                ' bringt nichts!
   ButtonRunter.Invalidate ' bringt nichts!
   ButtonHoch.Invalidate   ' bringt nichts!
   
   If Zahl < 1 Then ButtonRunter.Enabled = False Else ButtonRunter.Enabled = True
   If Zahl < ZahlMax Then ButtonHoch.Enabled = True Else ButtonHoch.Enabled = False
End Sub

Sub ButtonHochRunter_LongClick
   Dim B As Button
   B = Sender
   
   TimerArt = B.Tag
   Timer1.Enabled = True
   
End Sub

Sub ButtonHochRunter_Click
   Dim B As Button
   B = Sender
   Dim x As Int
   
   Select B.Tag
   Case "Hoch"
      If Zahl < ZahlMax Then
         Zahl = Zahl +1
         Label1.Text = Zahl
      End If      
   
   Case "Runter"
      If Zahl > 0 Then
         Zahl = Zahl -1
         Label1.Text = Zahl
      End If      
      
   End Select
   
   If Zahl < 1 Then ButtonRunter.Enabled = False Else ButtonRunter.Enabled = True
   If Zahl < ZahlMax Then ButtonHoch.Enabled = True Else ButtonHoch.Enabled = False
End Sub
 

klaus

Expert
Licensed User
Longtime User
Beiliegend ein Programm das funktioniert.
B4X:
Sub Process_Globals
    Dim Timer1, Timer2 As Timer
    Timer1.Initialize("Timer1", 100)
    Timer2.Initialize("Timer2", 20)
    Dim Zahl, ZahlMax As Int
    Dim TimerArt As String
End Sub

Sub Globals
    Dim ButtonHoch, ButtonRunter As Button
    Dim Label1 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout01")   'Controls laden
    Zahl = 0
    ZahlMax = 10
    Label1.Text = Zahl
    ButtonRunter.Enabled = False
End Sub

Sub Timer1_Tick()
    Select TimerArt
    Case "Hoch"
        If Zahl < ZahlMax Then
            Zahl = Zahl +1
            Label1.Text = Zahl
            If Zahl >= ZahlMax Then
                Timer1.Enabled = False
            End If
        End If        
    Case "Runter"
        If Zahl > 0 Then
            Zahl = Zahl -1
            Label1.Text = Zahl
            If Zahl < 1 Then
                Timer1.Enabled = False
            End If
        End If        
    End Select
    If Zahl > 0 Then ButtonRunter.Enabled = True
    If Zahl < ZahlMax Then ButtonHoch.Enabled = True
End Sub

Sub Timer2_Tick()
    Timer2.Enabled = False

    If Zahl < 1 Then ButtonRunter.Enabled = False Else ButtonRunter.Enabled = True
    If Zahl < ZahlMax Then ButtonHoch.Enabled = True Else ButtonHoch.Enabled = False
End Sub

Sub ButtonHochRunter_Up
    Timer1.Enabled = False
    Timer2.Enabled = True
End Sub

Sub ButtonHochRunter_LongClick
    Dim B As Button
    B = Sender
    
    TimerArt = B.Tag
    Timer1.Enabled = True
End Sub

Sub ButtonHochRunter_Click
    Dim B As Button
    B = Sender
    Dim x As Int
    
    Select B.Tag
    Case "Hoch"
        If Zahl < ZahlMax Then
            Zahl = Zahl +1
            Label1.Text = Zahl
        End If        
    Case "Runter"
        If Zahl > 0 Then
            Zahl = Zahl -1
            Label1.Text = Zahl
        End If        
    End Select
End Sub
Das Betriebssystem braucht 'etwas' Zeit um die Buttongrafik zu ändern.
Wenn ein Button.Enabled auf False gesetzt wurde bevor das Button_Up event fertig ist bleibt der Button im pressed Zustand.
Mit einem zweiten Timer geht es.

Beste Grüsse.
 

Attachments

  • Buttons.zip
    6.4 KB · Views: 149

Petrus

Member
Licensed User
Longtime User
Hallo Klaus,

vielen Dank für die schnelle Hilfe - es funktioniert einwandfrei!:)

Viele Grüße
Peter
 
Top