Gambas France BETA


Pas de compte ? Incription

Déplacer données dans TextArea vers TableView

12
AuteurMessages
pinky#1 Posté le 6/11/2024 à 10:48:17
Bonjour,
Mon application est composée d'une TextArea dans laquelle je colle des données qui sont affichées comme ceci dans la TextArea :
1
0 1.525 10 12.85 20 18 30 25.654


Il s'agit donc de données relevées tous les 10 kms.
La valeur au départ (donc au km 0 est de 1.5), la valeur au km 10 est de 12.8, etc ...
Les valeurs peuvent être avec ou sans point.
L'échelle pour les kms est toujours de "10" en "10" et commence à "0".

Le but de mon application est de déplacer les données contenues dans la TextArea, à l'aide d'un Button, dans un TableView qui possède deux colonnes (Colonne 1 pour les kms et colonne 2 pour les valeurs).



Auriez vous un exemple connu (Ou un tuto) qui explique comment faire ceci. Peut être que mon choix TextArea vers TableView n'est pas adapté à ce que je veux faire, je ne sais pas.

J'ai fouiné sur le forum et dans les exemples d'applications sur la Forge mais je n'ai pas trouvé comment faire.

Merci d'avance pour votre aide.
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
vuott#2 Posté le 6/11/2024 à 11:48:47
Ne cedere ineluctabili possimusIl serait peut-être possible de faire quelque chose de ce genre :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
PUBLIC SUB Form_Open()

' Attribuons les valeurs de votre exemple au TextArea :
TextArea1.Text = "0 1.525 10 12.85 20 18 30 25.654"

' Créons un simple TableView de base :
WITH TableView1
.Rows.Count = 2
.Columns.Count = 2
END WITH

END


PUBLIC SUB Button1_Click()

DIM ss AS String[]

' Nous supprimons les espaces de la chaîne de valeurs, pour n'avoir que des valeurs numériques :
ss = Split(TextArea1.Text, Chr(32))

' Nous attribuons le nombre correct et utile de lignes au TableView :
TableView1.Rows.Count = ss.Count / 2

' Nous identifions chaque ligne dans le TableView :
FOR r AS SHORT = 0 TO TableView1.Rows.Max
' Nous identifions les deux colonnes du TableView :
FOR c AS BYTE = 0 TO 1
' Nous attribuons la valeur du premier élément existant du tableau « ss » à la colonne correspondante :
TableView1[r, c].Text = ss[0]
' Nous supprimons le premier élément du tableau « ss » de sorte que le nouveau premier élément soit celui qui suit l'élément supprimé :
ss.Delete(0, 1)
NEXT
NEXT

END
« Vita non suavis esse potest, nec Mors amara. »
pinky#3 Posté le 6/11/2024 à 12:44:13
Bonjour vuott et merci. Quelle rapidité.
C'est plus compliqué que je le pensais.
Je vais bien examiner ton code afin d'essayer de le comprendre et faire des tests.
Je reviendrai te dire ce que ça donne.
Je te remercie pour le temps passé sur ce code. ;)
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
O.Coquet#4 Posté le 6/11/2024 à 12:56:07
Ce qui n'est pas devra-t-être inventéLa question que je me pose avant toutes choses est:

Comment tes données arrivent-elles dans ce textarea ?????
Amitié
Olivier (Alias Olinux)

Raspberry pi 3 et 4, pc Xubuntu, Arduino.....
Quelques autres "vieux" ordinateurs !
Et un bon fer à souder
pinky#5 Posté le 6/11/2024 à 13:07:20
Bonjour Olivier,
Par un simple copier/coller provenant d'une autre application.
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
pinky#6 Posté le 6/11/2024 à 13:22:48
Je viens de tester ton code vuott
J'ai l'impression que c'est exactement ce que je cherchais à faire depuis plusieurs jours. Tu m'as fait ça en quelques minutes. Je suis impressionné. :shock:
Peux tu me dire à quoi sert ce morceau de code ?
1
Chr(32)

Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
vuott#7 Posté le 6/11/2024 à 14:27:20
Ne cedere ineluctabili possimus
Peux tu me dire à quoi sert ce morceau de code ?
1
Chr(32)


Comme je l'ai écrit dans le commentaire de cette ligne de commande: "Nous supprimons les espaces de la chaîne de valeurs, pour n'avoir que des valeurs numériques"; ...je suppose que vous souhaitez exclure le caractère « espace » (numéro décimal ASCII = 32, en hexadécimal = 20) des valeurs que vous saisissez dans les cellules de "TableView".

La fonction "Split()" divise une chaîne en sous-chaînes délimitées par des séparateurs et des caractères d’échappement.
Cette fonction renvoie un tableau de chaînes rempli avec chaque sous-chaîne détectée.

Si vous ne souhaitez pas utiliser la fonction "Chr()", vous pouvez utiliser le caractère 'escape' "\x" suivi de la valeur hexadécimale ASCII du caractère "espace":
1
ss = Split(TextArea1.Text, "\x20")

ou plus simplement en définissant explicitement le caractère de l'"espace":
1
ss = Split(TextArea1.Text, " ")
« Vita non suavis esse potest, nec Mors amara. »
pinky#8 Posté le 6/11/2024 à 14:58:40
Merci pour les explications.
Je voulais en effet supprimer les espaces. Le code fonctionne parfaitement pour les espaces.
Y a t'il ce même genre de fonction pour supprimer les retours à la ligne dans le texte que je copie pour coller dans la TextArea ?
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
vuott#9 Posté le 6/11/2024 à 15:13:35
Ne cedere ineluctabili possimusPar « retours à la ligne », vous entendez probablement la « fin de la ligne ».

Vous pouvez utiliser :

