Champ saisissable par l'utilisateur (textbox) : comment stocker

OS : Windows
4D : v15.4

Bonjour à tous
Après avoir cliquer sur un bouton, je souhaite récupérer le contenu
d’un champ que l’utilisateur saisie (une textbox).
Mon code fonctionne uniquement lorsque le champ n’est pas vide. Et
justement, j’ai besoin de vérifier que ce champ ne soit pas vide avant
d’enregistrer son contenu dans une variable.
Je voudrais donc savoir, que contient un champ saisissable par
l’utilisateur lorsqu’il est vide ?

J’ai essayé d’écrire ce code :

maVariable:=String(monChampSaisie)

Mais quand il n’y a rien d’écrit dans “monChampSaisie”, 4D me dit :

  • “Il manque une expression heure ou une référence à un document ou une expression numérique ou une expression date ou une expression booléenne ou une expression alphanumérique.”
  • ET “les arguments sont incompatibles”

J’ai donc essayé d’écrire

If (monChampSaisie#"")
maVariable:=String(monChampSaisie)
End if

Maintenant 4D me dis :

  • “les arguments sont incompatibles”
  • “il manque un argument de type booleen”

C’est un problème surement basique pour vous, mais j’ai l’habitude de développé dans d’autres langages, et je n’ai pas ce soucis, je gère les erreurs autrement.
Quelqu’un à-t-il une solution à me proposer SVP ? :slight_smile:

Bonjour

et ça ?

If (monChampSaisie#"")
maVariable:=monChampSaisie 
End if

La fonction “String” sert à convertir en texte une valeur qui n’en est pas.Donc par exemple une date, un numérique, une heure…

Donc string(monChampSaisie ) pose un problème à 4D qui attend tout sauf une chaîne de caractères. (Bon, il est un peu trop rigoureux sur ce coup là, il pourrait accepter une chaine, même si ça ne sert à rien ça ne coûte pas cher)

Bonjour
Tout d’abord merci de votre réponse, mais ca ne fonctionnait pas non plus, j’avais déjà essayé.

La solution que j’ai trouvé c’est d’initialiser, au chargement, le contenu de ma textbox :

maTextBox:=""

Comme ce je suis sur qu’elle n’est pas vide, et il n’y a plus de soucis avec l’inscription dans une variable après.

Je trouve pas cette solution “propre”, parce que la, dans mon formulaire, j’ai une quinzaine de textBox… Je fais donc 15 initialisation, je trouve ca moche. Donc si quelqu’un à une solution plus belle, je suis preneur :slight_smile:

J’ai l’impression que tu utilises des variables dynamiques non “pré-déclarées”, sans quoi le test :
si(maVariable="")
devrait fonctionner sans protester.

J’ai pas saisi le dernier message…

En fait, le but final c’est de faire cette opération

If (maTextBox="")
Alert(“Veuillez remplir la textbox”)
Else
maVarible:=maTextBox
End IF

Ce code fonctionne uniquement si maTextBox n’est pas vide. Si elle est vide, 4D m’envois un message d’erreur.
J’ai donc ajouté, au chargement du formulaire :

maTextBox:=""

Comme ça, quoi qu’il arrive, mon test précédent fonctionne.
Mais étant donné que j’ai 15 textbox, je trouve ca moche d’écrire 15 fois { maTextBox:="" }

(Je suis désolé si c’est pas ce que tu demandais, on s’est peut etre mal compris. Mais en tout cas, merci pour l’intérêt que tu portes à mon soucis)

: Bastien ROUSSEL

J’ai pas saisi le dernier message…
Bin, en fait c’est pas plus mal, j’ai dit n’importe quoi :oops:

: Bastien ROUSSEL

Ce code fonctionne uniquement si maTextBox n’est pas vide. Si elle
est vide, 4D m’envois un message d’erreur.
Ce n’est pas le fait que ta variable “n’est pas vide” qui cause l’erreur, c’est le fait qu’au moment où tu fait le test If (maTextBox=""), rien n’a encore permis à 4D de savoir si maTextBox est une date, une heure, une image, un nombre, un texte, etc. L’erreur signifie qu’il ne peut par comparer un truc non identifié avec un texte, fut-il vide.

En ajoutant maTextBox:="" au chargement, tu as “fait rentrer” une chaine dans maTextBox, ça a permis à 4D de déduire que maTextBox était un texte. Tu as fait un typage implicite. C’est pour ça que l’erreur disparait quand tu compares plus tard au texte vide. Si tu avais fait :
maTextBox:=Current date
4d aurait déduit que maTextBox était une date
maTextBox:=Current time
4d aurait déduit que maTextBox était une heure
etc.

Outre ce typage implicite, tu as le typage explicite. On sait parfaitement, quand on conçoit un formulaire, qui va recevoir le nom (texte), la date de naissance (date), la photo (image), etc. 4D te permet de déclarer ces variables avec des http://doc.4d.com/4Dv16/4D/16/Commandes-du-theme-Compilateur.300-3035791.fr.htmldirectives de compilation>. Concrètement, si tu mets :
C_TEXT(maTextbox)
4D saura une fois pour toutes que maTextbox est un texte. C’est beaucoup mieux d’être explicite.

Ahhh très bien, merci beaucoup, excellente explication !! J’ai enfin compris :smiley:

Je pensais que le fait de mettre dans les propriétés “type de variable : texte” suffisait à 4D pur comprendre que c’était du texte.

Encore merci, je peux mettre le sujet en résolu

: Bastien ROUSSEL

Je pensais que le fait de mettre dans les propriétés “type de
variable : texte” suffisait à 4D pur comprendre que c’était du texte.
J’ai évité ce point pour ne pas brouiller les pistes, mais puisque tu en parles…

Ce typage via les propriétés ne concerne que les variables dynamiques (je préfèrerais dire variable locale de formulaire, mais ça n’est pas la terminologie “officielle”.)

Si tu dessines une variable dans un formulaire et que tu effaces sa propriété Nom de la variable, tu as créé une variable dynamique, qui n’existera qu’entre Sur chargement et le Sur libération du formulaire. C’est http://doc.4d.com/4Dv16/4D/16/Variables.300-3036050.fr.htmldétaillé ici>.
[]19286469;“Your comment here…”[/]

Si une variable n’a d’autre raison d’exister que le contexte dudit formulaire (on n’en a besoin ni avant ni après), elle d’une part plus économique en mémoire et d’autre part son typage n’a de sens que dans contexte du formulaire. D’où la possibilité d’indiquer à 4D le type de cette variable dynamique via la propriété “Type de la variable”.

Mais pour les variables “non dynamiques” (process, interprocess) cette propriété est ignorée : passage obligé par le typage implicite ou explicite vu avant.

D’accord. Tout s’éclaire :smiley:
Encore merci pour tout !!