ProgressWheel

Hallo Ihr Lieben

ich habe wieder mal eine (Einsteiger-) Frage.

Ich habe eine Methode die eine neue Datenbank erstellt. Bis die neue Datenbank erstellt ist, dauerte es einen kurzen Moment. Momentan hat man den Eindruck, das Programm würde nicht arbeiten. Darum wollte ich gerne vor dem Aufruf der Methode die “ProgressWheel” sichtbar schalten und nach dem die Datenbank erzeugt ist, wieder ausschalten.
Leider funktioniert das nicht. Folgendes habe ich Programmiert:

  • Beim Programmstart wird im Open-Event Handler folgernder Code ausgeführt:
    ProgressWheel1.Visible = False

  • Vor dem Aufruf der Methode wird folgender Code ausgeführt:
    ProgressWheel1.Visible = True
    db_erzeugen // die Methode db_erzeugen wird aufgerufen
    ProgressWheel1.Visible = False

Was muss ich machen, dass die ProgressWheel1 während dem ausführen der Methode angezeigt wird.

Bitte eine einfache Erklärung bzw. so erklären, dass ich es als Einsteiger verstehe.

Mit besten Grüßen und bleibt Gesund

Welche Datenbank verwendest Du? Wie sieht der Datenbank-Code aus? Verwendest Du einen Thread für den Datenbank-Code?

Ich kann mir vorstellen, was Du mit “funktioniert nicht” meinst. Dein Progress Wheel macht gar nichts.

Wahrscheinlich mußt Du Deinen Datenbank-Code in einen Thread machen. Progress Wheel anzeigen, Thread starten. Wenn der Thread fertig ist, sagst Du dem Progress Wheel, daß es sich verstecken soll.

Zwischen dem Zeichnen des Wheels und dem Erstellen der Datenbank vergeht zu wenig Zeit. Selbst wenn Du das Wheel sichtbar machen würdest, dann wartest und dann erst die Datenbank erstellst, würde das Wheel sich evtl. nicht bewegen da die UI während des Erstellens der Datenbank nicht aktualisiert wird, das ist der Moment in dem Deine App dann “einzufrieren” scheint.

Erstelle einen Thread im UI Editor und lege den Code der die Datenbank erstellt in diesen Thread. gebe dem Thread eine niedrige Prio (2-3).
Erstelle einen Timer in der UI der das Wheel wieder unsichtbar macht. Der RunMode des Timers sollte auf OFF stehen und die Period auf 0.

Jetzt kannst Du Dein Wheel sichtbar machen, dann den Thread starten. So bald der Thread seine Arbeit erledigt hat, startet dieser den Timer (mit RunMode SINGLE) der das Wheel wieder unsichtbar macht (und mehr falls erforderlich).

Warum einen Thread und einen Timer? Weil Du aus einem Thread direkt nicht die UI verändern darfst (das geschieht ausdrücklich im Main Thread in dem sämtlicher Code ausgeführt wird den Du nicht explizit in einen Thread legst) . Es geht noch eleganter; aber Du sagtest Einsteigerfreundlich. :slight_smile:

Noch ein Tipp: Versuche so wenig wie möglich in Open Events zu legen. Das kann im Extrem dafür sorgen das Fenster sich träge öffnen oder ähnliches. Wenn Du z.B. sehr viele Objekte in einem neuen Fenster basierend auf was auch immer ab Start “einstellen” musst, stelle diese Objekte z.B. schon im Xojo Editor auf Enabled = False oder Visible = False. Dann erstelle einen Timer im Fenster der im RunMode Single mit z.B. Period 250 startet. In diesem Timer stellst Du Deine Objekte im Fenster wie gewünscht ein und als letzten Schritt stellst Du die Objekte auf Enabled = True oder Visible = True. Das ist nicht sehr elegant, sorgt aber dafür das sich solch ein Fenster flott öffnet und kurz darauf einsatzbereit ist. :wink: