Page 1 sur 2
string a longueur limite dans une structure
Publié : mer. 18/févr./2004 12:14
par clauded07
Bonjour,
Comment fait on pour fixer une longeur limite dans une chaine inclu dans une structure?
On a par exemple en vb :
Type montype
...
client_nom As String * 60
...
End Type
Pour apres ecrire dans un fichier qui a des enregistrements de longueur toujours fixe.
Merci.
Publié : mer. 18/févr./2004 13:56
par Anonyme2
Je ne crois pas que l'on puisse fixer une longueur à une chaine dans une declaration en PB.
Publié : mer. 18/févr./2004 14:03
par clauded07
Publié : mer. 18/févr./2004 14:48
par Oliv
Sinon utilises un buffer à la taille voulue
Publié : mer. 18/févr./2004 14:55
par clauded07
oui, il y a cette solution, mais bon, quand tu as 20 à 30 champs dans une structure et plusieurs structure a gerer, c'est mieux de le faire sans buffer.
Publié : mer. 18/févr./2004 16:16
par Oliv
C'est sur

Publié : mer. 18/févr./2004 18:47
par Patrick88
Structure ma_structure
TypeChaine.b[15]
EndStructure
Machaine.ma_structure
PokeS(@Machaine\TypeChaine[0], "Bonjour")
Debug PeekS(@Machaine\TypeChaine[0])
patrick
Publié : jeu. 19/févr./2004 7:50
par clauded07
Merci beaucoup Patrick! t'es un champion!

Publié : jeu. 19/févr./2004 17:03
par Anonyme2
Juste une ou deux petites remarques concernant cette méthode.
Il faut faire attention à ce que l'on écrit avec la commande PokeS car cette commande ne reçoit pas de paramètre indiquant un maximum de caractères à écrire,
donc rien n'empêche PokeS d'écrire une chaine plus longue que la valeur définie dans la structure.
PokeS écrit la chaine ainsi que son caractère nul de fin de chaine (0).
Si on utilise dans la structure une variable après avoir déclaré TypeChaine.b[15] par exemple, et que PokeS écrit plus de caractères que les 15, la valeur contenue dans la variable qui suit cette "chaine" sera écrasée
Voici un exemple
Code : Tout sélectionner
Structure ma_structure
TypeChaine.b[15]
Nombre.l
EndStructure
Machaine.ma_structure
Machaine\Nombre= 1450
PokeS(@Machaine\TypeChaine[0], "Bonjour bbbbbbbbbb")
Debug PeekS(@Machaine\TypeChaine[0])
Debug Machaine\Nombre
exécutez ce code et vous verrez que Machaine\Nombre ne retourne pas la valeur 1450
Publié : jeu. 19/févr./2004 17:07
par Anonyme2
Je me demande simplement pourquoi tu as besoin de limiter la longueur.
Tu pourrais expliquer ?
Publié : jeu. 19/févr./2004 17:11
par clauded07
Ben, je souhaites ecrire un fichier formater en trames toutes de la meme longeur mais au contenu differrents.
ex :
fichier=[trame1 128ot] [trame2 128ot][trame3 128ot][trame3 128ot][trame5 128ot][trame18 128ot]....
trame1=client*50,prenom*50,tel*20, age*8
trame3=adresse*128
...
c'est un exemple bidon, mais bon.
Publié : jeu. 19/févr./2004 17:18
par Anonyme2
A moins que Fred nous dise le contraire, il ne me semble pas possible de définir une longueur max d'une chaine par déclaration.
Tu pourrais régler ton problème en limitant la chaine finale à écrire dans le fichier à la longueur voulue si celle-ci dépasse la longueur max.
Tu teste la longueur avec len(chaine$)
et tu utilise la fonction Mid(Chaine$, PositionDepart, Longueur) pour limiter sa longueur.
C'est peut-être pas l'idéal mais cela devrait aller.
Publié : jeu. 19/févr./2004 17:25
par clauded07
ben oui, c'est un peu bidouille. C'est dommage car je voulais utiliser purebasic professionnellement, mais c'est pas adapté pour la gestion de structure fixe, ce qu'on utilise beaucoup en gestion.

Publié : jeu. 19/févr./2004 22:04
par Anonyme2
Tu pourrais également limiter la longueur des données entrées ?
Publié : ven. 20/févr./2004 15:52
par Le Soldat Inconnu
c'est pas mid qu'il faut utiliser mes left(string, 60) pour prendre en compte seulement les 60 premier carac
sinon, je pense aussi qu'il ne faut se casser la tête avec la longueur des strings
tu gères la longeur quand on rentre le texte. si çà dépasse X carac, tu tranche avec la fonction left en ralant sur l'utilisateur
si c'est trop court et que tu veut stocker des carac qui font toujours la longueur X, tu utilise les fonctions Lset et Rset qui permmettent d'ajouté des carac afin d'otenir une longueur voulue.
dans ton cas, on aurait :
- pour lire la donnée entrer par un utilisateur
Code : Tout sélectionner
Texte.s = Trim(getgadgettext(#Texte))
if Len(Texte) > 60 ; si le texte est trop long
messagerequester("Erreur", "Le texte est trop long, il a été coupé", 3*16) ; on rale
Texte = left(Texte, 60) ; On coupe le texte
SetgadgetText(#Texte, Texte) ; On réaffiche le texte
endif
- Pour l'écrire dans le fichier :
Code : Tout sélectionner
writestring(LSet(Texte, 60, " ")) ; On complète le texte avec des espaces afin d'obtenir 60 carac
- Pour lire dans le fichier
Bon, je sais pas si c'est writestring et readstring qu'l faut utiliser dans ton cas. plutôt WriteData et ReadData