string a longueur limite dans une structure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
clauded07
Messages : 7
Inscription : mer. 18/févr./2004 12:08
Localisation : Ardèche
Contact :

string a longueur limite dans une structure

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je ne crois pas que l'on puisse fixer une longueur à une chaine dans une declaration en PB.
clauded07
Messages : 7
Inscription : mer. 18/févr./2004 12:08
Localisation : Ardèche
Contact :

Message par clauded07 »

#larme
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Sinon utilises un buffer à la taille voulue
clauded07
Messages : 7
Inscription : mer. 18/févr./2004 12:08
Localisation : Ardèche
Contact :

Message 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.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

C'est sur #larme
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

Structure ma_structure
TypeChaine.b[15]
EndStructure

Machaine.ma_structure

PokeS(@Machaine\TypeChaine[0], "Bonjour")
Debug PeekS(@Machaine\TypeChaine[0])

patrick
clauded07
Messages : 7
Inscription : mer. 18/févr./2004 12:08
Localisation : Ardèche
Contact :

Message par clauded07 »

Merci beaucoup Patrick! t'es un champion!
:10:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je me demande simplement pourquoi tu as besoin de limiter la longueur.
Tu pourrais expliquer ?
clauded07
Messages : 7
Inscription : mer. 18/févr./2004 12:08
Localisation : Ardèche
Contact :

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
clauded07
Messages : 7
Inscription : mer. 18/févr./2004 12:08
Localisation : Ardèche
Contact :

Message 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. :cry:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Tu pourrais également limiter la longueur des données entrées ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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

Code : Tout sélectionner

Texte = Trim(readstring) ; On retire les espaces en trop
Bon, je sais pas si c'est writestring et readstring qu'l faut utiliser dans ton cas. plutôt WriteData et ReadData
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre