Buttongruppe auf Handy – anderes Verhalten als in der IDE

Startseite Foren Deutsches LiveCode-Forum Buttongruppe auf Handy – anderes Verhalten als in der IDE

Ansicht von 8 Antwort-Themen
  • Autor
    Beiträge
    • #13567
      gfz
      Teilnehmer

      Liebe LivecoderInnen!
      Ich habe eine kleine App programmiert fürs Handy, die es mir erlaubt das ukrainische Alphabet zu erlernen.
      Hauptbestandteil dieser Anwendung ist eine Gruppe von 32 Buttons, die die Buchstaben repräsentieren. Im Lernmodus
      kann ich die einzelnen Buttons drücken und höre anschließend den Buchstaben als WAV-Datei. Im Testmodus höre ich zuerst den
      Buchstaben als Sounddatei abgespielt und werde dann aufgefordert den entsprechenden Buchstaben-Button zu drücken, den ich glaube gehört zu haben.
      Dabei disable/enable ich die gesamte Gruppe von Buttons entsprechend.
      In der IDE funktioniert alles sehr gut nur am Handy sind einige Buttons deaktiviert. Hat jemand eine Idee woran das liegen könnte?
      Ich entwickle unter Windows mit LC 9.0.2.
      Bin für jeden Tipp dankbar
      liebe Grüße
      Georg

    • #13569
      Klaus Major
      Verwalter

      Hi Georg,

      wirklich deaktiviert (disabled) oder nur nicht funktional?

      Gruß

      Klaus

    • #13571
      gfz
      Teilnehmer

      Hallo Klaus,
      danke für Deine Antwort.
      Bei beiden Modi (Lernen und Abfragen) sind einige Buttons dünkler, also scheinbar disabled.
      Im Lernmodus, wo ich auf Knopfdruck die entsprechende Sounddatei abspielen lasse funktionieren jedoch alle wie vorgesehen – sowohl die dunklen wie auch die hellen.
      Im Abfragemodus, wo ich nach hören der Sounddatei den Buchstabenbutton drücke und der Buchstabe dann in ein Feld geschrieben werden soll funktioniert keiner von den Buttons. Aber auch hier sind helle und dunkle zu sehen.
      In der IDE sind jedoch alle Buttons visible (häckchen gesetzt) und enabled (kein Häckchen bei disabled).
      Die Buttons sind auch von den Ebenen her aufsteigend ab Ebene 3 hintereinander gereiht.
      Ich kann mir dieses Verhalten nicht erklären.
      liebe Grüße
      Georg

    • #13573
      gfz
      Teilnehmer

      Werde da mal die Skripte posten:

      Das ist im Stack:

      global preRecPath
      global appMode
      global soundList
      
      on openStack
         setPath2preRec
         fillSoundList
      end openStack
      
      on setPath2preRec
         
         if the environment is "mobile" then
            put specialFolderPath("engine") into thisAppPath
         else
            put the filename of this stack into thisAppPath
            set the itemDelimiter to "/"
            delete the last item of thisAppPath
         end if
         put thisAppPath&"/wav/" into preRecPath
         
      end setPath2preRec
      
      on fillSoundList
         put files(preRecPath) into soundList
      end fillSoundList
      

      Und das in der Card:

      global preRecPath
      global appMode
      global listOfButtons
      global exitLearning
      global stopListening
      global startTest
      -- Modes: learn, checkMe
      
      on openCard
         put false into exitLearning
         put false into stopListening
         put false into startTest
         initStartView
         fillBtnList
      end openCard
      
      on initStartView
         put "learn" into appMode
         set the hilitedItem of widget "navBar" of me to 1
         setDisplayToLearnMode
      end initStartView
      
      on setDisplayToLearnMode
         set the visible of group "grpPlayAll" of me to true
         set the visible of group "grpPlaySingle" of me to true
         put empty into field "LetterOutput" of me
         set the visible of field "LetterOutput" of me to true
         set the visible of field "userInstructions" of me to false
         set the visible of field "myGuess" of me to false
         set the visible of field "correctLetter" of me to false
         set the visible of group "cyrillicKeyboard" of me to true
         disable group "cyrillicKeyboard" of me
         set the visible of field "inCorrect" of me to false
         set the visible of field "inTotal" of me to false
         set the visible of field "outFrom" of me to false
         set the visible of field "outRight" of me to false
         set the visible of group "grpStartTest" of me to false
         set the visible of field "numOfTriesLabel" of me to false
         set the visible of field "numOfTry" of me to false
      end setDisplayToLearnMode
      
      on setDisplayToTestMode
         set the visible of group "grpPlayAll" of me to false
         set the visible of group "grpPlaySingle" of me to false
         set the visible of field "userInstructions" of me to false
         set the visible of field "myGuess" of me to true
         set the visible of field "correctLetter" of me to true
         set the visible of group "cyrillicKeyboard" of me to true
         enable group "cyrillicKeyboard" of me
         set the visible of field "inCorrect" of me to true
         put 0 into field "inCorrect" of me
         set the visible of field "inTotal" of me to true
         put 0 into field "inTotal" of me
         set the visible of field "outFrom" of me to true
         set the visible of field "outRight" of me to true
         set the visible of field "LetterOutput" of me to false
         put empty into field "myGuess" of me
         put empty into field "correctLetter" of me
         set the visible of group "grpStartTest" of me to true
         set the visible of field "numOfTriesLabel" of me to true
         set the visible of field "numOfTry" of me to true
         put 0 into field "numOfTry" of me
      end setDisplayToTestMode
      
      on fillBtnList
         set the itemDelimiter to space
         put 0 into tX
         repeat with x = 1 to the number of buttons of me
            put the name of btn(x) into tN
            --put tN after msg
            if item 2 of tN contains "LETTER_" then
               add 1 to tX
               if tX = 1 then
                  put item 2 of tN into tLi
                  replace quote with empty in tLi
                  put tLi into listOfButtons
               else
                  put item 2 of tN into tLi
                  replace quote with empty in tLi
                  put return & tLi after listOfButtons
               end if
               enable button tLi of me
            end if
         end repeat
         --put listOfButtons
      end fillBtnList
      
      on modeChanged
         if appMode is "learn" then
            
            setDisplayToLearnMode
            
         else
            
            setDisplayToTestMode
            
         end if
      end modeChanged
      
      on mouseUp
         if appMode is "learn" then
            
            if "LETTER_" is in the target then
               set the itemDelimiter to space
               put item 2 of the target into tBtn
               replace quote with empty in tBtn
               --put tBtn after msg
               put preRecPath & tBtn & ".wav" into tSound
               set the backgroundColor of button tBtn of this card to "#A0FFA0"
               put the label of the target into field "LetterOutput" of this card
               play tSound
               wait until the sound is done with messages
               set the backgroundColor of button tBtn of this card to empty
            end if
            
         end if
         
         if appMode is "checkMe" then
            
            if "LETTER_" is in the target then
               put the label of the target into field "myGuess" of this card
            end if
            
         end if
         
      end mouseUp
      

      Damit schalte ich zwischen den beiden Modi um mittels Navigation Bar Widget:

      global appMode
      
      on hiliteChanged
         put the hilitedItemName of me into appMode
         send "modeChanged" to me
      end hiliteChanged

      Damit schalte ich im Lernmodus die Wiedergabe aller Buchstaben ein. Dazu habe ich eine Gruppe aus einem Button und einem SVG Widget erstellt und das Skript ist in der Gruppe plaziert:

      global preRecPath
      global listOfButtons
      global exitLearning
      
      on mouseUp
         
         if not exitLearning then
            put true into exitLearning
            set the backgroundColor of button "btnPlayAll" of me to empty
         else
            put false into exitLearning
            set the backgroundColor of button "btnPlayAll" of me to "#A0FFA0"
            
            repeat for each line tL in listOfButtons
               --put line(tL) of listOfButtons into tBtn
               put preRecPath & tL & ".wav" into tSound
               put the label of button tL of this card into field "LetterOutput" of this card
               set the backgroundColor of button tL of this card to "#A0FFA0"
               play tSound
               wait until the sound is done with messages
               set the backgroundColor of button tL of this card to empty
               
               if exitLearning then
                  put empty into field "LetterOutput" of this card
                  exit repeat
               end if
               
            end repeat
            
         end if
         
         
      end mouseUp
      

      Ebenso im Lernmodus jene Funktion, mit der ich auf Tastendruck den Buchstaben vorgelesen bekomme, wieder als Gruppe von Button und SVG Widget. Skript befindet sich in der Gruppe:

      global preRecPath
      global listOfButtons
      global exitLearning
      global stopListening
      
      on mouseUp
         
         if not stopListening then
            put true into stopListening
            disable group "cyrillicKeyboard" of this card
            set the backgroundColor of button "btnPlaySingle" of me to empty
            put empty into field "LetterOutput" of this card
         else
            put false into stopListening
            enable group "cyrillicKeyboard" of this card
            set the backgroundColor of button "btnPlaySingle" of me to "#A0FFA0"
            
         end if
         
         pass mouseUp
         
      end mouseUp

      Hier noch die Funktionalität des Testmodus. Wieder als Gruppe von Button und SVG Widget. Skript ist wieder in dieser Gruppe abgelegt:

      global preRecPath
      global startTest
      
      on mouseUp
         put files(preRecPath) into tRecordedLetters
         sort lines of tRecordedLetters by random(500)
         
         if startTest then
            put false into startTest
            set the backgroundColor of button "btnStartTest" of me to empty
            disable group "cyrillicKeyboard" of this card
            set the visible of field "userInstructions" of this card to false
         else
            put true into startTest
            set the backgroundColor of button "btnStartTest" of me to "#A0FFA0"
            set the visible of field "userInstructions" of this card to false
            disable group "cyrillicKeyboard" of this card
            put the number of lines in tRecordedLetters into field "inTotal" of this card
            
            put 0 into tX
            repeat for each line tSoundFile in tRecordedLetters
               put empty into field "myGuess" of this card
               put empty into field "correctLetter" of this card
               add 1 to tX
               put tX into field "numOfTry" of this card
               put tSoundFile into tLetter
               replace ".wav" with empty in tLetter
               put the label of button tLetter of this card into tLetter
               --put return & tLetter after msg
               put preRecPath & tSoundFile into tSound
               --put return & tSound after msg
               play tSound
               wait until the sound is done with messages
               enable group "cyrillicKeyboard" of this card
               show field "userInstructions" of this card
               wait 3 seconds with messages
               disable group "cyrillicKeyboard" of this card
               hide field "userInstructions" of this card
               put tLetter into field "correctLetter" of this card
               wait 0.5 seconds with messages
               
               if not startTest then
                  put empty into field "myGuess" of this card
                  put empty into field "correctLetter" of this card
                  put 0 into field "inCorrect" of this card
                  put 0 into field "inTotal" of this card
                  put 0 into field "numOfTry" of this card
                  exit repeat
               end if
               
               if field "myGuess" of this card is not empty then
                  put field "myGuess" of this card into tUsersGuess
                  if tUsersGuess = tLetter then
                     add 1 to field "inCorrect" of this card
                  end if
               end if
               
               
            end repeat
            
         end if
         
      end mouseUp
      

      cyrillicKeyboard fasst alle 32 Buchstabenbuttons zu einer Gruppe zusammen.

      liebe Grüße,
      Georg

    • #13575
      Klaus Major
      Verwalter

      OK, fangen wir mal hier an:

      ...
      if the environment is "mobile" then
            put specialFolderPath("engine") into thisAppPath
         else
            put the filename of this stack into thisAppPath
            set the itemDelimiter to "/"
            delete the last item of thisAppPath
         end if
         put thisAppPath&"/wav/" into preRecPath
      ...

      Wenn Du die Sounddateien über „Copy files“ im „Standalone Application Settings“ Dialog hinziugefügt hast, findest Du sie hier -> specialfolderpath(„resources“)
      Dieser specialfolderpath() funktioniert auch in der IDE und zeigt dort auf den Ordner, in dem sich er aktuelle Stack befindet.
      Diese Zeile sollte daher für alle Platformen reichen, ohne IF THEN:

      ...
      put specialfolderpath("resources") & "/wav/" into preRecPath
      ...

      Also bitte mal korrigieren und testen.

    • #13577
      Klaus Major
      Verwalter

      Ein paar nützliche Tips:
      the name of btn x -> button „names des buttons“
      the short name of btn x -> name des buttons (Ohne Anführungszeichen!)

      Wegen:

      ...
      set the itemDelimiter to space
      put item 2 of the target into tBtn
      replace quote with empty in tBtn
      ...

      -> put the short name of the target into tBtn

      Effektiver, aber nicht in diesem Beispiel 🙂

      ...
      set the itemDelimiter to space
      put item 2 of the target into tBtn
      ...

      -> Put word 2 of the target into tBtn

      ...
      disable group "cyrillicKeyboard" of this card
      ...

      Da wir uns ja schon auf „this card“ befinden, kannst Du das „of this card“ getrost weglassen.
      Dito „… of me“, sofern es sich nicht um das Skript einer GRUPPE handelt, was ein Objekt in dieser Gruppe anspricht.

    • #13579
      gfz
      Teilnehmer

      Okay Klaus,
      danke für den Hinweis. Habe die Änderung im Code durchgeführt und aufs Handy gebracht. Die Wiedergabe funktioniert wie zuvor. Am Verhalten der Buttons hat sich dadurch jedoch leider nichts geändert.
      Liebe Grüße,
      Georg

    • #13581
      Klaus Major
      Verwalter

      Es wundert mich sehr, daß die Sounds vorher überhaupt abgespielt wurden, da sie sich ja nicht an dem angegebenen Ort befunden haben. Vielleicht „korrigiert“ LC das intern?

      Sorry, keine Idee zum „komischen“ Aussehen der Buttons.

    • #13583
      gfz
      Teilnehmer

      Hallo Klaus,
      Danke für die Tipps, mit dem short name of the target bzw. word 2 of the target.
      Wegen „this card“ und me:
      das habe ich nach langer Fehlersuche hinzugefügt, da es ohne diese Zusätze immer wieder an diversen Stellen zu Abstürzen und Errors kam.
      Ich werde das mal mit native android buttons probieren. Dazu muss ich mich aber erst mal einlesen.

      Auf jeden Fall, danke dass du dir die Zeit genommen hast und dir meinen Code durchgesehen hast.
      Liebe Grüße,
      Georg

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