OVH Cloud OVH Cloud

besoin d'un conseil, un avis

3 réponses
Avatar
Shewy80
Bonjour à tous.
Je suis en train de lire un fichier texte, je prend ensuite chacune des
lignes.
Ces lignes je les découpe en fonction du sépérateur ( ; )
puis je mets tout ça dans un textBox (multiligne=true)

Pour dire bien voir les séparations, j'ajoute un, deux, ou trois tabulation
(chr(9) )

Mais voilà le problème. Malgré la détection de long de chaine, les
tabulations ne tiennent pas compte des lignes sup.
Donc au final il existe des décallage dans mon textbox.

Comment je pourais faire pour afficher mon fichier (contient donc 10 champs,
soit 10colonnes) proprement.

Au début, j'avais utiliser un MsFlexGrid, mais voilà cet outil ne fonctionne
pas à l'IUT.
En effet les sécurités installés sur site, empeche à VB de s'éexuter avec
d'autres outils.

Je suis donc limité aux outils standard pour faire ça.

Si vous avez une idée, ou une aide MERCI !!!


Voici les lignes qui peuvent être intéressante de mon code source pour vous
aider.


CREATION DU FICHIER PERMETTANT LE STOCKAGE DES VALEURS
----------------------------------------------------------------------------
-------------------------------------------
Sub rest_DSmaster_Click()

Call fichier.ChemFichier("DSmaster.ini")
->> cette fonction fais un path correct avec app.path et le nom du fichier.
->> Elle détect aussi sa présence, le crée sinon
->> Elle détect aussi si on se trouve à la racine pour ajouter ou non un '\'
->> Renvoi au final ChemFich qui est le chemin + nom du fichier depuis C:\

Dim nfic
nfic = FreeFile(1) '(mettre 1 si on veut permettre l'ouverture de fichier
par une autre app en même temps)
Open ChemFich For Output As nfic 'ouverture en écriture écrasement total
Print #nfic, "Pseudo;Niveau;Nb de d'essai max;Essai atteint;Nb.billes à
dispo;Nb.de trou;Durée du jeu;Date;Heure;Résultat;"
Close #nfic

End Sub


ECRITURE DANS LE FICHIER
----------------------------------------------------------------------------
---------------------------------------------------------------------
temp = Pseudo & ";" & niveau & ";" & nessai & ";" & essai & ";" & nbilles &
";" & nboites & ";" & DuréePartie & ";" & Date$ & ";" & Time$ & ";" &
resultat & ";"
Open ChemFich For Append As #nfic
Print #nfic, temp
Close #nfic
End If

End If






LECTURE DU FICHIER ET INSERT DANS TEXT BOX
----------------------------------------------------------------------------
----------------------------------------------------------------------------
---------
Sub chargeTextBox()
Dim nfic As String 'canal d'ouverture du fichier
nfic = FreeFile(1) 'attribution d'un canal libre
Dim cptlig1 As Integer 'est le Nb. de champs de la premiere ligne
Dim cpt As Integer 'compteur (Nb de champs de colza)
Dim temp As String 'valeur lue dans le fichier
Dim tableau() As String 'tableau contenant les valeurs découpés

'Calcul le Nombre de Col avec 1ere ligne du fichier
Open ChemFich For Input As nfic
On Error GoTo erreur
Line Input #nfic, temp
cpt = fichier.DecouperChaine(temp, ";", tableau)
cptlig1 = cpt
Close #nfic

'Lecture du fichier
Open ChemFich For Input As nfic
Do While Not EOF(nfic)
Line Input #nfic, temp
'on recalcul le nb de champs (dans le cas où le fichier aurait des
trou)
cpt = fichier.DecouperChaine(temp, ";", tableau)

If Not (cptlig1 = cpt) Then
'cas où le nb de champs d'une ligne n n'est pas = à l'entete
de colones
'on arrête l'affichage
GoTo erreur
End If

Dim k As Integer 'Pointeur de case sur le tableau strtab
Dim texte As String
Dim i As Integer

