Bonjour,
J'aimerais savoir s'il existe une fonction qui me permettrais d'ajuster la taille de mes colonnes de mon StringGrid en fonction de la longueur des données inscrites dans les différents champs....
Merci par avance
Version imprimable
Bonjour,
J'aimerais savoir s'il existe une fonction qui me permettrais d'ajuster la taille de mes colonnes de mon StringGrid en fonction de la longueur des données inscrites dans les différents champs....
Merci par avance
Pour changer la largeur d'une colone il y a la propriété ColWidths.
ex: mettre la largeur à 200 px de la colone 1 :
Pour la taille d'une chaine il y a la fonction membre TextWidth de canvasCode:StringGrid1->ColWidths[1] = 200;
ou st est une AnsiString.Code:StringGrid1->Canvas->TextWidth(st);
Tu peux aussi utiliser, il me semble, length() ...
de façon à ajusté automatiquement la colone au contenu...
Cordialement.
A voir ta réponse je m'suis trompé...
En effet je connait le principe de Lenght()
Mon problème c'est que j'aimerai que en appuyant sur un bouton je puisse parcourir l'ensemble de la colonne et trouver la chaine la plus longue pour pouvoir modifier la taille de ma colonne....
J'ai été clair??
Voila ce que j'ai essayé de construire mais ce n'est pas encore ça...
une idée?Code:
1
2
3
4
5
6
7
8 AnsiString S; for(int i = 0; i<StringGrid1->RowCount; i++) { if(StringGrid1->Cells[StringGrid1->Selection.Left][i].Lenght() > StringGrid1->Cells[StringGrid1->Selection.Left][i+1].Lenght()) S = StringGrid1->Cells[StringGrid1->Selection.Left][i]; else S = StringGrid1->Cells[StringGrid1->Selection.Left][i+1]; }
Tu lis les réponses des fois ?Citation:
Envoyé par ludojojo
voila ou j'en suis :
Mon soucis c'est que lorsque je fait appel à cette fonction, ma colonne devient minuscule!Code:
1
2
3
4
5
6
7
8
9 AnsiString S; for(int i = 0; i<StringGrid1->RowCount; i++) { if(StringGrid1->Cells[StringGrid1->Selection.Left][i].Length() > StringGrid1->Cells[StringGrid1->Selection.Left][i+1].Length()) S = StringGrid1->Cells[StringGrid1->Selection.Left][i]; else S = StringGrid1->Cells[StringGrid1->Selection.Left][i+1]; } StringGrid1->ColWidths[StringGrid1->Selection.Left] = S.Length();
Faut il rajouter un coefficient multiplicateur?
Un monologue !
je ne comprend pas pourquoi vous dites ça...
J'ai bien lu ce que vous m'avez écrit! mais je n'ai pas la solution...
Je l'ai retravailler pour incorporer l'ensemble de vos informations, mais mon problème reste identique, je perd ma colonne...
Code:
1
2
3
4
5
6
7
8
9 AnsiString S; for(int i = 0; i<StringGrid1->RowCount; i++) { if(StringGrid1->Canvas->TextWidth(StringGrid1->Cells[StringGrid1->Selection.Left][i]) > StringGrid1->Canvas->TextWidth(StringGrid1->Cells[StringGrid1->Selection.Left][i+1])) S = StringGrid1->Cells[StringGrid1->Selection.Left][i]; else S = StringGrid1->Cells[StringGrid1->Selection.Left][i+1]; } StringGrid1->ColWidths[StringGrid1->Selection.Left] = StringGrid1->Canvas->TextWidth(S);
Et bien la largeur d'une chaine en pixel ce n'est pas Lenght maisCitation:
je ne comprend pas pourquoi vous dites ça...
Lenght pour une AnsiString renvoie son nombre de caractères.Code:Canvas->TextWidth(Chaine);
justement je pensait calculer le nombre de caratères puis les multiplier par le nombre de pixels qu'il fallait...
Mais votre solution me convient parfaitement, à savoir passer par :
C'est comme cela que je l'ai adapter dans mon dernier exemple de mon code ici en gras :Code:Canvas->TextWidth(Chaine);
mais cela ne fonctionne pas, J'ai une largeur de colonne qui se modifie mais elle reste toujours inférieur à la longueur de la chaine maximal....Code:
1
2
3
4
5
6
7
8
9
10
11
12 void __fastcall TForm_agenda::BitBtn1Click(TObject *Sender) { AnsiString S; for(int i = 0; i<StringGrid1->RowCount; i++) { if(StringGrid1->Canvas->TextWidth(StringGrid1->Cells[StringGrid1->Selection.Left][i]) > StringGrid1->Canvas->TextWidth(StringGrid1->Cells[StringGrid1->Selection.Left][i+1])) S = StringGrid1->Cells[StringGrid1->Selection.Left][i]; else S = StringGrid1->Cells[StringGrid1->Selection.Left][i+1]; } StringGrid1->ColWidths[StringGrid1->Selection.Left] = StringGrid1->Canvas->TextWidth(S); }
mais cela est sur la bonne voi merci... ;)
Déjà ta methode pour chercher le texte le plus large ne va pas du tout.
Quand tu arrive en fin de boucle tu pointe sur Cell[colonne][i+1] c'est à dire une ligne qui n'existe pas.
Je ferais plustôt comme cela :
Code:
1
2
3
4
5
6
7
8 AnsiString S; int WidthCol = 20; // largeur 20 mini ça evite d'avoir des colonnes de largeur 0 for(int i = 0; i<StringGrid1->RowCount; i++) { if(StringGrid1->Canvas->TextWidth(StringGrid1->Cells[StringGrid1->Selection.Left][i]) > WidthCol ) WidthCol = StringGrid1->Canvas->TextWidth(StringGrid1->Cells[StringGrid1->Selection.Left][i]); } StringGrid1->ColWidths[StringGrid1->Selection.Left] = WidthCol;
Je rectifie et je m'excuse auprès de Lucien63...
Cela fonctionne très bien, à l'exception du fait qu'il vaut mieux rajouter quelque pixels pour ne pas se faire aspirer le dernier caractère.
Mon problème de perte de caractères est du au fait que mon tableau n'était pas plein!
une idée pour éviter ce problème???
Effectivement j'ai du confondre avec Lenght() . Le principe était la :)
Merci bcp cela est vraiment parfait!!
;)
:hola: