Gambas France BETA


Pas de compte ? Incription

Comment insérer une variable texte dans une textbox ?

Ce sujet est résolu.

12
AuteurMessages
siscard06#1 Posté le 21/5/2012 à 08:45:54
Bonjour tous les Gambas,

Je suis un débutant aussi j'espère que vous me pardonnerez la naïveté de ma question, mais j'ai pas trouvé la réponse pour finaliser mon premier projet qui est tout simple :

Afficher le poids des objets posés sur une balance électronique via port série RS232.

J'ai testé l'exemple fourni SerialPort fourni avec G 3.1.1 qui fonctionne bien, mais trop complet pour ce que je voudrais.
Spheris m'a déjà aidé un peu, mais j'y arrive toujours pas.

Le code :
' Gambas class file

Public Sub SPort_Open()
'Ouvir le port série, les paramètres sont dans le formulaire
SPort.Open()
End

Public Sub SPort_Read()
'Créer la variable, y verser le flux, l'afficher dans la TextBox
Dim Poids As String
SPort.Read, Poids, Lof(Sport)
TextBox1.Text = Poids
End

Public Sub Button1_Click()
'un bouton pour tout fermer proprement
SPort.Close()
FMain.Close()
End

Qu'est-ce qui cloche la-dedans ?

Précision : La balance est réglée pour envoyer un texte de 17 caractères alpha-numériques chaque fois que sa valeur devient stable, il faudrait donc qu'il s'affiche jusqu'à ce qu'une nouvelle valeur arrive. ON peut aussi la régler pour un envoi continu ou par intervalle de temps, voire à la demande de l'utilisateur (envoyer un P+CR+LF ou appuyer sur la touche "Print").
Les paramètres de communication sont bien sûr identiques sur l'émetteur et le récepteur (9600 8N1).

Quelqu'un veut-il bien m'aider encore un peu ? Merci

La doc manque encore de tutos simples de ce genre pour les parfaits débutants, surtout ceux qui sont réfractaires à l'anglais comme moi!
J'ai pas réussi à lire une seule page du manuel; n'y a-t-il pas des automates pour traduire ?

PS Pour ma part j'avais appris un peu le basic à l'époque de l'Atari ou du Commodore 64 ou il n'y avait rien, même pas la couleur, ni la souris, et depuis j'avais touché un peu à Delphi, sans vraiment pratiquer, mais j'ai vu faire.
Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
siscard06#2 Posté le 21/5/2012 à 09:13:29
SPort.Read, Poids, Lof(Sport)
Faux, mais avec Read #SPort, Poids, Lof(Sport)

C'est pas mieux

Merci

Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Gamux#3 Posté le 21/5/2012 à 10:30:02
Bonjour,

Il est préférable de récupérer le poids à la demande gràce à la touche préconisée par le constructeur.
Pour faire cela il faut que tu envoies la séquence suivante à la balance
Print #Sport, "P"; Chr$(13); Chr$(10)
Puis tu fais ensuite la lecture de la valeur envoyée par la balance en appelant ta fonction _read
Et enfin tu formates ta valeur
Try TextBox1.Text = Format$(Val(Left$(poids, 9)), "0.000")

siscard06#4 Posté le 21/5/2012 à 11:57:01
Bonjour Gamux et merci de ta réponse.

Premier essai dans l'exemple SerialPort, je tape : "P"; Chr$(13); Chr$(10) avec les guillemets et les points virgule
et j'appuie sur le bouton CR, Pas de réponse, pas plus quand j'appuie sur Print de la balance

