Msflexgrid : ajuster automatiquement la larg. des cols.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 412 fois - Téléchargée 32 fois

Contenu du snippet

Bonjour à tous.
Premier code que je mets en ligne. Vous en trouverez sans doute des plus complets.
Moi je voulais une fonction simple, qui m'ajuste automatiquement la largueur des mes colones de mon FlexGrid en fonction du mot le plus grand contenu dans cette dernière.

Alors il faut :
1 MSFlexGrid1 de meme nom
1 Label de nom LblMOT avec surtout la propriété "AutoSize" à True !!!!

Ensuite la technique consiste à ballayer toutes les cellules, et à compter le nombre de caractères.
je stock cette longueur de chaine dans une variable et ensuite je boucle sur toutes les cellules de la colonne. Si le suivant est plus grand que le précédent alors je copie ce mot dans le Label à autosize.
(Ainsi le label s'adapte automatiquement donnant la larg)
Des que j'ai fini ma col, je vais voir le label et je prend la propriété "Width" auquel je rajoute un p'tit peu: ici 300 (question de lisibilité afin d'éviter que les mots des col soit trop cote à cote)
Puis on recommence avec la col suivante.

Source / Exemple :


'Voici l'appel de fonction :
        Call redimflexGd(MSFlexGrid1.Cols, MSFlexGrid1.Rows)

'Voici la Fonction :
'----------------------------------------------------------------------------
Function redimflexGd(nbcols As Integer, nbrows As Integer)
  Dim nbcol As Integer
  Dim nbrow As Integer
  Dim longtxt As Integer
  Dim max As Integer

max = 0
longtxt = 0

For nbcol = 0 To nbcols - 1
  For nbrow = 0 To nbrows - 1
      With MSFlexGrid1
        .Col = nbcol
        .Row = nbrow
      End With

      longtxt = Len(MSFlexGrid1.Text)
      If longtxt > max Then
        max = longtxt
        LblMOT.Caption = MSFlexGrid1.Text
      End If
   Next

MSFlexGrid1.ColWidth(nbcol) = LblMOT.Width + 300
max = 0
longtxt = 0
Next

End Function

Conclusion :


Merci de me donner vos commentaires.
ça permet d'évoluer et de comprendre des erreurs que j'aurais pu faire.

@++
Guillaume B
(Shewy80)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
20
Date d'inscription
jeudi 27 mars 2003
Statut
Membre
Dernière intervention
9 janvier 2008

Je tombe dessus par hazard

Tous les logiciles(word,excel etc..) se basent sur l'imprimante pour retailler et faire du wisiwig. donc l'ideal est:

Private Function AdjustColWidth(col As Long)
Dim row As Long
Dim W As Long

Printer.FontName = pFlexgrid.Font.Name
Printer.FontSize = pFlexgrid.Font.Size
Printer.FontBold = pFlexgrid.Font.Bold

For row = 0 To pFlexgrid.Rows - 1
If W < Printer.TextWidth(pFlexgrid.TextMatrix(row, col)) Then
W = Printer.TextWidth(pFlexgrid.TextMatrix(row, col))
End If
Next
pFlexgrid.ColWidth(col) = W + 200 'can be changed to accomodate

End Function
A+
Messages postés
53
Date d'inscription
mercredi 24 juillet 2002
Statut
Membre
Dernière intervention
16 mars 2011

tu n'es pas fou silmon LOL, ya bien un Len qui traine qu'il faut virer...

Merci à bidoch78 d'avoir corriger !

Bonne fêtes de fin d'année à tous et bonne prog"
Messages postés
12
Date d'inscription
lundi 30 juin 2003
Statut
Membre
Dernière intervention
9 juillet 2007

Silmon a dit :
"Deuxiement:
Tu dis qu'il y a de PETITES ameliorations à apporter comme 'stocker dans Max la long de la chaine au lieu de mettre le Width le plus grand de la boucle'."

tu as inversé ce qu'il a dit, marche pas bien ton copier coller :)

relis son poste tu verra :)

sinon sympa la source.

+
Messages postés
67
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
2 décembre 2005

En effet il faudrait plutot un truc du genre :

For nbcol = 0 To nbcols - 1

For nbrow = 0 To nbrows - 1

With MSFlexGrid1
.Col = nbcol
.Row = nbrow
End With

with LblMOT
.Caption = MSFlexGrid1.Text
'ici on fait les assignations .cellFont vers Label
end with

If LblMOT.Width > max Then max = LblMOT.Width

Next NbRow

MSFlexGrid1.ColWidth(nbcol) = Max + 300

max = 0

Next NbCol
Messages postés
85
Date d'inscription
mardi 6 janvier 2004
Statut
Membre
Dernière intervention
7 mai 2007

Salut SuperTonic,

J'ai relu ton msg plusieurs fois, et lá franchement
y a un truc que je comprends mais pas du tout!

Premierement:
Tu ecris: "je ne prend pas en compte le nombre de letttre mais bien l'espace que prend une lettre"

mais dans ton code je lis:
(...)
longtxt = Len(MSFlexGrid1.Text)
if longtxt > max Then
max = longtxt
LblMOT.Caption = MSFlexGrid1.Text
End If
(...)

Ou je suis completement bète ou tu prends en compte
le nombre de letttre du texte. Alors?

Deuxiement:
Tu dis qu'il y a de PETITES ameliorations à apporter comme 'stocker dans Max la long de la chaine au lieu de mettre le Width le plus grand de la boucle'.

Or c'est EXACTEMENT ÇA que je me refere: garder le width le plus grand plutot que la longueur de chaine!!!

Encore une fois je deviens fou ou quoi?
Afficher les 15 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (SuperTonic)