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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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.