Problem mit mobile Scroller

Startseite Foren Deutsches LiveCode-Forum Problem mit mobile Scroller

Ansicht von 8 Antwort-Themen
  • Autor
    Beiträge
    • #8471
      wfr
      Teilnehmer

        Hallo,
        Mich nervt ein Problem mit dem mobile Scroller (Android).
        Ich habe einen Stack (stack1) und 2 Substacks (stack2 und stack3).
        Vom Stack1 springe ich mittels Button jeweils auf stack2 (mit der card “b1”) bzw. auf den stack3 (mit der card “c1”).
        Auf der card b1 und auf der card c1 ist jeweils ein Textfeld mit einem mobilen Scroller, die prinzipiell auch funktionieren. Springe ich zB. auf card b1, kann ich scrollen, gehe ich zurück auf stack1 und springe dann auf die card c1, funktioniert der Scroller dort nicht.
        Beende ich das Programm, und mache es umgekehrt, also ich gehe zuerst auf card c1, funktioniert der Scroller, aber dann geht der auf card b1 nicht.

        on preOpenCard
           global sScrollerID
           global tScrollerRect, tContentRect, vOffset
           BewegeScroller
        end preOpenCard

        Der Code, der sich jeweils im Stack2 und Stack3 befindet:

        global sScrollerID
        global tScrollerRect, tContentRect, vOffset
        
        on BewegeScroller
        // Only create a scroller on a mobile device
        if environment() is not "mobile" then exit BewegeScroller
        put the rect of group "scrollArea" into tScrollerRect
        put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
        // Create the scroller control
        mobileControlCreate "scroller", "scroller"
        put the result into ssScrollerID
        // Set the properties of the scroller
        mobileControlSet "scroller", "rect", tScrollerRect
        mobileControlSet "scroller", "contentRect", tContentRect
        mobileControlSet "scroller", "visible", true
        mobileControlSet "scroller", "scrollingEnabled", true
        mobileControlSet "scroller", "vIndicator", true
        mobileControlSet "scroller", "vscroll", 0   
        end BewegeScroller
        
        on scrollerDidScroll hOffset, vOffset
           // When the user scrolls move the displayed content
           set the vScroll of group "scrollArea" to vOffset
        end scrollerDidScroll

        Ich hoffe, ihr könnt mit weiterhelfen.
        Danke
        Walter

      • #8473
        Klaus Major
        Administrator

          Hallo Walter,

          verstehe ich das rihtig, Du benutzt EINEN (den selben) Scroller in verschiedenen Stacks?
          Falls ja, ist das wohl keine allzu gelungene Idee, wie Du festgestellt hast.

          Alle Entwickler, die ich kenne, inklusive der Schotten (LC) selber, löschen den Scroller, wenn die Karte/Stack verlassen wird und erstellen ihn wieder neu bei Bedarf.

          Gruß

          Klaus

        • #8474
          wfr
          Teilnehmer

            Hallo Klaus,

            Das Löschen des Scrollers hatte ich auch schon eingebaut. Habe den Scrollern auch verschiedene Namen gegeben. Jetzt funktioniert genau 1x den Stack wechseln. Dann nicht mehr. Hier nochmal der gesamte Code:

            Stack2 / Card b1:

            on preOpenCard
               global sScrollerID
               global tScrollerRect, tContentRect, vOffset
               BewegeScroller
            end preOpenCard
            
            on closeCard
               // Delete the scroller
               global sScrollerID
            if environment() is not "mobile" then exit closeCard
            mobileControlDelete sScrollerID
            end closeCard

            Stack2:

            global sScrollerID
            global tScrollerRect, tContentRect, vOffset
            
            on BewegeScroller
               // Only create a scroller on a mobile device
               if environment() is not "mobile" then exit BewegeScroller
               put the rect of group "scrollArea" into tScrollerRect
               put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
               // Create the scroller control
               mobileControlCreate "scroller", "my_scroller1"
               put the result into ssScrollerID
               // Set the properties of the scroller
               mobileControlSet "my_scroller1", "rect", tScrollerRect
               mobileControlSet "my_scroller1", "contentRect", tContentRect
               mobileControlSet "my_scroller1", "visible", true
               mobileControlSet "my_scroller1", "scrollingEnabled", true
               mobileControlSet "my_scroller1", "vIndicator", true
               mobileControlSet "my_scroller1", "vscroll", 0   
            end BewegeScroller
            
            on scrollerDidScroll hOffset, vOffset
               // When the user scrolls move the displayed content
               set the vScroll of group "scrollArea" to vOffset
            end scrollerDidScroll

            Stack3 / card c1:

            on preOpenCard
               global sScrollerID
               global tScrollerRect, tContentRect, vOffset
               BewegeScroller
            end preOpenCard
            
            on closeCard
               // Delete the scroller
               global sScrollerID
               if environment() is not "mobile" then exit closeCard
               mobileControlDelete sScrollerID
            end closeCard

            Stack3:

            global sScrollerID
            global tScrollerRect, tContentRect, vOffset
            
            on BewegeScroller
               // Only create a scroller on a mobile device
               if environment() is not "mobile" then exit BewegeScroller
               put the rect of group "scrollArea" into tScrollerRect
               put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
               // Create the scroller control
               mobileControlCreate "scroller", "myscroller_2"
               put the result into ssScrollerID
               // Set the properties of the scroller
               mobileControlSet "myscroller_2", "rect", tScrollerRect
               mobileControlSet "myscroller_2", "contentRect", tContentRect
               mobileControlSet "myscroller_2", "visible", true
               mobileControlSet "myscroller_2", "scrollingEnabled", true
               mobileControlSet "myscroller_2", "vIndicator", true
               mobileControlSet "myscroller_2", "vscroll", 0   
            end BewegeScroller
            
            on scrollerDidScroll hOffset, vOffset
               // When the user scrolls move the displayed content
               set the vScroll of group "scrollArea" to vOffset
            end scrollerDidScroll

            Danke
            Walter

          • #8475
            Klaus Major
            Administrator

              Die Skripte sehen gut aus, keine Ahnung, was da schief läuft.

              Du hast eine globale Variable namens vOffset, benutzt aber im Handler “on scrollerdidscroll” einen Parameter gleichen Namens. Muss nichts bedeuten, aber wer weiß…

              Ausserdem würde ich mal versuchen, sSCrollerID als LOKALE Variable pro Stack zu benutzen.

              Aber wie gesagt, alles Schüsse ins Blaue…

            • #8478
              wfr
              Teilnehmer

                Habe den Code umgebaut, aber hat nichts geändert.

                Stack2, card b1:

                on preOpenCard
                   local sScrollerID
                   local tScrollerRect, tContentRect
                   // Only create a scroller on a mobile device
                   if environment() is not "mobile" then exit preOpenCard
                   put the rect of group "scrollArea" into tScrollerRect
                   put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
                   // Create the scroller control
                   mobileControlCreate "scroller", "my_scroller1"
                   put the result into ssScrollerID
                   // Set the properties of the scroller
                   mobileControlSet "my_scroller1", "rect", tScrollerRect
                   mobileControlSet "my_scroller1", "contentRect", tContentRect
                   mobileControlSet "my_scroller1", "visible", true
                   mobileControlSet "my_scroller1", "scrollingEnabled", true
                   mobileControlSet "my_scroller1", "vIndicator", true
                   mobileControlSet "my_scroller1", "vscroll", 0   
                end preOpenCard
                
                on closeCard
                   // Delete the scroller
                   global sScrollerID
                if environment() is not "mobile" then exit closeCard
                mobileControlDelete sScrollerID
                end closeCard

                Stack2:

                on scrollerDidScroll hOffset, vOffset
                   // When the user scrolls move the displayed content
                   set the vScroll of group "scrollArea" to vOffset
                end scrollerDidScroll

                Stack3, card c1:

                on preOpenCard
                   local sScrollerID
                   local tScrollerRect, tContentRect, vOffset
                   // Only create a scroller on a mobile device
                   if environment() is not "mobile" then exit preOpenCard
                   put the rect of group "scrollArea" into tScrollerRect
                   put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
                   // Create the scroller control
                   mobileControlCreate "scroller", "myscroller_2"
                   put the result into ssScrollerID
                   // Set the properties of the scroller
                   mobileControlSet "myscroller_2", "rect", tScrollerRect
                   mobileControlSet "myscroller_2", "contentRect", tContentRect
                   mobileControlSet "myscroller_2", "visible", true
                   mobileControlSet "myscroller_2", "scrollingEnabled", true
                   mobileControlSet "myscroller_2", "vIndicator", true
                   mobileControlSet "myscroller_2", "vscroll", 0   
                end preOpenCard
                
                on closeCard
                   // Delete the scroller
                   global sScrollerID
                   if environment() is not "mobile" then exit closeCard
                   mobileControlDelete sScrollerID
                end closeCard

                Stack3:

                on scrollerDidScroll hOffset, vOffset
                   // When the user scrolls move the displayed content
                   set the vScroll of group "scrollArea" to vOffset
                end scrollerDidScroll

                Ich beschreibe nochmals das Szenario:
                – ich starte das Programm
                – ich springe von stack1 auf stack2 —> scroller funktioniert!
                – ich springe zurück zu stack1
                – ich springe von stack1 auf stack3 —> scroller funktioniert!
                – ich springe zurück zu stack1
                – ich springe von stack1 auf stack2 —-> scroller funktioniert nicht mehr!

                echt mysteriös….

              • #8479
                Klaus Major
                Administrator

                  Hm, Du hast einmal sScrollerID als Lokal und einmal als Global definiert, bitte entscheide Dich. 🙂

                  Globale/Lokale Variablen deklariert man am Besten ÜBER allen Handlern im Skript, so kann auch jeder Handler darauf zugreifen:
                  Stack2, card b1:

                  local sScrollerID, tScrollerRect, tContentRect
                  
                  on preOpenCard
                     local sScrollerID
                     local tScrollerRect, tContentRect
                     // Only create a scroller on a mobile device
                     if environment() is not "mobile" then exit preOpenCard
                     put the rect of group "scrollArea" into tScrollerRect
                     put 0,0,(the formattedWidth of group "scrollArea"),(the formattedHeight of group "scrollArea") into tContentRect
                     // Create the scroller control
                     mobileControlCreate "scroller", "my_scroller1"
                     put the result into ssScrollerID
                     // Set the properties of the scroller
                     mobileControlSet "my_scroller1", "rect", tScrollerRect
                     mobileControlSet "my_scroller1", "contentRect", tContentRect
                     mobileControlSet "my_scroller1", "visible", true
                     mobileControlSet "my_scroller1", "scrollingEnabled", true
                     mobileControlSet "my_scroller1", "vIndicator", true
                     mobileControlSet "my_scroller1", "vscroll", 0   
                  end preOpenCard
                  
                  on closeCard
                     // Delete the scroller
                     ## Ist aber LOKAL deklariert!
                     ## global sScrollerID
                     if environment() is not "mobile" then exit closeCard
                     mobileControlDelete sScrollerID
                  end closeCard

                  Dito für: Stack3, card c1:

                  Und Dein Stack2 hat kein Skript zu Scrollererstellung.

                  Gruß

                  Klaus

                • #8503
                  wfr
                  Teilnehmer

                    Hallo Klaus,

                    Danke für den Tipp mit den Variablen. Hat aber nichts gebracht.
                    Was meinst du mit “Stack2 hat kein Skript zur Scrollerstellung” ?
                    Das oben angefügte Skript erstellt doch den Scroller?!

                    lg Walter

                  • #8511
                    Klaus Major
                    Administrator

                      Pardon, mein Fehler, hatte ich übersehen.

                    • #8522
                      wfr
                      Teilnehmer

                        Habe das Problem im englischsprachigen Forum gepostet. Mal sehen….

                        lg Walter

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