German Sanduhr, drehender Kreis, Information für den User

umsid

Member
Licensed User
Longtime User
Hallo Leute,
ich suche jetzt schon eine ganze Weile im Forum, vielleicht bin ich zu blöd, die richtigen Suchbegriffe zu verwenden.

Ich möchte, wenn eine Funktion in der App etwas länger dauert (Einlesen von Daten aus dem Internet und schreiben in die SQL Datenbank) dem User eine Info geben.
In machen apps kommt dann ein kleines Fenster mit einem Kreis, der sich dreht und einem Text daneben, in dem man sieht, was die App gerade macht.

z.B. Lade aus dem Internet
Generiere Datensatz u.s.w.

Diese Meldung verschwindet auch wieder, wenn die Funktion abgearbeitet ist.

Geht so was in B4A, falls ja, wie?

vg
Guenter
 

DonManfred

Expert
Licensed User
Longtime User
B4X:
ProgressDialogShow("lalala")
' hier deine arbeit...  Achtung: ab und an das System den job überlassen damit ein redraw erfolgen kann....
[...]
ProgressDialogHide
?
 

umsid

Member
Licensed User
Longtime User
Hallo Manfred,
erst einmal Danke für die schnelle Antwort.
Aber irgendwie sitze ich zur Zeit auf der Leitung.

Ich habe ein kleines Programm gemacht, bei dem 500 Einträge in ein Scrollview gemacht werden.
das erste Problem ist, dass der Timer eigentlich nach jedem Eintrag warten soll, damit der ProgressDialog sichtbar wird.
Selbst, wenn ich den Timer auf 50000 stelle - das sollten 50 sek sein, dann geht es immer noch raz faz :-(
Und mein ProgressDialog wird nicht angezeigt.

in der Anlage mal das Test Zipfile.

Vielleicht kommst Du auf den Fehler ;-)

vg
Guenter
 

Attachments

  • Testen_gf.zip
    8.4 KB · Views: 285

JOTHA

Well-Known Member
Licensed User
Longtime User

Attachments

  • Testen_gf_mit_Sanduhr.zip
    8.4 KB · Views: 285
  • Testen_gf_mit_Sanduhr_2.zip
    8.4 KB · Views: 260
Last edited:

umsid

Member
Licensed User
Longtime User
erst einmal herzlichen Dank.

allerdings gibt es da noch ein paar Wehwehchen:
1. das B4a meldet "DoEvents sind veraltet, verwende stattdessen sleep(0) falls wirklich benötigt"
Es ist nicht so sehr zufriedenstellend, mit so einer Warnung zu leben, wenn man anfängt B4a zu lernen

2. Die Timerfunktion, die ja immer 50 sek warten sollte wartet auch nicht.

Ist zwar jetzt eine Lösung, aber keine zufriedenstellende.

Guenter
 

JOTHA

Well-Known Member
Licensed User
Longtime User
... am Ende von deinem Code erscheint eine Fehlermeldung.

Diese wird behoben durch folgende Sub:
B4X:
Sub timer1_tick
    ProgressDialogHide
    Timer1.Enabled = False
End Sub

... neue ZIP-Datei ist angehängt.
 

Attachments

  • Testen_gf_mit_Sanduhr_3.zip
    8.4 KB · Views: 283

JOTHA

Well-Known Member
Licensed User
Longtime User
1. Ich weiß: "doEvents" ist deprecatet = veraltet ... funktioniert aber dennoch ...
2. Ich habe den Timer auf 5 Sekunden gestellt (wie schon oben erwähnt), Du musst ihn also wieder auf 50000 stellen, wenn Du 50 Sekunden haben willst.
 

umsid

Member
Licensed User
Longtime User
ich habe das jetzt mit sleep(0) gelöst.
Sleep(1000) wartet auch eine Sekunde.
Das mit dem Timer sehe ich mir gleich an.

Danke nochmal.
Guenter
 

JOTHA

Well-Known Member
Licensed User
Longtime User
Ja, ich weiß das ...
Ich habe allerdings keine B4A-Version ab 7.0, sondern arbeite noch mit 6.3 :oops:
--> daher erfolgt bei mir auch kein Hinweis auf "DoEvents = deprecated".
 

DonManfred

Expert
Licensed User
Longtime User
Ungefähr so...
B4X:
Sub FillScrollView As ResumableSub
    Private i As Int
    Private lblheight=30dip As Int
  
    For i = 0 To 5000
       Private lbl As Label
       lbl.Initialize("lbl")
       ScrollView1.Panel.AddView(lbl, 0, i*lblheight, 100%x-20dip, lblheight-1dip)
       lbl.color=Colors.Blue
       lbl.TextColor=Colors.White
       lbl.Text="Test " & i
       lbl.Tag=i
       'timer1.Initialize("Timer1",50000)
        'timer1.Enabled=True
        If i Mod 500 = 0 Then Sleep(0) ' Dem System Zeit zum refresh geben alle 500 iterationen
    Next
    ScrollView1.Panel.Height=i*lblheight
    Return i
End Sub

Sub Button1_Click
    Dim cs As CSBuilder
    cs.Initialize.Bold.Size(20).Append("Synchronizing with cloud").Pop.Pop
    cs.Append(CRLF).Append("This may take a moment To complete.")
    ProgressDialogShow2(cs, False)
    Sleep(300)
    Wait For(FillScrollView) Complete (Result As Int)
    ProgressDialogHide
End Sub

PS: Was du da vorhattest mit dem Timer ist mir nicht klar. Warum initialisierst Du 5000 mal den timer und startest ihn dann?
Aber auf den Timer tick warten tust Du nicht....
Merke. Der Timer startet eigentlich erst in der 5000. iteration deiner Schleife. Denk mal drüber nach was du da machst
 

Attachments

  • testenneu.zip
    8.5 KB · Views: 268
Top