Deuxième essai dans mon projet
J'insère : TextBox1.Text = Format$(Val(Utils.cpoint(Left$(Poids, 9))), "0.000")
à la place de TextBox1.Text = Poids
(Cette formule dit que l'on ne garde que les 9 caractères de gauche de Poids et on les affiche au format "#.###"; si je comprends bien)
Réponse au débogage :
Identificateur inconnu : Utils dans Fmain.class:13

Je fais mon apprentissage avec Gambas3.1.1 à cause de Laurux (très bien pour la gestion de ma petite entreprise agricole) qui vient de passer en V3, donc pas la peine de garder la V2
Pour ce premier projet je voulais juste faire un répétiteur de l'écran de la balance que mes clients puisse voir en même temps que moi, c'est pour ça que j'avais choisi le mode 'envoi sur stabilité'.
Ce mode de transfert ne gène pas Laurux.Pos pour récupérer ponctuellement la valeur envoyée et l'insérer dans le ticket en cours. Par contre, ça va peut être coincer s'il y a 2 utilisateurs simultanés pour le même port série. Faudra donc que je leur demande s'il veulent bien ajouter cet afficheur dans un coin.

Pour continuer mon apprentissage, je voudrais quand même aboutir à quelque chose à partir de ça pour faire par exemple des étiquettes de produits préconditionnés.

Merci de ta patience

Pour info, je suis sous Ubuntu depuis 2 ans mais je reste avec Natty 11.04, car j'ai pas aimé la nouvelle interface de l'Ocelot et j'ai eu des pb avec Synaptic
Quant à passer à Pandolin, je crois que vais court en mémoire (512 Mo sur le fixe et 380 sur le portable) j'irai pas loin, et le mot HA est bani de mon vocabulaire. Ce que je trouve de bien dans Linux, c'est que pour pas cher, on peut faire beaucoup de choses à condition de mettre le nez dedans.
Il me semble que la méthode de programmation de Gambas est assez simple, mais il me manque le petit truc qui fait que ça roule.


Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Gamux#5 Posté le 21/5/2012 à 12:30:33
Soyons logique,
en premier il faut paramétrer, si besoin, la balance pour qu'elle envoie ses données à la demande.
Cela étant fait, quant tu as besoin de récuperer un poids tu appuies sur la touche "P" ce qui va déclencher la commande Gambas : Print #Sport, "P"; Chr$(13); Chr$(10).
Cette commande passe à la balance une séquence d'un caractère qui lui demande d'envoyer le poids. C'est cette donnée que tu va récupérer ensuite avec Gambas : Read #SPort, Poids, Lof(Sport)
siscard06#6 Posté le 21/5/2012 à 13:53:04
Merci Gamux,

La balance est reparamétrée en Autoprint = Off
Dans SerialPort je tape : "P"; Chr$(13); Chr$(10) puis CR, j'obtiens ES puis, lorsque j'appuie sur la touche Print, le poids s'affiche dans la textarea à la suite.

Dans Monprojet, j'ai inséré la ligne : Print #SPort, "P"; Chr$(13); Chr$(10) avant TextBox1.Text = Format$(Val(Utils.cpoint(Left$(Poids, 9))), "0.000").

En lançant le débogage, je retombes sur :Identificateur inconnu : Utils dans Fmain.class:13.

Pour voir si ça marche, je remplace TextBox1.Text = Format$(Val(Utils.cpoint(Left$(Poids, 9))), "0.000") par TextBox1.Text = Poids.
Ca passe au débogage, mais je n'obtiens toujours rien dans ma TextBox même en appuyant sur la touche Print.

Une autre suggestion ?
Merci encore
Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Gamux#7 Posté le 21/5/2012 à 14:16:05
Try TextBox1.Text = Format$(Val(Left$(poids, 9)), "0.000")
siscard06#8 Posté le 21/5/2012 à 14:44:22
Rien de mieux :

' Gambas class file
Public Sub SPort_Open()

SPort.Open()

End

Public Sub SPort_Read()

Dim Poids As String
Print #SPort, "P"; Chr$(13); Chr$(10)
Read #SPort, Poids, Lof(SPort)
TextBox1.Text = Format$(Val(Left$(poids, 9)), "0.000")

End

Public Sub Button1_Click()

SPort.Close()
FMain.Close()
End

Qu'en pensez-vous ?

Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Prokopy#9 Posté le 21/5/2012 à 18:25:19
Kinder PinguiEn Gambas 3, la syntaxe de Read a changé. Ce n'est plus :

1
READ #SPort, Poids, Lof(Sport)


... mais :

1
Poids = READ #SPort, Lof(Sport)


Plus d'infos ici : http://gambasdoc.org/help/lang/read?fr&v3
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
siscard06#10 Posté le 21/5/2012 à 19:51:15
Merci Prokopi,

mais ça ne marche toujours pas.
puisqu'il n'est pas nécessaire d'envoyer quoique ce soit pour recevoir, j'ai remis la balance en mode Autoprint = on Stabilité.
Il me reste donc ça :

Public Sub SPort_Open()

SPort.Open()

End

Public Sub SPort_Read()

Dim Poids As String
Poids = Read #SPort, Lof(Sport)
TextBox1.Text = Poids
End

Public Sub Button1_Click()

SPort.Close()
FMain.Close()
End

Qu'est-ce qui cloche ?
Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Prokopy#11 Posté le 21/5/2012 à 19:57:56
Kinder Pingui
1
2
3
4
5
PUBLIC SUB SPort_Open()

SPort.Open()

END


Le problème est là : l'objet SerialPort n'a pas d'évènement Open. Cette méthode n'est donc jamais appelée, l'instruction SPort.Open() jamais exécutée, le port jamais ouvert et donc ... rien n'y arrive. :)

Il faut donc que tu places l'instruction SPort.Open() ailleurs, à l'ouverture de ton formulaire ou au clic d'un bouton par exemple.
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
siscard06#12 Posté le 22/5/2012 à 07:27:07
Bonjour et grand merci Prokopy,

Ah que voila un grand pas dans la traversée du désert, et ça m'a appris plein de choses !

J'ai essayé Fmain_Open() à la place de SPort_Open'), mais ça n'a pas marché.
J'ai donc ajouté un bouton Button2_Click "Ouvrir" et j'ai une valeur qui s'affiche... mais hélas disparait immédiatement.
Comment faire pour que l'affichage perdure jusqu'à réception d'une nouvelle valeur, peut-être enlever de CRLF à la fin du flux avec la fonction Left(Poids, 15)?

J'ai vu qu'on pouvait rédiger la commande Read de 2 façons, mais je garde celle avec la variable pour une utilisation ultérieure (imprimer avec d'autres informations comme DLUO calculée à partir de la date du jour par exemple)

Une idée ? merci

Pour traverser le désert, il faut et il suffit de mettre un pied devant l'autre et de recommencer
Euh, c'est quoi RTFM ?
Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
Gamux#13 Posté le 22/5/2012 à 12:26:47
Peut-être fermer le port avant d'afficher le poids.
Prokopy#14 Posté le 22/5/2012 à 18:55:45
Kinder PinguiOu plus simplement, vérifier si ce que tu reçois n'est pas vide avant de l'afficher :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUBLIC SUB SPort_Read()

DIM Poids AS STRING

Poids = READ #SPort, Lof(Sport)

IF Len(Trim(Poids)) = 0 THEN RETURN

TextBox1.Text = Poids

EndPublic Sub SPort_Read()

DIM Poids AS STRING
Poids = READ #SPort, Lof(Sport)
TextBox1.Text = Poids
END


La fonction Trim permet de retirer tous les espaces blancs (espaces, CR, LF et tabulations) situés avant et après une chaîne.

Plus d'infos sur les manipulations de chaînes :

http://gambasdoc.org/help/cat/string?fr&v3
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
siscard06#15 Posté le 23/5/2012 à 16:50:25
Bonjour Prokopy,

Deux remarques et une question svp :
- Ligne 7 signifie si longueur de Trim de Poids = 0 alors Return; vers ou?
- Ligne 11 EndPublic Sub sur la même ligne ? donc je renvoie Public Sub Ligne 12 non ?
- Ligne 1 = Ligne 12 = Gambas rouge colère : SPort_Read() 2 fois ? Gambas pas compris.
donc j'enlève tout entre ligne 11 End et ligne 16 End

La formule ligne 7 n'apporte rien de mieux, j'enlève Trim() puis Len() et je remplace 0 par "" puisque Poids est un String.
Petites Modifs :
- Ligne 3 : Je me suis demandé si Dim Poids AS String ne remettait pas Poids à "", j'ai essayé de la mettre ailleurs, dans Fmain_Open(), mais ça n'a pas convenu non plus à Gambas, donc retour ligne 3
- Ligne 9 devient Poids = "Poids =" & Poids : La j'ai au moins P = qui s'affiche
- Je mets une Tare à la balance pour avoir un poids net : Encore mieux, j'ai P = N. il y a donc quque chose qui arrive mais ou sont donc passés les chiffres et les kg ?

Il me reste actuellement :
' Gambas class file

Public Sub Button2_Click()

SPort.Open()

End

Public Sub SPort_Read()
Dim Poids As String
Poids = Read #SPort, Lof(Sport)
TextBox1.Text = "P = " & Poids
End

Public Sub Button1_Click()
SPort.Close()
FMain.Close()
End

Qui affiche : P = N + un petit carré qui ressemble à une plaque de cuisson
Aouwé ? j'ai vu passer un P = 3 kg N, mais une fois seulement et arrondi encore

Plus en message encours de débogage dans l'onglet Console :
- (Affiche_balance:2309): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

Encore un petit coup de main ?
On va y arriver !!!

Si tu veux rendre un homme heureux un jour, donnes lui à manger
Si tu veux le rendre heureux toute sa vie, apprends lui à pêcher
12