Textfeld scrollen

Startseite Foren Deutsches LiveCode-Forum Textfeld scrollen

Ansicht von 18 Antwort-Themen
  • Autor
    Beiträge
    • #21215
      Peter_M
      Teilnehmer

        Hallo Forum,
        ich habe folgendes Problem: wenn der Inhalt eines Feldes dessen Größe übersteigt, ist auf dem Android-Handy der Scrollbalken so schmal, dass er nur schwierig zu aktivieren ist. Gibt es eine Möglichkeit, den Scrollbalken zu aktivieren, indem man einfach in das Textfeld tippt,so dass man dann anschließend durch Verschieben des Fingers im Textfeld dessen Inhalt scrollen kann? Vielen Dank für jede Anregung…..

      • #21217
        Klaus Major
        Administrator

          Hallo Peter,

          das geht, ganz Handy-mäßig, mit einem nativen Scroller.
          schau Dir mal diese Lektion an:
          http://lessons.livecode.com/m/4069/l/94412-creating-a-native-scroller-to-scroll-a-field

          Gruß

          Klaus

        • #21221
          Peter_M
          Teilnehmer

            Hallo Klaus,
            vielen Dank für deinen Tipp, das werde ich mir gleich anschauen.
            LG Peter

          • #21222
            Klaus Major
            Administrator

              Das ist etwas mühsam mit den ganzen mobilen nativen Sachen, aber vor den Erfolg haben die Götter den Schweiss gesetzt! 🙂

            • #21224
              Peter_M
              Teilnehmer

                Hallo Klaus,
                das kann man wohl laut sagen. Ich hatte gehofft, es gebe eine Möglichkeit, direkt per Code auf die im Field-Steuerelement integrierte Scrollleiste zuzugreifen. Dem ist offenbar nicht so…
                Ich werde mal versuchen, das Problem
                innerhalb der mouseMove – Prozedur mit dem select Line- Befehl zu lösen, obwohl das sicherlich wegen rückartiger Bewegungen nicht sehr elegant ist. Ich hatte primär schon erfolglos versucht, die Breite der Scrollleiste in den Properties zu vergrößern, Gibt es dafür einen Trick? Dann wären alle Kriterien für die benutzerfreundliche Bedienung meiner App erfüllt.
                Peter

              • #21225
                Klaus Major
                Administrator

                  Vielleicht ist es in kommenden Versionen anders/einfacher!
                  Daher bin ich täglich sehr froh, kein Handy, Tablet o.ä. zu besitzen und
                  dafür programmieren zu müssen! Ich KOENNTE es aber. 😀

                  Du kannst
                  -> set the scrollbarwidth of FLD x to y
                  oder
                  -> set the scrollbarwidth of GRP x to y

                  Aber ich fürchte, das funktioniert nur auf dem Desktop.

                • #21227
                  Peter_M
                  Teilnehmer

                    Danke, das werde ich probieren und berichten.

                  • #21228
                    Torsten
                    Teilnehmer

                      Hi Peter,

                      hast Du es schon mit einem Native Android Field versucht?
                      Schau mal hier, habe ich gerade ausprobiert:
                      https://www.dropbox.com/s/687j1nmsrevdec7/Screenshot_20200529-212758.jpg?dl=0

                      Man scrollt einfach über die ganze Fläche des Feldes.

                      LG
                      Torsten

                    • #21230
                      Klaus Major
                      Administrator

                        In dem Widget ist das “mit dem Finger scrollen” schon eingebaut?

                        • #21240
                          Torsten
                          Teilnehmer

                            Ja, allerdings gibt es dann keinen Scrollbalken, an dem man sehen kann, wo man ist und wieviel Text noch kommt.

                        • #21234
                          Peter_M
                          Teilnehmer

                            Hallo Klaus,
                            Vielen Dank für deinen Tipp. Da die Änderung
                            der Scrollleistenbreite in den Properties nicht funktionierte, hatte ich es im Code gar nicht erst ausprobiert. Dort funktioniert es aber einwandfrei, auch unter Android!
                            HG
                            Peter

                          • #21235
                            Peter_M
                            Teilnehmer

                              Hi Thorsten,
                              vielen Dank auch für deinen Hinweis.
                              Leider lässt sich das Widget scheinbar nicht als Datencontainer benutzen und steigt beim Versuch, es per Code zu befüllen, mit einer entsprechenden Fehlermeldung aus……..
                              LG
                              Peter

                            • #21236
                              Klaus Major
                              Administrator

                                Das sollte aber funktionieren!
                                Welche Fehlermeldung hast Du denn bekommen?

                                Wichtig:
                                In der IDE funktionieren fast alle “mobilen” Befehle nicht und LC spuckt dann einen ERROR aus.
                                Du musst das alles also in eine IF Klausel verpacken:

                                ...
                                if the environment = "mobile" then
                                   ## mach Dein mobiles Ding
                                   ## mehr mobiler Kram...
                                end if
                                ...

                                Vielleicht liegt es daran, aber zeig doch mal, was du gescripted hast.

                              • #21242
                                Torsten
                                Teilnehmer

                                  Also bei mir kann ich dem Text-Widget per

                                  set the text of widget "Hier ist der Name meines Android Widgets" to tNeuerText

                                  Daten einspeichern. Du kannst es halt nicht wie beim normalen Field mit “put x into field Y” machen, daran musst Du denken.

                                • #21244
                                  Klaus Major
                                  Administrator

                                    Ach das war gemeint, daher zeig uns bitte Dein Skript!

                                  • #21250
                                    Peter_M
                                    Teilnehmer

                                      Hi Torsten,
                                      Vielen Dank für deinen Hinweis. Natürlich hatte ich es mit dem put – Befehl versucht und dann die Meldung bekommen “chunk is not a container”. Wenngleich ich auch schon gut mit der Vergrösserung der Scrollleistenbreite aufgrund von Klaus’s Tipp leben kann, werde ich deinen Tipp auch noch ausprobieren!
                                      Liebe Grüße
                                      Peter

                                    • #27641
                                      Gil
                                      Teilnehmer

                                        hi Thorsten,

                                        kannst Du Dein Script posten?

                                        Ich habe das hier versucht
                                        https://lessons.livecode.com/m/4069/l/94412-creating-a-native-scroller-to-scroll-a-field

                                        Allerdings meckert mein Smartphone und auch das Tablet, dass es nicht Parsen kann bzw. APK ist beschädigt.

                                        Ich möchte halt ohne Scrollbalken scrollen 🙂

                                        LG
                                        Gil

                                        • #27645
                                          Torsten
                                          Teilnehmer

                                            Hi Gil,

                                            meines Erachtens musst Du das Android-Text-Widget nehmen und in den Properties den Punkt “Scrolling enabled” ankreuzen. Das ist alles 🙂

                                            Happy Coding
                                            Torsten

                                        • #27651
                                          Gil
                                          Teilnehmer

                                            hi Torsten,

                                            das war ja einfach! Danke Dir!
                                            Weißt Du, wie man die Hintergrundfarbe von diesem Widget ändert?

                                            Grüße
                                            Gil

                                          • #27653
                                            Axwald
                                            Teilnehmer

                                              Hallo,

                                              Das, was RunRev als Dokumentation hierfür anbietet, kann man in der Pfeife rauchen – vielleicht funktioniert es im iJail, auf Android sicher nicht.

                                              Genereller Rat für Livecode-Anfänger:
                                              Wenn Du nicht ausschließlich im Apple-Universum coden willst, mach Dich auf harte Zeiten gefasst! LiveCode wird hauptsächlich für & auf Apple entwickelt – alles andere sind ungeliebte Stiefkinder, für die nur das Allernotwendigste getan wird.
                                              Die ständig wechselnden Anforderungen Apples (CPU-Typ, OS, XCode) halten das kleine Team in Edinburg so auf Trab, daß kaum mehr echte Entwicklung möglich ist.

                                              Mit der Folge, daß es für nicht-iJail-Programmierer so aussieht:
                                              (qualitätsmäßig aufsteigend sortiert)
                                              – HTML5: Praktisch unbrauchbar (nach Aussage von Leuten, die es probiert haben …);
                                              – Linux: Praktisch unbrauchbar, keine Repos, grundlegende Features fehlen, Jahre alte Bugs immer noch nicht gefixt;
                                              – Android: nur halbherzig implementiert – grundlegende Features fehlen, Jahre alte Bugs immer noch nicht gefixt, Dokumentation teils grob fehlerhaft;
                                              – LC Server: Wer CGI haben will & viel Zeit & Mut hat – kaum Entwicklung dafür, wenig & teilweise grob fehlerhafte Dokumentation, neuere Versionen (> 8) werfen “SegFaults” (bei mir).
                                              – Windows: halbwegs brauchbar. IDE bei neueren Versionen (> 6) schnarchlangsam & absturzträchtig. Jahre alte Bugs immer noch nicht gefixt.LC 6.7.10 läuft gut.

                                              Zurück zum Thema – eigentlich ist es ganz einfach. Basics:
                                              1.) Das Feld zum Scrollen (oder die Gruppe, die scrollen soll) darf keine “graphic effects” (dropShadow, innerGlow) haben – das bremst gewaltig. Außerdem muß für die ggf. Gruppe “showBorder” (Rahmen) deaktiviert sein (Feld darf Rahmen haben).
                                              2.) Das, was gescrollt werden soll, muß “layerMode”: “Scrolling” haben.
                                              3.) “acceleratedRendering” muss eingeschaltet sein.

                                              Ich poste mal den Code, um ein Feld zu scrollen, kopiert aus einer echten Android-Anwendung. Ich hoffe, ich habe beim Übersetzen nix kaputt gemacht & nicht allzu viel vergessen 🙂

                                              Script im Stack:

                                              on closeCard
                                              /* Weg damit, wenn wir die Karte wechseln!   */
                                                 if isMob() then mobScrollDelete
                                              end closeCard
                                              
                                              function isMob
                                              /* Für die Schreibfaulen unter uns ...   */
                                                 return (the environment = "mobile")
                                              end isMob
                                              
                                              on mobScrollDelete what
                                              /* MobScroller MÜSSEN entsorgt werden, bremsen sonst!   */
                                                 if not isMob() then
                                                    exit mobScrollDelete                  --  nur mobile
                                                 end if
                                                 if what is empty then
                                                    repeat for each line L in mobileControls()
                                                       mobileControlDelete L                  --  alle
                                                    end repeat
                                                 else
                                                    mobileControlDelete what                  --  nur dies
                                                 end if
                                              end mobScrollDelete

                                              Das sorgt dafür, daß keine Reste verbleiben. Die bremsen Android nämlich ziemlich aus. Und definiert “isMob()”.

                                              Script der Karte:

                                              local lName
                                              constant kName = "myScroller"  --  der Scroller
                                              constant kField = "data_fld"  --  der "short name" des Felds
                                              
                                              on preOpenCard
                                              /* Erzeugt einen Dummy-Scroller   */
                                                 if isMob() then mobScrollMake true
                                              end preOpenCard
                                              
                                              /* Das Folgende erzeugt & kontrolliert den mobileScroller "kName", der über das Feld "kField" gelegt wird.
                                              .  Dieser Code muss irgendwo im "messagePath" liegen, zum Beispiel in "card script".
                                              
                                              Rufe "mobScrollMake true" einmal auf, wenn diese Karte angezeigt wird (preOpenCard).
                                              .  Das erzeugt einen unsichtbaren "Dummy-Scroller", was das weitere Vorgehen beschleunigt. 
                                              Rufe "mobScrollMake" or"mobScrollMake false" erst auf, wenn das zu scrollende Feld fertig ist
                                              .  (also mit Daten befüllt, formattiert usw.).
                                              .  Wenn sich am Feld was ändert (Zeilen löschen/ hinzufügen etc.), rufe es nochmal auf!
                                              
                                              "mobScrollMake true" erzeugt eine frische Kopie (löscht alle Vorgänger) oben links, unsichtbar, 10x10.
                                              "mobScrollMake" or "mobScrollMake false" passt diese dem aktuellen Feld an & aktiviert es.
                                              .  (Wenn noch keins da ist, erzeugt es trotzdem eins.)   */
                                              
                                              on mobScrollMake isDummy
                                                 if not isMob() then exit mobScrollMake
                                                 if not isDummy then put false into isDummy
                                                 put (the short name of this cd) & kName into lName  --  so its unique (only 1 here)
                                                 
                                                 if isDummy then                                           --  wir bauen einen Dummy
                                                    if lName is in mobileControls() then                   --  ggf. erneuern wir ihn
                                                       mobileControlDelete lName
                                                    end if
                                                    
                                                    put "0,0,10,10" into theScR
                                                    put "0,0,10,10" into theCnR
                                                    
                                                    mobileControlCreate "scroller", lName                   --  Dummy erzeugen
                                                    put the result into lScID
                                                    if lScID is not a number then
                                                       answer "Failed to create the dummy scroller, Result:" & CR & lScID
                                                       exit to top
                                                    end if
                                                    mobileControlSet lName, "visible", false                --  Dummy ist unsichtbar
                                                    
                                                 else                                                       --  der echte Scroller
                                                    set the vscrollbar of fld kField of this cd to false
                                                    put the rect of fld kField of this cd into theScR
                                                    put 0, 0, (the width of field kField of this cd), \
                                                          (the formattedHeight of field kField of this cd) into theCnR
                                                    
                                                    if not (lName is in mobileControls()) then              --  wenn wir den noch nicht haben:
                                                       mobileControlCreate "scroller", lName                 --  erzeugen wir ihn
                                                       put the result into lScID
                                                       if lScID is not a number then
                                                          answer "Failed to create the mobile scroller, Result:" & CR & lScID
                                                          exit to top
                                                       end if         
                                                    end if
                                                    mobileControlSet lName, "visible", true                   --  und machen ihn sichtbar
                                                 end if      
                                                 
                                                 mobileControlSet lName, "rect", theScR                      --  Immer:
                                                 mobileControlSet lName, "contentRect", theCnR
                                                 mobileControlSet lName, "scrollingEnabled", true
                                                 mobileControlSet lName, "canBounce", true
                                                 mobileControlSet lName, "vIndicator", true
                                                 mobileControlSet lName, "vscroll", 1
                                              end mobScrollMake
                                              
                                              on scrollerDidScroll hOffset, vOffset
                                              /* Das scrollt das Feld - muss im gleichen Skript wie "mobScrollMake" liegen!  */
                                                 set the vScroll of fld kField of this cd to vOffset
                                              end scrollerDidScroll

                                              Das macht die eigentliche Arbeit.

                                              Script des Feldes:

                                              local lStartLoc
                                              
                                              on mouseDown
                                                 put the mouseLoc into lStartLoc                              --  merken, wo geklickt wurde
                                                 --  ...
                                              end mouseDown
                                              
                                              on mouseUp
                                              /* Wenn weiter als [30] gewischt wurde, ist es ein "Swipe" & wird ignoriert.   */
                                                 if (abs(the mouseH - item 1 of lStartLoc) > 30) OR \
                                                 (abs(the mouseV - item 2 of lStartLoc) > 30) then pass mouseUp
                                                 --  Tu was - Es ist ein Klick!
                                              end mouseUp

                                              “Swipe”-Erkennung.

                                              So, nun befüllen wir unser Feld (namens “data_fld”, ansonsten “constant kField ” im Card Script ändern). Wenn alles fertig ist, rufen wir “mobScrollMake” auf – Bingo.

                                              Wenn sich die Maße des Feldes ändern (Zeilen löschen/ hinzufügen), müssen wir “mobScrollMake” erneut aufrufen.

                                              Wenn’s nicht klappt, Bescheid sagen. Dann bau ich einen Demo-Stack.

                                              Viel Spaß!

                                            • #27658
                                              Gil
                                              Teilnehmer

                                                hi Axwald,

                                                das ist ja nicht gerade motivierend.
                                                Bei HTML5 hatte ich schon aufgegeben, dass hat nichts mit der Werbung auf der Website zu tun.

                                                Schauen wir nach vorn!

                                                Danke für den Input, ich werde das nachher ausprobieren.

                                                Viele Grüße
                                                Gil

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