For k = 1 To cpt
If k = cptlig1 Then
texte = texte & vbCrLf
Else
If Len(tableau(k)) < 20 Then
If Len(tableau(k)) < 2 Then
texte = texte & tableau(k) & Chr(9) & Chr(9) &
Chr(9)
Else
texte = texte & tableau(k) & Chr(9) & Chr(9)
End If
Else
texte = texte & tableau(k) & Chr(9)
End If
'selon la longeur on ajoute 1,2 ou plus de tabulation

End If
Next
i = i + 1
Loop
Close #nfic


Text1.Text = texte





DECOUPER LE FICHIER EN CHAINE SEPARE
EN FONCTION DU CARACT DE SEPARATION
(C'est pas de moi, j'aurais peut etre faire plus simple: Code présent sur
Vbfrance adapté à mon projet)
----------------------------------------------------------------------------
----------------------------------------------------------------
Public Function DecouperChaine(StrTmp As String, car1 As String, tabstr() As
String) As Integer

'StrTmp est la chaine complete lue dans le fichier
'car1 est le caractére de séparation
'tabstr() est le tableau qui contiendra les valeurs découpé

Dim i As Integer
Dim cpt As Integer
Dim motprec As String

i = 0
DecouperChaine = 1
ReDim tabstr(1 To 1)
tabstr(1) = StrTmp
If Len(StrTmp) < 1 Then
Exit Function
ElseIf Len(StrTmp) = 1 Then
If StrTmp = car1 Then
DecouperChaine = 2
ReDim tabstr(1 To 2)
tabstr(1) = "": tabstr(2) = ""
End If
Exit Function
End If

cpt = 1
motprec = ""
'InStr Donne la position d'un caractere dans une variable
i = InStr(StrTmp, car1)
While i > 0
If i > 1 Then 'motprec sert à ignorer le car1 s'il est précédé par
"?"
If Mid$(StrTmp, i - 1, 1) = "?" Then
motprec = motprec & Left$(StrTmp, i - 2) & car1
StrTmp = Right$(StrTmp, Len(StrTmp) - i)
GoTo IgnorerCar
End If
End If
motprec = motprec & Left$(StrTmp, i - 1)
cpt = cpt + 1
ReDim Preserve tabstr(1 To cpt)
tabstr(cpt - 1) = motprec
motprec = ""
StrTmp = Right$(StrTmp, Len(StrTmp) - i)
IgnorerCar:
i = InStr(StrTmp, car1)
Wend
tabstr(cpt) = motprec & StrTmp
DecouperChaine = cpt
End Function

3 réponses

Avatar
LE TROLL
Salut, peut être que ça marche dans un RTF, sans doute...
-----------

"Shewy80" a écrit dans le message
de news: d6em6h$rvc$
Bonjour à tous.
Je suis en train de lire un fichier texte, je prend
ensuite chacune des
lignes.
Ces lignes je les découpe en fonction du sépérateur ( ; )
puis je mets tout ça dans un textBox (multiligne=true)

Pour dire bien voir les séparations, j'ajoute un, deux, ou
trois tabulation
(chr(9) )

Mais voilà le problème. Malgré la détection de long de
chaine, les
tabulations ne tiennent pas compte des lignes sup.
Donc au final il existe des décallage dans mon textbox.

Comment je pourais faire pour afficher mon fichier
(contient donc 10 champs,
soit 10colonnes) proprement.

Au début, j'avais utiliser un MsFlexGrid, mais voilà cet
outil ne fonctionne
pas à l'IUT.
En effet les sécurités installés sur site, empeche à VB de
s'éexuter avec
d'autres outils.

Je suis donc limité aux outils standard pour faire ça.

Si vous avez une idée, ou une aide MERCI !!!


Voici les lignes qui peuvent être intéressante de mon code
source pour vous
aider.


CREATION DU FICHIER PERMETTANT LE STOCKAGE DES VALEURS
----------------------------------------------------------------------------
-------------------------------------------
Sub rest_DSmaster_Click()

Call fichier.ChemFichier("DSmaster.ini")
->> cette fonction fais un path correct avec app.path et
le nom du fichier.
->> Elle détect aussi sa présence, le crée sinon
->> Elle détect aussi si on se trouve à la racine pour
ajouter ou non un ''
->> Renvoi au final ChemFich qui est le chemin + nom du
fichier depuis C:

