MSFLEXGRID : AJUSTER AUTOMATIQUEMENT LA LARG. DES COLS.

bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005 - 2 nov. 2004 à 20:47
cs_castagne Messages postés 20 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 9 janvier 2008 - 16 févr. 2005 à 13:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/27269-msflexgrid-ajuster-automatiquement-la-larg-des-cols

cs_castagne Messages postés 20 Date d'inscription jeudi 27 mars 2003 Statut Membre Dernière intervention 9 janvier 2008
16 févr. 2005 à 13:55
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+
SuperTonic Messages postés 53 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 16 mars 2011
27 déc. 2004 à 20:17
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"
microalexx Messages postés 12 Date d'inscription lundi 30 juin 2003 Statut Membre Dernière intervention 9 juillet 2007
23 déc. 2004 à 15:44
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.

+
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
21 déc. 2004 à 17:35
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
Silmon Messages postés 85 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 7 mai 2007
21 déc. 2004 à 17:22
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?
SuperTonic Messages postés 53 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 16 mars 2011
18 déc. 2004 à 09:34
Bonjour tout le monde.
Je suis un peu à réagir.

Alors concernant :
"iiii" (4 lettres) sera toujours plus court que "ooo" (3 lettres).

Le problème ne se pose pas, puisque je ne prend pas en compte le nombre de letttre mais bien l'espace que prend une lettre.
Si tu mets dans un Label Autosize "ooo" le label va s'étendre pour afficher "ooo" donc partant de là il suffit de récupérer la valeur du width pour l'attribuer à la largeur de la colone.
C'est tout bête ! Tu peux t'amuser à ettre du gras ou des iiii et des ww : ça marchera !

Mais il y a sans doute des petites amélioration à apporter. Comme par exp au lieu de stocker dans Max la long de la chaine, mettre le Width le plus grand de la boucle.

Voilà !
Bonne prog" les amis
Silmon Messages postés 85 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 7 mai 2007
12 nov. 2004 à 16:30
Bidoch78
Je ne suis pas tres sûr de comprendre ce que tu veux dire par "comme il passe par un label, ca sera respecté".

Meme en passant par un label, le texte

"iiii" (4 lettres) sera toujours plus court que
"ooo" (3 lettres).

Donc il est preferable de faire un loop sur la grid et de recuperer la longueur max de chaque chaine, au lieu
de recuperer la chaine la plus longue et de prendre sa longueur.

Par ailleurs pour SuperTonic,
essaye la fonction TextWidth:
LongueurChaine=me.TextWidth(grid.textmatrix(row,col))

plutot que de passer par un label:
label1.caption = grid.textmatrix(row,col)
LongueurChaine=label1.width

-> ce sera plus rapide (surtout dans une boucle)

Mais certifie toi que les proprietes fonts de la form combinent avec celles de la grid.

++
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
10 nov. 2004 à 18:15
ah ok, excuses, mais comme il passe par un label, ca sera respecté.
Silmon Messages postés 85 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 7 mai 2007
10 nov. 2004 à 17:57
non je ne pense pas.

Je ne parle pas de changement de font ni de changement de case,

mais de la longueur qu'occupe certaines lettre par rapport a d'autre.
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
10 nov. 2004 à 17:01
enfin c'est ce qu'il precise dans le 2eme post
Silmon Messages postés 85 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 7 mai 2007
10 nov. 2004 à 16:44
Si j'ai bien compris ton algo, tu redim la colonne que pour le mot qui a le plus de lettres, n'est-ca pas?
Si c'est le cas, essaye avec:
- iiii (4 lettres)
- ooo (3 lettres)

Selon le tipe de font, le mot le plus "long" n'est pas toujours celui qui a le plus de lettres!
edsinouhe Messages postés 7 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 28 juin 2010
10 nov. 2004 à 08:17
Juste un petit conseil de développeur...
Lorsque tu définis des variables (Dim nbcol As Integer) il est préférable d'introduire des majuscules dans l'identifiant (Dim NbCol As Integer), ceci permet de détecter immédiatement une anomalie de frappe ou de définition qui n'apparaît que lors de l'exécution: variable non définie... (voir Option Explicit).
thierrydelepine Messages postés 521 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 11 septembre 2008 6
2 nov. 2004 à 21:06
un mot : simple

ton code est simple et bien construit.

Renfield avait fait un code pour retailler les msflexgrid mais le sien était beaucoup plus etoffé.

le tiens est simple, tres bien 9/10
SuperTonic Messages postés 53 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 16 mars 2011
2 nov. 2004 à 20:52
bienvu !
j'ai pas penser aux chgmt de case !
puisque je n'en fais pas !

merci de ce complemt d'info important !
bidoch78 Messages postés 67 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 2 décembre 2005
2 nov. 2004 à 20:47
On fait la meme au taf.

Un petit complement si tu modifies les Fonts au niveau cellules il faudrait affecter les valeurs CellFontBold, etc.... à ton label.
Rejoignez-nous