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
        Administrator

          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
              Administrator

                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
                  Administrator

                    “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
                        Administrator

                          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
                            Administrator

                              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
                              Administrator

                                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
                                  Administrator

                                    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
                                      Administrator

                                        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
                                          Administrator

                                            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.