Dim nfic
nfic = FreeFile(1) '(mettre 1 si on veut permettre
l'ouverture de fichier
par une autre app en même temps)
Open ChemFich For Output As nfic 'ouverture en écriture
écrasement total
Print #nfic, "Pseudo;Niveau;Nb de d'essai max;Essai
atteint;Nb.billes à
dispo;Nb.de trou;Durée du jeu;Date;Heure;Résultat;"
Close #nfic

End Sub


ECRITURE DANS LE FICHIER
----------------------------------------------------------------------------
---------------------------------------------------------------------
temp = Pseudo & ";" & niveau & ";" & nessai & ";" & essai
& ";" & nbilles &
";" & nboites & ";" & DuréePartie & ";" & Date$ & ";" &
Time$ & ";" &
resultat & ";"
Open ChemFich For Append As #nfic
Print #nfic, temp
Close #nfic
End If

End If






LECTURE DU FICHIER ET INSERT DANS TEXT BOX
----------------------------------------------------------------------------
----------------------------------------------------------------------------
---------
Sub chargeTextBox()
Dim nfic As String 'canal d'ouverture du fichier
nfic = FreeFile(1) 'attribution d'un canal libre
Dim cptlig1 As Integer 'est le Nb. de champs de la
premiere ligne
Dim cpt As Integer 'compteur (Nb de champs de colza)
Dim temp As String 'valeur lue dans le fichier
Dim tableau() As String 'tableau contenant les valeurs
découpés

'Calcul le Nombre de Col avec 1ere ligne du fichier
Open ChemFich For Input As nfic
On Error GoTo erreur
Line Input #nfic, temp
cpt = fichier.DecouperChaine(temp, ";", tableau)
cptlig1 = cpt
Close #nfic

'Lecture du fichier
Open ChemFich For Input As nfic
Do While Not EOF(nfic)
Line Input #nfic, temp
'on recalcul le nb de champs (dans le cas où le
fichier aurait des
trou)
cpt = fichier.DecouperChaine(temp, ";", tableau)

If Not (cptlig1 = cpt) Then
'cas où le nb de champs d'une ligne n n'est
pas = à l'entete
de colones
'on arrête l'affichage
GoTo erreur
End If

Dim k As Integer 'Pointeur de case sur le tableau
strtab
Dim texte As String
Dim i As Integer

For k = 1 To cpt
If k = cptlig1 Then
texte = texte & vbCrLf
Else
If Len(tableau(k)) < 20 Then
If Len(tableau(k)) < 2 Then
texte = texte & tableau(k) & Chr(9)
& Chr(9) &
Chr(9)
Else
texte = texte & tableau(k) & Chr(9)
& Chr(9)
End If
Else
texte = texte & tableau(k) & Chr(9)
End If
'selon la longeur on ajoute 1,2 ou plus de
tabulation

End If
Next
i = i + 1
Loop
Close #nfic


Text1.Text = texte





DECOUPER LE FICHIER EN CHAINE SEPARE
EN FONCTION DU CARACT DE SEPARATION
(C'est pas de moi, j'aurais peut etre faire plus simple:
Code présent sur
Vbfrance adapté à mon projet)
----------------------------------------------------------------------------
----------------------------------------------------------------
Public Function DecouperChaine(StrTmp As String, car1 As
String, tabstr() As
String) As Integer

'StrTmp est la chaine complete lue dans le fichier
'car1 est le caractére de séparation
'tabstr() est le tableau qui contiendra les valeurs
découpé

Dim i As Integer
Dim cpt As Integer
Dim motprec As String

i = 0
DecouperChaine = 1
ReDim tabstr(1 To 1)
tabstr(1) = StrTmp
If Len(StrTmp) < 1 Then
Exit Function
ElseIf Len(StrTmp) = 1 Then
If StrTmp = car1 Then
DecouperChaine = 2
ReDim tabstr(1 To 2)
tabstr(1) = "": tabstr(2) = ""
End If
Exit Function
End If

