Startseite › Foren › Deutsches LiveCode-Forum › Begrenzte Länge von Eingabefelder
- Dieses Thema hat 18 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 5 Jahren, 11 Monaten von
Klaus Major.
-
AutorBeiträge
-
-
Mai 10, 2019 um 13:52 Uhr #14660
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 ifif the length of fld fdcd2 > 20 then
wait 10 milliseconds
else
pass keyDown
end ifend 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 -
Mai 10, 2019 um 14:07 Uhr #14662
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
-
Mai 10, 2019 um 14:31 Uhr #14664
Hallo lieber Klaus,
vielen Dank wieder einmal für deine schnelle Antwort.
TARGET werde ich ausprobieren.
Die Anführungszeichen baldmöglichst.Danke Herby
-
Mai 10, 2019 um 14:52 Uhr #14666
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 21Ich schreib dies schon einmal und probiere aber natürlich weiter aus.
Beste Grüße
herby -
Mai 10, 2019 um 15:00 Uhr #14668
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
-
Mai 10, 2019 um 15:26 Uhr #14670
Huhu,
folgendes Grundproblem :
on keydown
answer target, the length of the target
pass keydown
end keydownfü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 -
Mai 10, 2019 um 15:36 Uhr #14672
„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.
-
Mai 10, 2019 um 16:16 Uhr #14679
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 keydownDas 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 -
Mai 10, 2019 um 16:18 Uhr #14681
sorry, nicht verwirrt sein, da hat sich was im Text verschoben^^.
-
Mai 10, 2019 um 16:59 Uhr #14687
Wie gesagt:
Bitte zeig doch mal Dein ganzes Kartenskript und welche Objekte aktuell auf Deiner Karte liegen und wie sie heissen.
-
Mai 10, 2019 um 20:58 Uhr #14709
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 -
Mai 10, 2019 um 21:26 Uhr #14713
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.
-
Mai 10, 2019 um 21:27 Uhr #14715
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!
-
Mai 11, 2019 um 11:44 Uhr #14721
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
herbyMedizinische 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/medizinon 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 OpenStackon 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 DSabfrageon 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 DSgesamton 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 Loeschenon 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 hiliteChangedon 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 returnInFieldon 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 keydownon UhrAnzeige
put the time into fld „uhr“ of card id 1002
send UhrAnzeige to this stack in 250 milliseconds
end UhrAnzeigeon closeStack
quit
end closeStack -
Mai 11, 2019 um 12:15 Uhr #14723
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 -
Mai 12, 2019 um 11:54 Uhr #14746
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 -
Mai 12, 2019 um 12:49 Uhr #14751
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
-
Mai 12, 2019 um 13:11 Uhr #14758
Ich bin beeindruckt von dem Klaus. Echt gut !
-
Mai 12, 2019 um 13:21 Uhr #14760
Ich bin beeindruckt von dem Klaus.
Zu recht, Herby, völlig zu recht! 😀
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.