mouseword ???

Startseite Foren Deutsches LiveCode-Forum mouseword ???

Ansicht von 17 Antwort-Themen
  • Autor
    Beiträge
    • #9986
      Thorsten
      Teilnehmer

        Hallo

        Im Buchbeispiel Hangman wird die coole Funktion mousechar vorgestellt, mit dem der Buchstabe, über der sich die Maus befindet, bestimmt werden kann.
        Ich würde gerne bei einem Satz das jeweilige Wort herausbekommen, übder dem sich die Maus befindet.
        Ich habe mal mouseword probiert, aber das scheint es nicht zu sein.

        Any ideas ?

        Herzlichen Dank,

        Thorsten

      • #9988
        Thorsten
        Teilnehmer

          Das Gleiche gilt für eine Zeile in einer Liste.
          mouseline gibt es scheinbar auch nicht 🙁

        • #10004
          Klaus Major
          Administrator

            Du suchst:
            the mousechar -> der aktuelle Buchstabe unter dem Cursor
            oder
            the mousetext -> das aktuelle WORT unter dem Cursor

            „the mouseline“ gibt es auch, liefert aber nur die Position der Zeile unter dem Cursor in Form von: line x of field y

          • #10019
            Thorsten
            Teilnehmer

              Hallo Klaus

              > „the mouseline“ gibt es auch, liefert aber nur die Position der Zeile unter dem Cursor in Form von: line x of field y

              Super, Danke !
              Ich kann ja mit „word 2“ die Nummer x da rausholen

              > the mousetext -> das aktuelle WORT unter dem Cursor

              Prima, allerdings habe ich gerade das kurioses Phänomen, dass das Skript (on mouseUp) gar nicht ausgelöst wird.
              Habe mir zur Kontrolle eine answer eingefügt, aber die erscheint auch nicht !?!
              Neustart brachte auch nichts. Auch nicht ein Wechsel auf mouseDown.
              Durch Zufall habe dann entdeckt, dass es per rechte Maustaste ausgelöst wird !?! Wie kann das denn sein ?
              Auf Android klappt es so gar nicht 🙁

              Hier der Code:

              on mouseUp
                 // answer "Test"
                 put the mousetext into T
                 // answer T
                 put "file:" & specialFolderPath("resources") & "/data/" into SpecialPfad
                 put url(SpecialPfad & T & "htm") into HTM
                 set the HTMLTEXT of widget "Browser" to HTM
                 show widget "Browser"
              end mouseDown
            • #10021
              Klaus Major
              Administrator

                Ach so, ja, nur ein ge“lock“tes Feld kann einen „normalen“ Mausklick empfangen.
                Ein bearbeitbares Feld nur einen Rechts-Klick (für Kontextmenüs etc.).

                Ich glaube, bei Deinem Skript fehlt ein Punkt . vor dem Suffix in SpecialPfad.

              • #10023
                Thorsten
                Teilnehmer

                  Danke für die Info.
                  Wie locke ich das Feld ?
                  Das Attribut heißt wohl lockText und ich vermute den Befehl set.
                  Im Buch finde ich aber nur Beispiele:
                  set the EIGENSCHAFT of OBJEKT to WERT
                  Ich habe das versucht:
                  set lockText of field "Rubrik" to TRUE
                  und es scheint zu funktionieren 🙂

                  Mit dem Punkt hast Du Recht. Da die Worte mit einem Punkt enden, hatte ich den Verdacht, dass der Punkt mit übernommen wird.

                • #10025
                  Klaus Major
                  Administrator

                    Ja, locktext ist korrekt. Heisst möglicherweise „Lock Text“ bei Dir im Inspektor.
                    Großer Tip: In den Voreinstellungen von LC:
                    General -> Property labels are -> Name of Livecode property
                    anklicken, dann zeigt der Inspektor den Namen der Property, die Du auch im Skript verwenden kannst, anstatt nur der Beschreibung!

                    Mit dem Punkt hast Du Recht. Da die Worte mit einem Punkt enden, hatte ich den Verdacht, dass der Punkt mit übernommen wird.

                    Das ist die LC Definition von „word“, alles was durch Leerzeichen, Komma, Punkt oder Semikolon etc. getrennt wird, wobei das „Trennzeichen“ selber nicht Bestandteil des Wortes ist. 😉

                  • #10027
                    Thorsten
                    Teilnehmer

                      > Großer Tip: In den Voreinstellungen von LC:
                      > General -> Property labels are -> Name of Livecode property
                      anklicken, dann zeigt der Inspektor den Namen der Property, die Du auch im Skript verwenden kannst, anstatt nur der Beschreibung!

                      Ja, da habe ich das ja her – hatte mir das beim Lesen des Buches gemerkt 😉

                      > Das ist die LC Definition von „word“, alles was durch Leerzeichen, Komma, Punkt oder Semikolon etc. getrennt wird, wobei das „Trennzeichen“ selber nicht Bestandteil des Wortes ist. ?

                      Ja, leider auch –
                      Von einem Wort mit einem Bindestrich wird nur der Teil erkannt, der sich unter der Maus befindet…

                      Gute Nacht !

                    • #10029
                      Klaus Major
                      Administrator

                        Erzähl doch mal mehr darüber, was Du vorhast, da finden wir sicher eine bessere Lösung!

                      • #10037
                        Thorsten
                        Teilnehmer

                          > Erzähl doch mal mehr darüber, was Du vorhast, da finden wir sicher eine bessere Lösung!

                          🙂
                          Also, ich habe eine Liste, die pro Zeile verschiedene Begriffe und Namen von dazugehörigen HTM-Dateien beinhaltet.
                          Nach den Begriffen möchte ich suchen können (das klappt schon prima).
                          Ich lasse mir dann die Zeile in einem Extra-Feld anzeigen und möchte dann auf einen der Namen der HTM-Dateien klicken können, damit diese dann im Browser angezeigt wird. Das klappt auch schon Dank Deiner Hilfe ganz wunderbar – es sei denn, der Name der HTM-Datei beinhaltet ein –
                          Dann erkennt mouseText nur den Anfang oder das Ende des Namens.

                          Als Workaround habe ich mir überlegt, die erkannten Teilbegriffe innerhalb einer Switch-Routine den vollständigen Namen zuzuordnen.

                          Sonnige Grüße,

                          Thorsten

                        • #10039
                          Klaus Major
                          Administrator

                            Zeig doch mal den Inhalt Deiner Liste und ein paar Deiner verwendeten Skripte.

                          • #10041
                            Thorsten
                            Teilnehmer

                              Ok hier ein Beispiel einer Zeile (von über 450) im Feld „Rep“:

                              142 JUCKEN · Kriebeln +b +e +h · {V: Ameisenlaufen} | agar. apis. Calc. CAUST. lyc. Merc. phos. Puls. Rhus-t. sep. sil. staph. SULPH.

                              Zu Beginn die Zeilennummer, dann die Suchbegriffe mit speziellen Zuordnungen (+B etc.), dann ein Verweis, dann ein Trennungszeichen |, dann die Namen für die HTM-Dateien.

                              Hier mein Code zum Suchen durch eine Eingabe im Feld „RubrikEingabe“:

                              on KeyUp
                                 put field "EingabeRubrik" into Eingabe
                                 put empty into field "Liste" // für die gefundenen Rubriken
                                 if number of chars of Eingabe > 1 Then // Suche beginnt ab 2 Zeichen
                                    repeat for each line l in field "Rep"
                                       if Eingabe is in l then
                                          put l & return after field "Liste"
                                       end if
                                    end repeat
                                 else
                                    hide field "Rep"
                                    show field "Liste"
                                 end if
                              end KeyUp

                              Das funktioniert ganz prima, nur, wenn ich Zeichen mit Backspace lösche, wird nicht weiter gesucht, deswegen die Frage, wie ich das Drücken von Backspace mitbekomme, um entsprechend darauf zu reagieren (aber soweit bin ich noch nicht.

                              In der Liste der gefundenen Zeilen wähle ich mit folgendem Code durch Anklicken ein aus:

                              on mouseUp
                                 put empty into field "EingabeRubrik" // für eine neue Suche
                                 put the mouseline into Zeile
                                 put word 2 of Zeile into Zeile // das ist die Zeilennummer
                                 put return & return & line Zeile of field "Liste" into Rubrik // returns wegen der Optik
                                 replace " | " with return & return in Rubrik // Trennung von Begriffen und Dateiverweisen
                                 put Rubrik into field "Rubrik"
                                 set lockText of field "Rubrik" to TRUE // Kann ich auch etwas in ein gelocktes Feld setzen ?
                                 show field "Rubrik"
                              end mouseUp

                              Mit diesem Code rufe die HTM-Datei auf, wenn man auf einen Dateinamen klickt:

                              on mouseUp
                                 put the mousetext into Arznei
                                 put "file:" & specialFolderPath("resources") & "/data/" into SpecialPfad
                                 put url(SpecialPfad & Arznei & ".htm") into HTM
                                 set the HTMLTEXT of widget "Browser" to HTM
                                 show widget "Browser"
                              end mouseUp

                              Hier will ich noch einbauen, dass geprüft wird, ob die Datei vorhanden ist und ggf. die Ersetzung bei einem Klick auf einen mit – getrennten Dateinamen.
                              Aber fürs Erste funktioniert es schon mal und ich bin ganz happy mit Livecode 🙂

                              Herzliche Grüße,

                              Thorsten

                            • #10043
                              Klaus Major
                              Administrator

                                Hi thorsten,

                                ah, dake für die Info!

                                Ein paar Tips:
                                Du kannst per Skript so gut wie ALLES machen, und natürlich auch Text in ein gelocktes oder unsichtbares Feld packen. Also „lock“e Dein Feld einmal im Inspector, dann brauchst Du das nicht im Skript zu machen.

                                Du kannst immer die Existenz einer Datei prüfen mit:

                                on mouseUp
                                   put the mousetext into Arznei
                                   put specialFolderPath("resources") & "/data/" into SpecialPfad   
                                   put SpecialPfad & Arznei & ".htm" into HTM
                                   if there is a file HTM then
                                      put url("file:" & HTM) into tHTML
                                      set the HTMLTEXT of widget "Browser" to HTM
                                      show widget "Browser"
                                   end if
                                end mouseUp

                                Du kannst Deinem Feld einen „on backspacekey“ Handler verpassen und entsprechend skripten.

                                Gruß

                                Klaus

                              • #10052
                                Thorsten
                                Teilnehmer

                                  Hallo Klaus

                                  > Du kannst per Skript so gut wie ALLES machen, und natürlich auch Text in ein gelocktes oder unsichtbares Feld packen. Also „lock“e Dein Feld einmal im Inspector, dann brauchst Du das nicht im Skript zu machen.

                                  Prima, Danke, gemacht.

                                  > Du kannst immer die Existenz einer Datei prüfen mit:

                                  Super, Danke, gemacht.

                                  > Du kannst Deinem Feld einen „on backspacekey“ Handler verpassen und entsprechend skripten.

                                  Danke
                                  Folgendes Problem:

                                  on backspacekey
                                     Anweisung
                                  end backspacekey

                                  Dann wird zwar die Anweisung ausgeführt, aber die Funktion der Rückschrittaste (Löschen des letzten Zeichens) nicht ausgeführt.

                                  on backspacekey
                                     pass backspacekey
                                     Anweisung
                                  end backspacekey

                                  Dann wird die Funktion der Rückschrittaste zwar ausgeführt, nicht aber die folgenden Funktionen…

                                  Gute Nacht,

                                  Thorsten

                                • #10054
                                  Klaus Major
                                  Administrator

                                    Hi Thorsten,

                                    ja, -> pass wasauchimmer verlässt den Handler sofort, alles Weitere wird nicht ausgeführt.
                                    Der Trick ist, eine Anweisung zeitverzögert zu „send“en, bevor Du etwas „pass“t 😎

                                    on backspacekey
                                       send "Anweisung" to this cd in 10 millisecs
                                       ## Sofern der Handler im aktuellen Kartenskript liegt.
                                       ## Sie verstehen schon... :-)
                                       ## 10 millsekunden reichen völlig aus, denke ich.
                                       pass backspacekey
                                    end backspacekey

                                    Gruß

                                    Klaus

                                  • #10060
                                    Thorsten
                                    Teilnehmer

                                      Hi Klaus

                                      > ja, -> pass wasauchimmer verlässt den Handler sofort, alles Weitere wird nicht ausgeführt.
                                      > Der Trick ist, eine Anweisung zeitverzögert zu „send“en, bevor Du etwas „pass“t ?

                                      > on backspacekey
                                      > send „Anweisung“ to this cd in 10 millisecs
                                      > ## Sofern der Handler im aktuellen Kartenskript liegt.
                                      > ## Sie verstehen schon… 🙂
                                      > ## 10 millsekunden reichen völlig aus, denke ich.
                                      > pass backspacekey
                                      > end backspacekey

                                      Ok, und wo stehen dann meine anderen Anweisungen ?
                                      Irgendwie ist das Ganze etwas komisch.
                                      Ich habe folgenden Workaround gewählt:

                                      on backspacekey
                                         put field "EingabeArznei" into Eingabe
                                         delete last char of Eingabe ## Übernahme der fehlenden Funktion
                                         answer Eingabe ## Aber das wird gar nicht angezeigt ?!?
                                         put Eingabe into field "EingabeArznei"
                                         put empty into field "Arzneien"
                                         hide widget "Browser"
                                         hide field "Anleitung"
                                         show field "Arzneien"
                                         repeat for each line l in field "ArzneiAbk"
                                            if space & Eingabe is in l then
                                               put l & return after field "Arzneien"
                                            end if
                                         end repeat
                                      end backspacekey

                                      Es wird zwar das letzte Zeichen der Eingabe gelöscht, aber der Cursor steht dann zu Beginn der Eingabe und das Feld „Arzneien“ erscheint nicht ?!?

                                      Danke für Deine Bemühungen !

                                    • #10062
                                      Thorsten
                                      Teilnehmer

                                        Hi Klaus

                                        Ich habe jetzt noch einen anderen Workaround gefunden (nachdem ich erst sehr viele Ersetzungen zum Vervollständigen der mit – Deteinamen eingebaut hatte):
                                        Ich habe jetzt in den Dateinamen den – durch den _ ersetzt und damit wird die ganze Zeichenfolge als Word erkannt. Es ist zwar optisch etwas unschön, aber dafür funktioniert es.

                                        Jetzt aber gute Nacht,

                                        Thorsten

                                      • #10067
                                        Klaus Major
                                        Administrator

                                          Ach so! 😀

                                          Sorry, ich hatte das aber sowas von falsch verstanden, ich dachte, Du hättest einen Handler namens „Anweisung“ irgendwo im Message Pfad, so sorry! 🙂

                                          So würde es klappen, das hier ins Kartenskript:

                                          command anweisung
                                             put empty into field "Arzneien"
                                             hide widget "Browser"
                                             hide field "Anleitung"
                                             show field "Arzneien"
                                          
                                             ## Ganz wichtig, wenn Du felder updaten willst:
                                             lock screen
                                             repeat for each line l in field "ArzneiAbk"
                                                if space & Eingabe is in l then
                                                   put l & return after field "Arzneien"
                                                end if
                                             end repeat
                                             
                                             ## Und wieder:
                                             unlock screen
                                             ## Der verhundertfacht das Updaten des Feldes, da der Screen 
                                            ## Nur einmal am Ende des Loops aktualisiert werden muss.
                                            ## Das ist besonders spürbar bei wirklich großen Mengen an Daten,
                                            ## das Verb "verhundertfacht" ist wirklich nicht gelogen.
                                          
                                            ## Ist bei Dir hier vielleicht nicht unbedingt spürbar, 
                                            ## aber wirklich guter Skripting Stil.
                                          end anweisung

                                          Das hier ins Feldskript und alles ist wieder wunderbar 🙂

                                          on backspacekey
                                             send "Anweisung" to this cd in 10 millisecs
                                             pass backspacekey
                                          end backspacekey
                                      Ansicht von 17 Antwort-Themen
                                      • Du musst angemeldet sein, um auf dieses Thema antworten zu können.