mouseword ???

Startseite Foren Deutsches LiveCode-Forum mouseword ???

Dieses Thema enthält 17 Antworten und 2 Teilnehmer. Es wurde zuletzt aktualisiert von  Klaus Major vor 4 Wochen.

  • 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
    Moderator

    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
    Moderator

    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
    Moderator

    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
    Moderator

    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
    Moderator

    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
    Moderator

    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
    Moderator

    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
    Moderator

    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

Du musst angemeldet sein, um auf dieses Thema antworten zu können.