German Seekbar Positionierung beendet erkennen

strupp01

Active Member
Licensed User
Longtime User
ich habe ein Programm mit großer SQL-Datenbank und möchte Daten für einzelne Tage des Monats über eine Seekbar auslesen und grafisch Darstellen lassen.
Wenn ich die Seekbar bewege, so wird auf die Programmzeile

Sub Hbar_ValueChanged(Value As Int, UserChanged As Boolean)
Log("H " & Value& " " & UserChanged)

Daten_sammeln_anzeigen
End Sub


zugegriffen. Es würde sofort Daten_sammeln_anzeigen abgearbeitet werden, obwohl die Endposition des Verschieben noch nicht erreicht ist.. Dies hat zur Auswirkung, dass mehrmals die Sub Sub Hbar_ValueChanged(Value As Int, UserChanged As Boolean) aufgerufen und somit erneut das Sammeln und Anzeigen von Daten erfolgt. Da dieses Sammeln und Anzeigen sehr lange dauert möchte ich dies erst bei erreichen der endgültigen Schieberposition anstoßen, so dass es nur einmal aufgerufen wird. Geht das ? Und wenn ja wie ?

gruß strupp01
 

strupp01

Active Member
Licensed User
Longtime User
Hallo Alexander,
Die Seekbar hat als Max die Tage eines Monats hinterlegt. Also 30 oder 31. Wenn ich jetzt den Schieber von Tag 30 nach links verschiebe nach ca Tag 20, so reagiert der SUB-Aufruf schon vorher und das sammeln der Daten beginnt. Das will ich nicht, da dies mehrmals bei einem verschieben erfolgt
 

Alexander Stolte

Expert
Licensed User
Longtime User
Dann Hole mit DateUtils die Anzahl an Tagen für diesen Monat und verwende das für die Prüfung ob der Schiebe-Regler an seiner Max Position ist,
B4X:
If Value = DateUtils.NumberOfDaysInMonth(6,2023) Then
 

William Lancee

Well-Known Member
Licensed User
Longtime User
B4X:
Private Sub B4XSeekBar1_TouchStateChanged (Pressed As Boolean)
    'if Pressed is False you have released the mouse button
    'Wenn „Pressed“ den Wert „False“ hat, haben Sie die Maustaste losgelassen
End Sub
 

strupp01

Active Member
Licensed User
Longtime User
ich habe ein Beispiel. Meine Seekbar ist auf max 150 eingestellt. der aufruf beim verschieben sieht wie folgt aus

Sub barH1_ValueChanged(Value As Int)
labelBarH1.Text = "H1: " & Value
Log("Value = " & Value)
End Sub

Wenn ich jetzt den Schieber bewege wird dieser Aufruf mehrmals durchgeführt. Siehe dieses Log-Protokoll
1688994390483.png

Da ich nicht weiß, auf welche Position ich genau verschiebe, kann ich auch nicht darauf abfragen. Es ist ein Schieberegler ohne scala. Somit muss ich warten bis er die Position, in diesm Fall 111 erreicht hat. Es gibt aber keine Abfrage, wann ist Schieberegler Position erreicht.
 

strupp01

Active Member
Licensed User
Longtime User
Hallo William,
aber auch diese Sub wird mehrmals durchlaufen. Wann weiß ich, dass es das letzte mal ist ?
 

William Lancee

Well-Known Member
Licensed User
Longtime User
Dieses Ereignis wird nur ausgelöst, wenn die Maus losgelassen und dann gedrückt wird = false
 

strupp01

Active Member
Licensed User
Longtime User
Danke an alle. Habe gerade die sub von William ausprobiert. Über den Eintrag Action und Case panelTouch.ACTION_UP kann man dies abfragen. Klaus, deine Anwort werde ich mir ansehen.

Private Sub panelTouch_Touch(Action As Int, X As Float, Y As Float) As Boolean

Select Action

Case panelTouch.ACTION_DOWN
cursor.Background = cdCursorPressed
Log("gepresst")
Case panelTouch.ACTION_UP
cursor.Background = cdCursor
Log("losgelassen")
End Select


Problem gelößt.

Gruß strupp01
 

DonManfred

Expert
Licensed User
Longtime User
Code aus B4XMainpage

B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    Private B4XSeekBar1 As B4XSeekBar
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
End Sub

'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage.

Private Sub Button1_Click
    xui.MsgboxAsync("Hello world!", "B4X")
End Sub

Private Sub B4XSeekBar1_TouchStateChanged (Pressed As Boolean)
    If Pressed = False Then
        Log($"Value set to ${B4XSeekBar1.Value}"$) ' Wird nur EINMAL beim setzen der neuen Position (loslassen) gesetzt...
    End If
End Sub
 

strupp01

Active Member
Licensed User
Longtime User
Danke DonManfred für das Beispiel. Probiere das in mein programm umzusetzen.
Gruß strupp01
 

strupp01

Active Member
Licensed User
Longtime User
Kann ich diese B4XSeekbar auch während der Laufzeit auf einem Panel installieren. Wenn ja wie?
Finde keine Beispiele.
 

DonManfred

Expert
Licensed User
Longtime User
 

b4x-de

Active Member
Licensed User
Longtime User
Alternatives Beispiel ist die PreoptimizedCLV. Sie ergänzt die CustomListView um einen B4XSeekBar für das schnelle Scrollen in großen Datensätzen:
 
Top