Hello!
Bon, j'ai déjà vu les posts traitant du mutiligne dans les tring grid, mais comme cela ne correspond pas tout a fait à ce que je souhaite faire, je me permet de faire un nouveau thread.
Mon application remplit une StringGrid 30*3000 à partir d'un fichier .csv généré avec Excel. L'import de texte se passe tout bien et j'utilise les deux bouts de code suivants pour adapterla taille de mes cellules à ce qu'il y a dedans:
et, dans le constructeur de la fiche:
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 void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { //Texte sur plsr lignes: AnsiString s = StringGrid1->Cells[ACol][ARow]; div_t nbl; nbl = div (s.Length(),30); int hauteur = (Rect.Top - Rect.Bottom)/(nbl.quot + 1); TRect R = Rect; for(int i = 0; i<=nbl.quot; i++) { AnsiString t = s.SubString(1 + 30*i, 30); R.Top = Rect.Top - (i*hauteur); R.Bottom = R.Top - hauteur; StringGrid1->Canvas->TextRect(R, R.Left, (R.Top + R.Bottom - StringGrid1->Canvas->TextHeight(t)) / 2, t); } }
et la meme chose pour la largeur.
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 div_t nbl; int tmplig = 0, final = 0; for(int i = 0; i < StringGrid1->RowCount; i++) { final=25; for(int j = 0; j < StringGrid1->ColCount; j++) { nbl = div(StringGrid1->Cells[j][i].Length(),30); if(nbl.quot >= 1) { tmplig=StringGrid1->Canvas->TextHeight(StringGrid1->Cells[j][i])*(nbl.quot+1); if(final < tmplig) final = tmplig; } StringGrid1->RowHeights[i]=final; } }
Ca marche tout bien, mais le problème c'est que je coupe mes chaines lorsqu'elles dépassent un certain nombre de caractères (ici 30) et c'est un peu violent comme façon de faire... d'autant que ca ne tient pas compte de la largeur réelle des caractères donc des fois, ma chaine est coupée alors qu'il y aurai eu la place de terminer sur la meme ligne...
Est-ce que qqun s'est déjà penché sur la question, et à trouver un moyen de faire du word wrap dans les cellules de la string grid, avec un traitement assez rapide (j'ai des solutions qui marchent plus ou moins, mais comme j'ai 3000 lignes, le traitement est très long :/ )
Merci d'avance
Arnaud
Partager