Probleme mit mobileControlCreate „scroller“ und dynamischer ScrollArea

Startseite Foren Deutsches LiveCode-Forum Probleme mit mobileControlCreate „scroller“ und dynamischer ScrollArea

Ansicht von 0 Antwort-Themen
  • Autor
    Beiträge
    • #8573
      roland
      Teilnehmer

        Beim Start einer APP werden von einer SQLite-Datenbank Datensätze gelesen und für jeden Datensatz eine Group erzeugt.
        Die Groups werden untereinander auf Card 1 angeordnet (ca. 4 Groups sind sichtbar).

        Mit dem Plus-Zeichen auf der Header-Bar der Card 1 werden zur Laufzeit neue Datensätze angelegt.
        Das Programm wechselt dazu auf die Card 2, auf der die Daten eingegeben und mittels INSERT auf die Datenbank geschrieben werden. Ist der INSERT erfolgreich, werden die entsprechenden Groups angelegt und alphabetisch in die bereits vorhandenen Groups einsortiert. Die Höhe der ScrollArea wird also mit jeder neuen Group vergrößert, bzw. beim Löschen verkleinert.

        Da es in der Regel mehr Groups gibt, als auf der Card angezeigt werden können, wird mit ‚mobileControlCreate‘ ein Scroller erzeugt, mit dem man durch alle Groups scrollen kann.

        Nach dem Start der APP funktioniert der Scroller auch wie erwartet.

        Auch nach dem Anlegen eines neuen Datensatzes (also nach dem Hinzufügen einer neuen Group), funktioniert der Scroller; allerdings nur dann, wenn beim Anlegen die ersten 4 Groups auf der Card sichtbar sind.
        Scrollt man vor dem Hinzufügen einer neuen Group nach unten (z.B. zur letzten Group), wird die neue Group zwar angelegt, der Scrollbereich wird jedoch so nach unten verschoben, dass auf der Card unter Umständen gar nichts angezeigt wird; erst nach dem ’nach unten Scrollen‘ werden die ersten Groups wieder sichtbar.

        Beim Wechsel von der Card 2 auf die Card 1 wird der preOpenCard-Handler durchlaufen, wobei die Scroll-Area und die vScroll Property gesetzt werden. Das ist wahrscheinlich der Grund, dass der Scroller unter gewissen Voraussetzungen funktioniert (beim Start der APP und beim Anlegen, wenn die ersten Groups ganz oben in der ScrollArea sichtbar sind.)

        Das Löschen einer Group wird in der Card 1 durchgeführt, der preOpenCard -Handler der Card 1 wird also nicht durchlaufen. Daher funktioniert der Scroller nach dem Löschen nicht.

        Ich habe viel ausprobiert, z.B eigener Handler, der sowohl nach dem Anlegen als auch nach dem Löschen aufgerufen wird und die entsprechenden Rectangle-Werte für die ScrollArea und für die vScroll-Property übergibt, leider ohne Erfolg.

        Folgender Code wird auf der Card 1 verwendet:
        (kein Unterschied, ob preOpenCard oder OpenCard Handler verwendet wird)

        Vielleicht kann mir hierbei jemand helfen.
        Für einen guten Tipp wäre ich sehr dankbar.

        Danke,
        Roland.

        `local sScrollerID
        on OpenCard
        local tScrollerRect, tContentRect

        // Only create a scroller on a mobile device
        if environment() is not „mobile“ then exit OpenCard

        // Set the area of the scroller
        put the rect of group „grpContainer“ into tScrollerRect

        // Set the area of the content to be scrolled
        — put the left of group „grpScroll“, the top of group „grpScroll“,\
        — the right of group „grpScroll“, the formattedHeight of group „grpScroll“ \
        — into tContentRect
        put 0,0,(the formattedWidth of group „grpScroll“), \
        (the formattedHeight of group „grpScroll“) \
        into tContentRect

        // Create the scroller control
        mobileControlCreate „scroller“
        put the result into sScrollerID

        // Set the properties of the scroller
        mobileControlSet sScrollerID, „rect“, tScrollerRect
        mobileControlSet sScrollerID, „contentRect“, tContentRect
        mobileControlSet sScrollerID, „visible“, true
        mobileControlSet sScrollerID, „scrollingEnabled“, true
        mobileControlSet sScrollerID, „vIndicator“, false #true
        mobileControlSet sScrollerID, „vscroll“, 0
        #pass OpenCard
        end OpenCard

        on closeCard
        // Delete the scroller
        if environment() is not „mobile“ then exit closeCard
        mobileControlDelete sScrollerID
        end closeCard

        on scrollerDidScroll hOffset, vOffset
        // When the user scrolls move the displayed content
        set the vScroll of group „grpContainer“ to vOffset
        end scrollerDidScroll

    Ansicht von 0 Antwort-Themen
    • Du musst angemeldet sein, um auf dieses Thema antworten zu können.