Begrenzte Länge von Eingabefelder

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

Dieses Thema enthält 18 Antworten und 2 Teilnehmer. Es wurde zuletzt aktualisiert von  Klaus Major vor 3 Monate, 1 Woche.

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

    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
    Moderator

    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
    Moderator

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

    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
    Moderator

    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
    Moderator

    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
    Moderator

    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
    Moderator

    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
    Moderator

    Ich bin beeindruckt von dem Klaus.

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

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