- la constante Gambas 'gb.newline' ;

- la fonction 'Chr(10)' ou en hexadécimal 'Chr(&0A)' ;

- le caractère 'escape' "\x0A" ou (le plus couramment utilisé) "\n".
« Vita non suavis esse potest, nec Mors amara. »
pinky#10 Posté le 6/11/2024 à 15:27:39
Oui, c'est probablement des fins de lignes.
Parfois, ceux qui remplissent les données qui proviennent de l'application d'origine dans laquelle je copie les données ne sont pas correctement saisies. Ils laissent parfois 2 espaces entre les nombres ou écrivent des lignes incomplètes et poursuivent à la ligne suivante.
Je ne sais pas si je suis très clair dans mes explications ?
Je vais tester avec les codes que vous venez de me donner.
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
vuott#11 Posté le 6/11/2024 à 15:31:32
Ne cedere ineluctabili possimusExemplum:
1
2
3
4
5
6
7
8
9
10
11
12
PUBLIC SUB Main()

' Chaîne de caractères contenant des espaces et une «fin de ligne» ("\n"):
s = "aaa bbb ccc\nddd eee fff\nggg hhh iii\n"

' "Split()" supprime espaces et «fin de ligne»:
ss = Split(s, gb.NewLine, " ", TRUE)

' Vérifier le résultat :
ss.Join(NULL, NULL)

END
« Vita non suavis esse potest, nec Mors amara. »
vuott#12 Posté le 6/11/2024 à 15:37:09
Ne cedere ineluctabili possimus
Ils laissent parfois 2 espaces entre les nombres ou écrivent des lignes incomplètes et poursuivent à la ligne suivante.

...vous pouvez :| aussi utiliser la fonction native "Replace()" :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUBLIC SUB Main()

DIM s AS STRING

' Cette chaîne possède des groupes de 2 caractères ou plus "espace":
s = "aaa bbb ccc\nddd eee fff\nggg hhh iii\n"

' Supprime TOUTS les caractères "espace" (même s’il existe des groupes de 2 ou plus "espaces"):
s = Replace(s, " ", NULL)

' Supprime "fin de ligne":
s = Replace(s, gb.NewLine, NULL)

PRINT s

END
« Vita non suavis esse potest, nec Mors amara. »
pinky#13 Posté le 6/11/2024 à 15:47:02
Avec toutes ces solutions, je devrais réussir à faire quelque chose qui fonctionne. C'est motivant pour continuer. ;)
Je vais tester tranquillement afin d'essayer de comprendre car tout ça est compliqué pour moi.
Encore merci pour ton aide et ta patience.
Bonne soirée.
Dolmen (table pierre) : Caillou préféré des Bretons (un dolmen de prédilection).
vuott#14 Posté le 6/11/2024 à 15:50:00
Ne cedere ineluctabili possimusBien sûr, il existe d’autres solutions, probablement encore meilleures, mais celles-ci me sont venues à l’esprit maintenant. :pale:

Bonne soirée.
« Vita non suavis esse potest, nec Mors amara. »
Patrick#15 Posté le 7/11/2024 à 18:13:06
Bonsoir,
Il est aussi possible d'utiliser les expressions régulières qui vont extraire uniquement les données qui vous intéressent, il faut activer gb.pcre.
Sur l'exemple de Vuott :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
'on cré un tableau à 2 dimentions qui correspond aux lignes/colonnes du tableview
PRIVATE tab AS String[][]

PUBLIC SUB Form_Open()

' Attribuons les valeurs de votre exemple au TextArea :
TextArea1.Text = "0 25.10 10 12.85 20 18 30 25.654"

' Créons un simple TableView de base :
WITH TableView1
.Columns.Count = 2
END WITH

END


PUBLIC SUB Button1_Click()

'on cré un tableau à 1 dimention pour alimenter tab
DIM ss AS String[]
'on cré 1 regexp pour extraire uniquement ce dont on a besoin
DIM r AS NEW RegExp

tab = NEW String[]
'on donne les régles :
'() définit les zones reprises dans r[]
'[0-9] sont les caractéres autorisés, la de 0 à 9
'* on répete ses caractéres de 0 à n fois
'0 on finit par un 0 => 0 km 10 km 20 km
'\\s : \ caractére d'échapement gambas + \s est un caractére de séparation soit espace tabulation retour ligne ...
'+ se répete 1 ou plusieur fois, on peut avoir par ex 2 espaces
r.Compile("([0-9]*0)\\s+([0-9]+[,.]?[0-9]*)")
REPEAT
'on execute le regex appliqué a la textarea
r.Exec(TextArea1.Text)
'r.text contient la 1° occurence ici : 0 25.10, si il ne contient rien c'est que le travail est finit
IF r.Text THEN
ss = NEW STRING[2]
'r[0].text est l'équivalant de r.text
'r[1].text contient ici : 0
'r[2].text contient 25.10
ss[0] = r[1].Text
ss[1] = r[2].Text
'on ajoute les 2 valeurs au tableau
tab.Add(ss)
'on supprilme de textarea1.text la valeur 0 25.10 en le remplacent par ""
TextArea1.Text = r.Replace(TextArea1.Text, r[0].Text, "")
ENDIF
UNTIL r.Text = ""
'on sort de la boucle quand il n'y a plus de résultat dans r.text, si il reste quelque chose d'écrit dans la textarea c'est que le résultat est faux.
TableView1.Rows.Count = tab.Count

END

'on lit le tableau tab pour l'écrire dans la tableview
PUBLIC SUB TableView1_Data(Row AS INTEGER, Column AS INTEGER)

DIM ss AS String[]

ss = tab[row]
TableView1.Data.Text = ss[Column]

END
12