[Résolu] StringGrid, multiligne et word wrap
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:
Code:
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, dans le constructeur de la fiche:
Code:
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;
}
} |
et la meme chose pour la largeur.
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
WordWrap dans un StringGrid
hello
Dajon a ecrit:
Citation:
Des fois que qqun aies un jour le même problème et tombe sur ce post...
La méthode de passer par un composant invisible gérant le word wrap marche très bien. Je suis passé par un TMemo plutot qu'un TLabel pour récupérer les lignes de manière très simple avec la propriété lines->strings[i] du TMemo.
J'utilise cette methode mais ne parvient pas a écrire sur plusieurs lignes dans mes cellules de StrinGrid
faut-il utiliser le "\r\n" entre chaque ligne [i] du memo
et si oui, quelle est la synthaxe (guillemts, apostrophe??)
merci
Re: WordWrap dans un StringGrid
Bonjour,
Citation:
Envoyé par titicurio
faut-il utiliser le "\r\n" entre chaque ligne [i] du memo
et si oui, quelle est la synthaxe (guillemts, apostrophe??)
Non, il te faut écrire sur le Canvas de ta grille.
Dans l'événement OnDrawCell :
Code:
1 2
| StringGrid1->Canvas->Brush->Color = clWhite;
StringGrid1->Canvas->FillRect(Rect); |
Pour effacer la case, puis tu écris à l'intérieur avec
Code:
StringGrid1->Canvas->TextRect
Bonne Continuation,
Mathieu