IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Besoin d'aide pour une fonction de justification de texte


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 21
    Points
    21
    Par défaut Besoin d'aide pour une fonction de justification de texte
    Bonjour.

    Je recherche votre aide pour réaliser une fonction de justification de texte.
    Je développe des rapports Reporting services mais la fonction de justification n'existe pas et je me vois dans l'obligation d'en réaliser une sous VB (langage que je ne connais pas du tout mais ... pas du tout ^^)

    Je regarde à droite à gauche un peu partout sur le web mais l'aide est souvent peu exploitable ou très peu expliqué.

    Donc mon objectif est de réaliser une fonction qui prendrait 2 paramettres : la chaine à traiter et le nombre de caractere par ligne souhaité.
    La derniere ligne n'est pas justifié

    Voici ce que j'ai déjà reussis à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Function Justify(ByVal chaine As String, ByVal nbCaractereParLigne As Integer) As String
     
        'Calcul du nombre de ligne réalisable avec la chaine non formatée.   
        Dim nombreLigne = Len(chaine )/nbCaractereParLigne  
     
        'Boucle basée sur le nombre ligne
        Dim compteur As Integer
        For compteur = 1 to nombreLigne-1 step 1 'On ne justifie pas la dernière ligne
     
            'Si le caractere positionné à "nbCaractereParLigne"*"compteur" n'est pas un espace
    			'Si le caractere suivant n'est pas un espace
    				'Regarder ou est le dernier caractere du dernier mot entier de la ligne
    				'Calculer le nombre de caractere entre les deux pour donner le nombre d'espace à rajouter
    				'Calculer le nombre d'espace total entre le début de phrase et le dernier caractere du dernier mot entier
    				'Si le nombre d'espace à rajouter est supérieur au nombre d'espace dans la phrase 
    					'Calculer le modulo pour savoir le nombre d'espace à rajouter en plus
    					'Parcourir la ligne tant qu'il reste des espace normaux et des espace de modulo à rajouter
    						'Si le caractere actuel est un espace
    							'Rajouter un espace
    							'Décrementer le nombre d'espace à rajouter
    							'Mettre le parcours de chaine à +1
    							'Si il reste des espaces modulo à rajouter
    								'Rajouter un espace
    								'Décrementer le nombre d'espace modulo à rajouter
    								'Mettre le parcours de chaine à +1
    							'Fin si
    						'Fin si 
    						'Mettre le parcours de chaine à +1
    					'Fin parcourir
    				'Fin si
    			'Sinon si le caractere suivant est un espace
    				'Ne rien faire (la ligne est déjà justifiée naturelement)
    			'Fin si
     
    		'Si le caractere positionné à "nbCaractereParLigne"*"compteur" est un espace
    			'Parcourir la ligne tant qu'on est pas sur un espace
    				'Rajouter un espace 
    				'Fin parcourir
    			'Fin parcourir
    		'Fin si
     
     
        Next
     
     
    	Return 
    End Function
    J'ai réaliser tout l'algorythme mais je peche pour trouver de la documentation sur les fonctions liées aux chaines de caractères.

    Si vous avez des sites à me conseiller ou je pourrais trouver la documentation adéquate je suis preneur comme tout code de justification qui me permettrait de comprendre un peu mieu le VB.

    Merci à l'avance.

  2. #2
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Effectivement c'est a toi de faire tout sa

    je peut t'aider à le faire,
    mais perso j'ais trop la flemme de tout faire a ta place surtout que je suis pas expert en Texte

    je comprend pas très bien les test que tu doit faire,
    pourquoi tu doit toujours chercher les espaces?


    tu peut avoir la longueur d'un String comme ceci aussi



    dit moi ce que tu a besoin et je t'aiderais

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien Qualité Logiciel
    Inscrit en
    Janvier 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Qualité Logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 44
    Points : 45
    Points
    45
    Par défaut
    Salut!

    Je pense que ça pourrais te servir pour être plus à l'aise avec les chaines de caractères.

    Après si tu veux plus de détail, n'hésite pas à nous expliquer le soucis

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Merci de votre aide.

    Mais effectivement je ne veux pas qu'on la réalise pour moi (même si cette solution est facile), je veux la réaliser de mes propres mains.

    Je vais regarder tout ca

    je comprend pas très bien les test que tu doit faire,
    pourquoi tu doit toujours chercher les espaces?
    Car je rajoute les espaces de justification aux espaces déjà existant :
    - : Fin de ligne souhaité
    aaa aaaa aaaaa aa aaa-aaaaa
    me donne
    aaa aaaa aaaaa aa
    aaaaa

  5. #5
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Utilise la Fonction Split alors

    tu va avoir ceci a la fin


    en gros tu rentre ton texte par ligne et tu peut l'exploser dans un tableau de string
    *tableau flexible, qui s'auto dimensionne*

    tu récupére aprés comme tu veut ton texte dans Test(0) ou Test(1) dans l'exemple

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Effectivement je suis parti sur cette optique

    Avec les liens donnés (et au passage super utiles) j'ai repensé ma manière de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Function ScinderChaine( Chaine As String , NbCar As Integer ) As Integer
       Dim Tableau() As String
       Dim TableauDeLigne() As String
       Dim i As Integer
       Dim i2 As Integer
       Dim nbm As Integer
     
       'Coupe la chaine par espace
       Tableau = Split(chaine, " ")
       nbm  = Ubound(Tableau) - LBound(Tableau) + 1
       i2 = 0
     
       'Pour chaque colonne du tableau
       For i = LBound(Tableau) To UBound(Tableau)
          'Si la longeur de la ligne en cours + le mot étudié est inférieur au nombre de caractère
           If(Len(TableauDeLigne(i2))+ Len(Tableau(i))+1 < NbCar) Then
    	      TableauDeLigne(i2) = TableauDeLigne(i2) + " " + Tableau(i)
           Else
          End If
       Next i
     
       return nbm 
    End Function
    Faut pas s'inquiéter si le traitement n'a aucun rapport avec le retour de la fonction, c'est juste que je teste la bonne compilation du code sous reporting services


    Bon j'ai un petit probleme pour calculer la longueur de la chaine contenue dans une case de mon tableau, y'aurait-il une autre façon de proceder ?

  7. #7
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    tu a un problème d'accord mais lequel?
    Len() te retourne bien la longueur du tableau non ?

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Le probleme est que reporting services n'est pas du tout bavard
    (En gros la seule chose qu'il sais dire c'est : "C'est pas bon")

    L'erreur vient surement de l'affection de valeur dans une case de tableau car quand je fais
    j'ai le drois à une erreur de compilation

    Je vais essayer de creuser l'histoire

    PS = La fonction Len(TableauDeLigne(0)) fonctionne elle très bien

  9. #9
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    la voila ton erreur



    remplie de tableau de queleque chose avant, sinon il pourra pas faire le Teste du If *normale*

  10. #10
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    ou alors tu fait un test avant genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          If(TableauDeLigne(i2) = Nothing Then
    	  'Ton cas particulier
          Else
              'Ta routine
          End If
    parceque trouver la longueur d'une chaine vide c'est pas évident ....

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Effectivement

    Avec votre aide j'en suis presque au bout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    Function ScinderChaine( Chaine As String , NbCar As Integer ) As String
        '-------------------------------------------------------------------------------------------------
        '-- Recupereration des mots et formatage des lignes
        '-------------------------------------------------------------------------------------------------
        Dim Tableau() As String
        Dim TableauDeLigne As String() = New String(NbCar){}
     
        Dim i As Integer
        Dim i2 As Integer
     
        TableauDeLigne(0) = ""
        i2=0
     
        'Coupe la chaine par espace
        Tableau = Split(chaine, " ")
        'Pour chaque colonne du tableau
        For i = LBound(Tableau) To UBound(Tableau)
            'Si la longeur de la ligne en cours + le mot étudié est inférieur au nombre de caractère autorisé par ligne
            If(Len(TableauDeLigne(i2))+ Len(Tableau(i))+1 < NbCar) then
                TableauDeLigne(i2) = TableauDeLigne(i2) + " " + Tableau(i)
            Else
                'Mise en place du mot sur une nouvelle ligne
                TableauDeLigne(i2) = Trim(TableauDeLigne(i2))
                i2= i2+1
                TableauDeLigne(i2) = Tableau(i)
            End If
        Next i
     
        '-------------------------------------------------------------------------------------------------
        '-- justification ligne par ligne
        '-------------------------------------------------------------------------------------------------    
       'Maintenant qu'on a les lignes, on calcul les espaces de chaque lignes
     
        Dim nombreEspace As Integer          'Le nombre d'espace à placer
        Dim chaineEnCours As String             'Copie de la chaine en cours de traitement
        Dim chaineTemporaire As String      'Reception de la chaine formatée
        Dim curseur As Integer                       'Positionnement dans la chaine en cours
        Dim nombreDePassage As Integer 
        Dim presenceEspace As Integer
     
        For i = LBound(TableauDeLigne) To UBound(TableauDeLigne)-1 'On ne justifie pas la derniere ligne
     
            chaineEnCours = TableauDeLigne(i)
            curseur = 0
            nombreEspace  =  NbCar - Len(chaineEnCours) 
            chaineTemporaire = ""
     
            'Tant qu'il reste des espaces
            While nombreEspace > 0
     
                'Si on a pas d'espace avant, on le double
                If((chaineEnCours(curseur)==" " ) And (presenceEspace ==  0) ) then
                    chaineTemporaire =  chaineTemporaire + " " + " "
                    nombreEspace = nombreEspace - 1
                    presenceEspace == 1
     
                'Si on a un espace avant, on le double pas
               ElseIf((chaineEnCours(curseur)== " ") And (presenceEspace ==  1)) then
                    chaineTemporaire =  chaineTemporaire + chaineEnCours(curseur)
     
                ElseIf(chaineEnCours(curseur) != " ") then
                    chaineTemporaire = chaineTemporaire + chaineEnCours(curseur)
                    presenceEspace == 0
                End If
     
                If(curseur == NbCar-1)  then 'Si on arrive à la fin de ligne, on retourne au début
                    curseur=0
                End If
     
                curseur = curseur+1
            End While
     
            TableauDeLigne(i) = chaineTemporaire
        Next   
     
        '-------------------------------------------------------------------------------------------------
        '-- retour du texte formaté
        '-------------------------------------------------------------------------------------------------    
        Dim chaineFinale As String
        For i = LBound(TableauDeLigne) To UBound(TableauDeLigne)
            chainefinale = chaineFinale + TableauDeLigne(i)
        Next   
       return chainefinale
    End Function
    J'ai une erreur au niveau du while mais je ne comprend pas du tout cas il me semble que la syntaxe est correcte mais il me dit "Expression attendue"

  12. #12
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    tu peut essayer de me faire voir ou est l'erreur précisément stp ...?
    *les screen parlent d'eux même*

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    J'ai rajouté l'erreur en piece jointe.
    Images attachées Images attachées  

  14. #14
    Membre expérimenté Avatar de hunteshiva
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Février 2010
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 1 069
    Points : 1 455
    Points
    1 455
    Par défaut
    Voila les erreurs, alors tous les == ou le != tu les vires on est pas en C++ XD


    je vais pas te faire la traduction a chaque fois ...
    passe sur VS 2008, sa t'aidera pas mal je pense
    *d'une manière ou d'une autre*

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/06/2015, 09h42
  2. [FPDF] Besoin d'aide pour une fonction publipostage..;
    Par dark$hadow dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 10/02/2007, 15h39
  3. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  4. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo