Begrenzte Länge von Eingabefelder

Startseite Foren Deutsches LiveCode-Forum Begrenzte Länge von Eingabefelder

Ansicht von 18 Antwort-Themen
  • Autor
    Beiträge
    • #14660
      Herby
      Teilnehmer

      Hallo Leute,

      ich habe zwei Eingabefelder (Field), die max. jeweils 20 Zeichen lang sein dürfen.
      Wie kann ich dies realisieren ? Mit dem unteren Versuch geht es leider nicht, da sich die beiden IF-Bedingungen nicht gegenseitig ausschließen.

      on keyDown Taste

      if the length of fld fdcd1 > 20 then
      wait 10 milliseconds
      else
      pass keyDown
      end if

      if the length of fld fdcd2 > 20 then
      wait 10 milliseconds
      else
      pass keyDown
      end if

      end keyDown

      Wie kann ich abfragen, welches Feld von beiden gerade den keyDown aufgerufen hat ?
      Wenn ich viele Felder habe, dann möchte ich doch für jedes Feld eigene Regeln haben oder kann ich mehrere Felder nicht einzeln mit keyDown verarbeiten ?

      Danke im Voraus
      herby

    • #14662
      Klaus Major
      Verwalter

      Hallo herby,

      bitte benutzt nach dem Einfügen von Skripten die CODE Tags, dann bleibt die Formatierung erhalten, sieh unten…

      Du könntest das ins Kartenskript packen, sofern Du nur diese beiden Felder auf der Karte hast:

      on keydown trallalla
        if the lenght of the TEXT of THE TARGET < 20 then
           pass keydown
        end if
      end keydown

      „the target“ liefert dann -> field „name des feldes“
      „wait“ ergibt in dem Fall nun nicht wirklich einen Sinn, einfach aussteigen bzw. gar nicht erst reagieren reicht völlig aus! Der User bekommt die 10 Millisekunden gar nicht erst mit.;-)

      Hinweis:
      Bitte gewöhn Dir in Deinem eingenen Interesse an, alle Strings wie Objektnamen etc. in Anführunszeichen zu setzen.
      if the length of fld "fdcd2"...
      Mit jeder Version wird die Engine weniger nachsichtig mit „salopper“ Syntax, also könnte Dich das irgendwann beissen. Ich weiß das, ich arbeite seit 20 Jahren mit LC und seinen Vorfahren und bin selber schon davon „gebissen“ worden. 🙂

      Gruß

      Klaus

    • #14664
      Herby
      Teilnehmer

      Hallo lieber Klaus,

      vielen Dank wieder einmal für deine schnelle Antwort.

      TARGET werde ich ausprobieren.
      Die Anführungszeichen baldmöglichst.

      Danke Herby

    • #14666
      Herby
      Teilnehmer

      Juchu,

      die Idee war schon einmal sehr gut, aber im TARGET steht nicht der Feldname, sondern der Feldinhalt.
      (Kann ich mit on keydown den Feldnamen abfragen ?)

      if the lenght of the TEXT of THE TARGET < 20 then erzeugt bei mir außerdem den folgenden Fehler
      stack „Medizin“: execution error at line 95 (Chunk: error in object expression) near „eeeeeegfd“, char 21

      Ich schreib dies schon einmal und probiere aber natürlich weiter aus.

      Beste Grüße
      herby

    • #14668
      Klaus Major
      Verwalter

      OK, dann hast Du möglicherweise auf der KARTE eine Taste gedrückt, ohne das ein Feld aktiv war. Kann das sein? Heisst Deine Karte oder ein anderes Objekt“eeeeegfd“?

      Zur Not im Skript sicher gehen, daß es sich um ein Feld handelt:

      on keydown trallalla
        if word 1 of the target <> "field" then
          exit keydown
        end if
       ...
      end keydown
    • #14670
      Herby
      Teilnehmer

      Huhu,

      folgendes Grundproblem :

      on keydown
      answer target, the length of the target
      pass keydown
      end keydown

      für target gibt das Programm den Feldinhalt aus (nicht den Feldnamen) und
      als Länge immer ! 13 ! ??? (egal wie lange der string ist)

      Beste Grüße
      herby

    • #14672
      Klaus Major
      Verwalter

      „the length of the target“ liefert die Anzahl der Buchstaben in z.B. -> field „blabla“
      Ergibt immer 14 und nicht die Anzahl der Buchstaben IM Feld.

      Daher schrieb ich oben „the length of the TEXT of the target“. DAS ist der Inhalt. 🙂

      Bitte zeig doch mal Dein ganzes Kartenskript und welche Objekt aktuell auf Deiner Karte liegen und wie sie heissen. Meine erste Frage hast du ja leider noch nicht beantwortet.

      Bin jetzt aber erst mal für zwei Stunden weg.

    • #14679
      Herby
      Teilnehmer

      Hallo Klaus,

      unabhängig von meinem Programm (ich habe einen neuen Stack zum Testen erstellt, Feldname : Eingabe)
      Ich versuche immer unabhängig von einem Programm zu schreiben, da ich später das Problem im Programm löse^^.

      also:
      target liefert den Feldinhalt 123456789012345
      the length of the target bezieht sich aber auf den Feldnamen; field „Eingabe“ ergibt dann 15
      ! Dies müsste doch logischerweise die Länge vom Feld Eingabe liefern !

      gut, dann put ich target in eine variable

      on keydown thekey
      put target into xxx the lenght of the TEXT of THE TARGET bringt bei mir eine Fehlermeldung !
      answer the length of xxx —> dass ergibt endlich die tatsächliche Länge vom Feldinhalt
      pass keydown
      end keydown

      Das ist doch nicht nachvollziehbar (zumindest für mich).
      Aber du hast mir wieder einmal geholfen oder fällt dir noch etwas hierzu ein ?
      Beste Grüße
      Herby

    • #14681
      Herby
      Teilnehmer

      sorry, nicht verwirrt sein, da hat sich was im Text verschoben^^.

    • #14687
      Klaus Major
      Verwalter

      Wie gesagt:

      Bitte zeig doch mal Dein ganzes Kartenskript und welche Objekte aktuell auf Deiner Karte liegen und wie sie heissen.

    • #14709
      Herby
      Teilnehmer

      Hallo,

      ich habe das Problem nun so gelöst:

      on keydown xkey
         put the length of the target into x
         switch
            case x = 13
               if the length of fld "fdcd1" of card id 76194 < 20 then
                  pass keydown
               end if
               break
            case x = 14
               if the length of fld "fdcd22" of card id 76194 < 20 then
                  pass keydown
               end if
               break
         end switch
      end keydown

      Ich muss dabei für jedes Eingabefeld im Programm einen unterschiedlich lange Feldnamen vergeben, da der Name des Feldes nicht in target steht, sondern der Feldinhalt. (the length of the target : ist aber die Anzahl Chars vom Feldnamen ???)
      Weiterhin habe ich anfangs nicht die Card ID meiner Hauptkarte angegeben, darum die merkwürdigen Fehler.
      (keydown, returninfield usw. werte ich auf der Hauptkarte aus und nicht auf den einzelnen Karten)

      Besten Dank nochmals
      herby

    • #14713
      Klaus Major
      Verwalter

      Ich habe Dein Skript mal in die von Dir so verschmähten CODE Tags gesetzt.

      Schön, wenn es klappt, aber das kann es doch wirklich nicht sein!? :-/
      Du hast immer noch nicht meine Fragen beantwortet, wie lautet Dein ursprüngliches Kartenskript, was den Fehler ausgibt? Was liegt alles auf der Karte, die „nicht klappt“? Heisst Deine Karte oder ein anderes Objekt“eeeeegfd“? Und was ich sonst noch so gefragt hatte, ohne jemals eine Antwort darauf zu bekommen.

      Weiterhin habe ich anfangs nicht die Card ID meiner Hauptkarte angegeben

      Wie? Du meinst im Stackskript, oder?
      Das Skript einer Karte X hat keinen Einfluss auf die Objekte der Karte Y, oder mißverstehe ich Dich hier?

      Ihr macht es mir wirklich schwer, euch adäquat zu helfen, alles muss man euch aus der Nase ziehen! 😀

      Mein erstes SKript:

      on keydown trallalla
        if the lenght of the TEXT of THE TARGET < 20 then
           pass keydown
        end if
      end keydown

      funktioniert definitiv, ich habe es selber ausprobiert. Also warum sollte es nicht bei Dir funktionieren, mit ein paar Modifikationen entsprechend den Gegebenheiten Deines Stacks.

    • #14715
      Klaus Major
      Verwalter

      Ich muss dabei für jedes Eingabefeld im Programm einen unterschiedlich lange Feldnamen vergeben, da der Name des Feldes nicht in target steht, sondern der Feldinhalt. (the length of the target : ist aber die Anzahl Chars vom Feldnamen ???)

      Das KANN nicht sein, daher meine FLEHENTLICHE BITTE: Zeig das Skript!

    • #14721
      Herby
      Teilnehmer

      Hallo Klaus,

      über die Länge der Feldnamen kann ich unterscheiden, in welches Feld eingegeben wird und die entsprechenden Eingabelängen der Felder begrenzen. Ich habe derzeit drei Felder (fdein (4), fdeinx (20), fdeinxy (20)).
      Die Routine arbeite ich im Startstack ab.
      Ich denke, dass bei einer keydown-target Abfrage eigentlich im Target der Feldname stehen müsste und nicht der Feldinhalt. Somit kann ich nur über the length of the target herausfinden, welches Feld gemeint ist.
      Ich denke dies ist ein LiveCode-Bug.

      Dein Vorschlag war schon richtig für die aktuelle Karte. Ich habe aber unterschiedliche Eingabelängen.
      Danke für dein Hilfe und Geduld
      herby

      Medizinische Lernkarten (Startstack)

      global xpfd — Programmpfad
      global xdsg — Datensätze gesamt
      global xdsa — Datensätze Abfragemenge
      global xakt — Datensatz aktuell (random)
      global xanz — Anzahl Abfragen
      global xwdm — Abfrage deutsch/medizin
      global xwal — Abfrage mit/ohne Abfrage
      global xw12 — Sortierung deutsch/medizin

      on OpenStack
      if the environment is „mobile“ then
      set the fullscreenmode of me to „exactFit“
      put specialFolderPath(„resources“) & „/Medizin.db“ into ppfd
      put specialFolderPath(„documents“) & „/Medizin.db“ into xpfd
      put specialFolderPath(„resources“) & „/Lernkarten.db“ into qpfd
      put specialFolderPath(„documents“) & „/Lernkarten.db“ into ypfd
      if there is NOT a file xpfd then
      put url(„binfile:“ & ppfd) into url(„binfile:“ & xpfd)
      put url(„binfile:“ & qpfd) into url(„binfile:“ & ypfd)
      end if
      else
      put specialfolderpath(„resources“) & „/Medizin.db“ into xpfd
      put specialfolderpath(„resources“) & „/Lernkarten.db“ into ypfd
      end if

      –Variablen initialisieren

      set the twelveHourTime to false
      UhrAnzeige
      Loeschen
      DSgesamt
      DSabfrage
      put xdsa into fld „fddid“ of card id 1002
      put 0 into xanz
      put xanz into fld „fdaba“ of card id 1002
      put true into xwdm
      set the label of btn „bnmod“ of card id 1027 to „Ein“
      put true into xwal
      set the label of btn „bneoz“ of card id 1027 to „Ein“
      put false into xw12
      set the label of btn „bn1o2“ of card id 1032 to „medizin“
      put „deutsch“ into fld „fdwdm“ of card id 1002
      end OpenStack

      on DSabfrage — xdsa Wieviele Datensätze ausgewählt ?
      put revOpenDatabase(„sqlite“,xpfd, , , , ) into xsql
      put „SELECT ID FROM DBMedizin WHERE Lernen = 1“ into xsel
      put revDataFromQuery(tab,return,xsql,xsel) into xerg
      if xerg = empty then
      put 0 into xdsa
      else
      put xerg into xdsa
      end if
      revCloseDatabase xsql
      end DSabfrage

      on DSgesamt — xdsg Gesamtanzahl der Datensätze
      put revOpenDatabase(„sqlite“,xpfd, , , , ) into xsql
      put „SELECT ID FROM DBMedizin“ into xsel
      put revDataFromQuery(tab,return,xsql,xsel) into xerg
      put the number of lines of xerg into xdsg
      revCloseDatabase xsql
      end DSgesamt

      on Loeschen — Anzeige löschen
      put 0 into xakt
      set the visible of btn „bnloe“ of card id 1002 to false
      put empty into fld „fdbeg“ of card id 1002
      put empty into fld „fdbes“ of card id 1002
      put empty into fld „fderk“ of card id 1002
      end Loeschen

      on hiliteChanged
      if the hilited of widget „SwB“ of card id 1027 then
      set the disabled of btn „bndbz“ of card id 1027 to false
      set the disabled of fld „fdein“ of card id 1027 to false
      else
      set the disabled of btn „bndbz“ of card id 1027 to true
      set the disabled of fld „fdein“ of card id 1027 to true
      end if
      end hiliteChanged

      on returnInField
      if fld „fdein“ of card id 1027 is a number then
      put fld „fdein“ of card id 1027 into fld „fdein“ of card id 1027
      end if
      if fld „fdeinx“ of card id 76194 then
      put fld „fdeinx“ of card id 76194 into fld „fdeinx“ of card id 76194
      end if
      if fld „fdeinxy“ of card id 76194 then
      put fld „fdeinxy“ of card id 76194 into fld „fdeinxy“ of card id 76194
      end if
      end returnInField

      on keydown xkey
      put the length of the target into x
      switch
      case x = 13
      if the length of the fld „fdein“ of card id 1027 < 4 then
      pass keydown
      end if
      break
      case x = 14
      if the length of the fld „fdeinx“ of card id 76194 < 20 then
      pass keydown
      end if
      break
      case x = 15
      if the length of the fld „fdeinxy“ of card id 76194 < 20 then
      pass keydown
      end if
      break
      end switch
      end keydown

      on UhrAnzeige
      put the time into fld „uhr“ of card id 1002
      send UhrAnzeige to this stack in 250 milliseconds
      end UhrAnzeige

      on closeStack
      quit
      end closeStack

    • #14723
      Klaus Major
      Verwalter

      Hast Du eigentlich etwas gegen meine Hilfe? Ich hatte mehrmals gebeten, doch bitte die CODE Tags zu benutzen, dann bleibt die Formatierung der Skripte erhalten und man kann das gut lesen.

      Und ja, ich nehme so etwas persönlich, da etwas Entgegenkommen für meine Hilfe wirklich nicht zu viel verlangt ist!

      So, genug gemotzt:
      Also das ist das STACK Skript und nicht das Skript einer Karte, wie Du oben gesagt hattest?
      Solche „Kleinigkeiten“ sind auch sehr wichtig!

      Ich denke, dass bei einer keydown-target Abfrage eigentlich im Target der Feldname stehen müsste und nicht der Feldinhalt. Somit kann ich nur über the length of the target herausfinden, welches Feld gemeint ist. Ich denke dies ist ein LiveCode-Bug.

      Nein, das ist kein Bug, das funktioniert, da ist etwas in Deinem Stack im Argen! Das kann ich aber so aus der Ferne nicht herausfinden.

      on returnInField
         if fld "fdein" of card id 1027 is a number then
            put fld "fdein" of card id 1027 into fld "fdein" of card id 1027
         end if
         if fld "fdeinx" of card id 76194 then
            put fld "fdeinx" of card id 76194 into fld "fdeinx" of card id 76194
         end if
         if fld "fdeinxy" of card id 76194 then
            put fld "fdeinxy" of card id 76194 into fld "fdeinxy" of card id 76194
         end if
      end returnInField

      „if fld „fdeinx“ of card id 76194 then“
      „if fld „fdeinxy“ of card id 76194 then“
      If fld xyz = WAS?
      Oder steht in diesen Felder TRUE oder FALSE?

      if the length of the fld "fdein"
      Bitte lass das THE hier weg. THE ist nur für Properties notwendig:
      THE height of btn xyz, THE text of fld zyx etc…

      send UhrAnzeige to this stack in 250 milliseconds
      Die Nachricht, die Du SENDen willst, sollte auch in Anführungszeichen stehen.

      Du solltest Deinen Karten wirklich einen Namen geben, „eingabe“ ist wesentlich einprägsamer als -> ID 4711
      Bei ein paar wenigen Karten mag das noch angehen, aber wenn Deine Projekte mal etwas komplexer werden, wirst Du das zu schätzen wissen! Also früh an solchen Sachen gewöhnen, auch wenn es schwer fällt. 😎

      Wenn Du magst, kannst Du mir gerne mal den Stack zuschicken, oder eine abgespeckte Version davon, dann checke ich das mal mit den Feldern! Die Datenbanken etc. benötige ich nicht dafür.
      -> klaus AT major-k.de

    • #14746
      Herby
      Teilnehmer

      Hallo lieber Klaus,

      ich darf nun auch ein wenig motzen.

      ich habe oben geschrieben, dass ich unabhängig von meinem Stack mit ON KEYDOWN kein richtiges Ergebnis mit TARGET bekomme. Du bist darauf nicht eingegangen. Ich habe nun (UNABHÄNGIG VON MEINEM PROGRAMMMIST!) ein Feld in einem neuen Stack angelegt (Name egal!) und in den neuen MAINSTACK (soheißtesrichtig!) folgendes geschrieben :

      on keydown xkey
         answer target
         answer the length of the target
         pass keydown
      end keydown

      Wenn ich nun in dem Feld etwas eingebe,
      liefert : target : den Feldinhalt
      liefert : the length of the target : die Länge des Feldnamen

      „THE“ kann ich dabei nicht weglassen, denn
      answer length of the target : bringt einen Fehler
      answer the length of target : ergibt die Länge des Feldinhaltes -1 : (noch mehr ???)

      Mit einem Button funktioniert es wunderbar. Also schließe ich weiterhin daraus, dass dies ein LiveCode Fehlerchen sein könnte und ich nur mit unterschiedlichen Feldnamenlängen meine Felder auswerten kann.
      Vielleicht fällt dir hierzu noch etwas ein, dass ich unabhängig von meinem Stack testen kann.

      Anmerkung

      Wenn ich in einem Feld RETURN eingebe, verschwindet die Eingabe vom Bildschirm, darum stelle ich mit Hilfe von returnInField den Feldinhalt wieder ins Feld. Gibt es da eine bessere Lösung ?

      Den CODE-Button habe ich nun brav ausprobiert.

      Meine Karten haben alle Namen. Ich werde versuchen den Namen in den Programmcode zu schreiben.

      Die Felder, Buttons, usw. in „“ setzen werde ich machen, wenn ich vielleicht irgendwann meine App in den Shop stelle. Davon bin ich aber meilenweit entfernt, und darum ist es mir zunächst egal.

      Gerne würde ich dir meinen gesamten Stack einmal zusenden, aber ich versuche ihn zunächst (mit Hilfe des Forums) soweit zu verbessern, wie es mir möglich ist.

      Ich nehme nix persönlich, nicht einmal einen motzenden Klaus^^.

      Also, beste Grüße
      herby

    • #14751
      Klaus Major
      Verwalter

      Hallo Herby,

      Du hast ja recht, tut mir leid! Danke für Dein Verständnis.
      Ich war etwas genervt, weil Du ums verrecken nicht Dein Skript posten wolltest! 😀

      THE
      Ich schrieb, daß Properties mit THE angesprochen werden müssen, aber nicht LC objekte:
      Ja: put THE length of fld 1
      Nein: put the length of THE field 1

      (THE) TARGET
      Das ist kein Bug, sondern ein Feature! 🙂
      Was mir nicht bewusst war, ist die Tatsache daß TARGET tatsächlich etwas Anderes als THE TARGET ist!?

      TARGET liefert tatsächlich den Inhalt eines Feldes, sofern das Feld Gegenstand des aktuellen Skripts ist.

      THE TARGET ist eine Funktion, die den Namen des aktuellen Objektes liefert!
      Man lernt nie aus.

      Ich würde es daher so machen:

      on keydown 
         put the target into tZiel
         ## -> field "dddd"
         
         put the short name of the target into tZielName
         ## -> dddd
         
         ## Kein Feld? Dann weg hier
         if word 1 of tZiel <> "field" then
            pass keydown
         end if
         
         ## Nun checken welches Feld die KEYDOWN Message erhatlen hat
         switch tZielName
            case "fdein"
               put 4 into tMaxChars
               break
               
               ## Gilt für beide Felder:
            case "fdeinx"
            case "fdeinxy" 
               put 20 into tMaxChars
               break
         end switch
         
         ## Jetzt erst reagieren
         if the num of chars of the text of the target <= tMaxChars then
            pass keydown
         end if
      end keydown

      Getestet und funktioniert.

      RETURN (in field)
      Da reicht ein DUMMY Handler aus 😀
      Also ein Handler, der die Message abfängt, aber nichts macht:

      on returninfield
       ## nada
      end returninfield

      Wie gesagt, Dein Skript macht nur was für das erste Feld,
      if fld "fdein" of card id 1027 is a number then
      danach fehlt eine Bedingung:
      if fld "fdeinx" of card id 76194 then
      if fld xy = WAS?
      Aber mit dem DUMMY brauchst Du das ja nicht mehr.

      Yo, das hätte wir nun also geklärt mit (THE) TARGET, daher brauchst Du mir den Stack eigentlich auch nicht mehr zu schicken. Es sei denn, Du hast noch andere Fragen oder Probleme damit.

      Gruß

      Klaus

    • #14758
      Herby
      Teilnehmer

      Ich bin beeindruckt von dem Klaus. Echt gut !

    • #14760
      Klaus Major
      Verwalter

      Ich bin beeindruckt von dem Klaus.

      Zu recht, Herby, völlig zu recht! 😀

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