cpt = 1
motprec = ""
'InStr Donne la position d'un caractere dans une
variable
i = InStr(StrTmp, car1)
While i > 0
If i > 1 Then 'motprec sert à ignorer le car1
s'il est précédé par
"?"
If Mid$(StrTmp, i - 1, 1) = "?" Then
motprec = motprec & Left$(StrTmp, i - 2) &
car1
StrTmp = Right$(StrTmp, Len(StrTmp) - i)
GoTo IgnorerCar
End If
End If
motprec = motprec & Left$(StrTmp, i - 1)
cpt = cpt + 1
ReDim Preserve tabstr(1 To cpt)
tabstr(cpt - 1) = motprec
motprec = ""
StrTmp = Right$(StrTmp, Len(StrTmp) - i)
IgnorerCar:
i = InStr(StrTmp, car1)
Wend
tabstr(cpt) = motprec & StrTmp
DecouperChaine = cpt
End Function





Avatar
Fred
Dans son message d6em6h$rvc$
Shewy80 nous dit :

Bonjour à tous.
Je suis en train de lire un fichier texte, je prend ensuite chacune
des lignes.
Ces lignes je les découpe en fonction du sépérateur ( ; )
puis je mets tout ça dans un textBox (multiligne=true)

Pour dire bien voir les séparations, j'ajoute un, deux, ou trois
tabulation (chr(9) )

Mais voilà le problème. Malgré la détection de long de chaine, les
tabulations ne tiennent pas compte des lignes sup.
Donc au final il existe des décallage dans mon textbox.

Comment je pourais faire pour afficher mon fichier (contient donc 10
champs, soit 10colonnes) proprement.

Au début, j'avais utiliser un MsFlexGrid, mais voilà cet outil ne
fonctionne pas à l'IUT.
En effet les sécurités installés sur site, empeche à VB de s'éexuter
avec d'autres outils.

Je suis donc limité aux outils standard pour faire ça.

Si vous avez une idée, ou une aide MERCI !!!


Voici les lignes qui peuvent être intéressante de mon code source
pour vous aider.


CREATION DU FICHIER PERMETTANT LE STOCKAGE DES VALEURS
----------------------------------------------------------------------------
-------------------------------------------
Sub rest_DSmaster_Click()

Call fichier.ChemFichier("DSmaster.ini")
->> cette fonction fais un path correct avec app.path et le nom du
fichier.
->> Elle détect aussi sa présence, le crée sinon
->> Elle détect aussi si on se trouve à la racine pour ajouter ou non
un ''
->> Renvoi au final ChemFich qui est le chemin + nom du fichier
depuis C:

Dim nfic
nfic = FreeFile(1) '(mettre 1 si on veut permettre l'ouverture de
fichier par une autre app en même temps)
Open ChemFich For Output As nfic 'ouverture en écriture écrasement
total Print #nfic, "Pseudo;Niveau;Nb de d'essai max;Essai
atteint;Nb.billes à dispo;Nb.de trou;Durée du
jeu;Date;Heure;Résultat;"
Close #nfic

End Sub


ECRITURE DANS LE FICHIER
----------------------------------------------------------------------------
---------------------------------------------------------------------
temp = Pseudo & ";" & niveau & ";" & nessai & ";" & essai & ";" &
nbilles & ";" & nboites & ";" & DuréePartie & ";" & Date$ & ";" &
Time$ & ";" & resultat & ";"
Open ChemFich For Append As #nfic
Print #nfic, temp
Close #nfic
End If

End If






LECTURE DU FICHIER ET INSERT DANS TEXT BOX
----------------------------------------------------------------------------
----------------------------------------------------------------------------
---------
Sub chargeTextBox()
Dim nfic As String 'canal d'ouverture du fichier
nfic = FreeFile(1) 'attribution d'un canal libre
Dim cptlig1 As Integer 'est le Nb. de champs de la premiere ligne
Dim cpt As Integer 'compteur (Nb de champs de colza)
Dim temp As String 'valeur lue dans le fichier
Dim tableau() As String 'tableau contenant les valeurs découpés

'Calcul le Nombre de Col avec 1ere ligne du fichier
Open ChemFich For Input As nfic
On Error GoTo erreur
Line Input #nfic, temp
cpt = fichier.DecouperChaine(temp, ";", tableau)
cptlig1 = cpt
Close #nfic

'Lecture du fichier
Open ChemFich For Input As nfic
Do While Not EOF(nfic)
Line Input #nfic, temp
'on recalcul le nb de champs (dans le cas où le fichier aurait
des trou)
cpt = fichier.DecouperChaine(temp, ";", tableau)

If Not (cptlig1 = cpt) Then
'cas où le nb de champs d'une ligne n n'est pas = à
l'entete de colones
'on arrête l'affichage
GoTo erreur
End If

Dim k As Integer 'Pointeur de case sur le tableau strtab
Dim texte As String
Dim i As Integer

For k = 1 To cpt
If k = cptlig1 Then
texte = texte & vbCrLf
Else
If Len(tableau(k)) < 20 Then
If Len(tableau(k)) < 2 Then
texte = texte & tableau(k) & Chr(9) & Chr(9) &
Chr(9)
Else
texte = texte & tableau(k) & Chr(9) & Chr(9)
End If
Else
texte = texte & tableau(k) & Chr(9)
End If
'selon la longeur on ajoute 1,2 ou plus de tabulation

End If
Next
i = i + 1
Loop
Close #nfic


Text1.Text = texte





DECOUPER LE FICHIER EN CHAINE SEPARE
EN FONCTION DU CARACT DE SEPARATION
(C'est pas de moi, j'aurais peut etre faire plus simple: Code présent
sur Vbfrance adapté à mon projet)
----------------------------------------------------------------------------
----------------------------------------------------------------
Public Function DecouperChaine(StrTmp As String, car1 As String,
tabstr() As String) As Integer

'StrTmp est la chaine complete lue dans le fichier
'car1 est le caractére de séparation
'tabstr() est le tableau qui contiendra les valeurs découpé

Dim i As Integer
Dim cpt As Integer
Dim motprec As String

i = 0
DecouperChaine = 1
ReDim tabstr(1 To 1)
tabstr(1) = StrTmp
If Len(StrTmp) < 1 Then
Exit Function
ElseIf Len(StrTmp) = 1 Then
If StrTmp = car1 Then
DecouperChaine = 2
ReDim tabstr(1 To 2)
tabstr(1) = "": tabstr(2) = ""
End If
Exit Function
End If

cpt = 1
motprec = ""
'InStr Donne la position d'un caractere dans une variable
i = InStr(StrTmp, car1)
While i > 0
If i > 1 Then 'motprec sert à ignorer le car1 s'il est
précédé par "?"
If Mid$(StrTmp, i - 1, 1) = "?" Then
motprec = motprec & Left$(StrTmp, i - 2) & car1
StrTmp = Right$(StrTmp, Len(StrTmp) - i)
GoTo IgnorerCar
End If
End If
motprec = motprec & Left$(StrTmp, i - 1)
cpt = cpt + 1
ReDim Preserve tabstr(1 To cpt)
tabstr(cpt - 1) = motprec
motprec = ""
StrTmp = Right$(StrTmp, Len(StrTmp) - i)
IgnorerCar:
i = InStr(StrTmp, car1)
Wend
tabstr(cpt) = motprec & StrTmp
DecouperChaine = cpt
End Function



Bonjour,
S'il ne s'agit que d'affichage, pourquoi pas le faire dans un PictureBox en
utilisant Print, CurrentX, CurrentY ?
Sinon, pour réaliser des alignements dans un contrôle TextBox, je n'ai pas
essayé avec des tabulations mais en utilisant une police à espacement fixe
et des espaces. Tu complètes alors chaque chaîne par le nombre d'espaces
requis pour obtenir la largeur de la colonne.
Sinon, à titre d'information puisque c'est déjà fait, tu peux aussi lire ton
fichier texte par ODBC.

--
Fred
Avatar
ng
Salut,

<snip>



Tu peux :
* soit utiliser une police à largeur fixe (courrier, lucida console...) et
donc calculer très simplement les espaces à mettre pour faire des colonnes
propres
* soit calculer la largeur du texte via TextWidth() et compléter avec le
nombre d'espace qui va bien : mais il risque qd mm d'avoir un léger
décalage pas très esthétique
* utiliser une listview

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/