Comment mettre de la CR/LF dans un TStringgrid cellule?
Je veux avoir une ligne fixe, comme en-tête, mais les textes sont assez longs, donc je voudrais augmenter la hauteur de ligne et insérez CR/LF dans le texte de la cellule.
Googler montre cela comme une solution (et c'est la première chose que j'ai pensé de fo avant de googler), mais il baisse pas les voir au travail. Des idées?
Grid.Cells[2,3] := 'This is a sample test' + #13#10 + 'This is the second line';
Ce qui se passe, c'est que la cellule contient This is a sample testThis is the second line
(Delphi 7 si cela fait une différence)
[Prime] "Mon mauvais. J'ai reçu cette réponse il y a deux ans sans contrôle et sans constatons maintenant que la réponse n'a pas de travail. Aplogies à toute personne qui a été induit en erreur. C'est un FABOWAQ (les plus fréquemment posées, souvent à tort répondu à la question). GINYF".
Je présume que nous sommes à la recherche d'utiliser OnDrawCell, mais imaginez que nous aurions aussi à augmenter la hauteur de la chaîne de ligne de la grille qui contient la cellule.
Je vais le prix de la réponse de code et /ou un FOSS de composants VCL.
[Mise à jour] doit travailler avec Delphi XE2 Starter edition
OriginalL'auteur Mawg | 2010-12-11
Vous devez vous connecter pour publier un commentaire.
TStringGrid
utiliseCanvas.TextRect
, qui utiliseExtTextOut
, qui à son tour ne prend pas en charge le dessin de texte multiligne.Vous devez dessiner vous-même dans un
OnDrawCell
gestionnaire d'événements avec WinAPI estDrawText
routine. Voir, par exemple, cette réponse sur la façon d'utiliserDrawText
de texte multiligne, et cette récente réponse sur la façon de mettre en œuvre de dessin personnalisé dansOnDrawCell
:Il y a aussi d'autres StringGrid composants en mesure de dessin de texte multiligne. Par exemple, cette une qui je l'ai écrit moi-même (sources de téléchargement: NLDStringGrid + NLDSparseList) avec, éventuellement, ce résultat:
Compilation échoue - ne peut pas trouver DesignEditors.dcu - probablement parce que je suis en utilisant XE2 Starter edition ?
Peut-être, mais je ne sais pas. Avez-vous convertir le package du fichier XE2? Remarque le
requires DesignIde
ligne! Essayez d'exécution autrement.Le code ci-dessus (pas de paquet), fonctionne très bien - sauf ... si toutes les inscriptions en ligne sont vide, la ligne apparaît comme un pixel de haut. Peut être est ce la ligne par défaut hight? Essayez ceci -
FillWithRandomText()
déposer les boucles et les attribuer à une seule cellule (direCells[3,3]
). Je pense que vous obtiendrez la prime sur celui-ci, mais il serait bien si vous pouviez tweak qui ligne vide de la chose.J'ai changé
UpdateRowHeights()
deMaxHeight := 0;
àMaxHeight := AGrid.DefaultRowHeight;
et les lignes vides maintenant, regardez raisonnable.OriginalL'auteur NGLN
La TStringGrid du moteur de rendu par défaut ne prennent pas en charge plusieurs lignes. En définissant la TStringGrid dans OwnerDraw mode (en invoquant la OnDrawCell événement), vous pouvez vous rendre chaque cellule par votre propre convenance.
Ont un coup d'oeil à cette pour un exemple qui a aidé un utilisateur précédent.
Lié à un code de référence inséré:
Je pense que cela va bien fonctionner pour vous...
RowHeights[]
dans leDrawCell
routine. Uglhh...c'est un exemple (en nombre de points) de la façon dont vous ne devriez pas écrire le code (sauf qu'il fait ce que NGLN souligné). Ma suggestion, ne pas l'utiliser...
Le premier appel à
DrawText
(avec DT_CALCRECT drapeau) calcule le rectangle nécessaire de dessiner le texte, qui tient compte de plusieurs lignes.Oui, pour le calcul de l'rectangle de 3 lignes. En outre, si l'une des lignes dépasse le bord de droite, il sera enveloppé (en raison de la
DT_WORDBREAK
drapeau), de sorte que vous pouvez vous retrouver avec plus de lignes.Le code est à partir d'un forum en 2003. LU RD a collé le code ici, j'ai seulement lié à l'original post. Cependant, je ne suis pas un programmeur Delphi (j'utilise C++ Builder) et de la même bibliothèque VCL de Delphi, les utilisateurs utilisent. Il se pourrait que le composant TStringGrid a été changé depuis 2003 (pas la première fois qu'ils se déplacent autour de stuff). Ma conjecture est que SetGridHeight() a été appelé à la force la cellule à redessiner lui-même, donc de tomber dans cette routine à nouveau, mais cette fois la hauteur de la cellule, sera adapté à l'ensemble du texte et sera tiré. (suite dans le prochain commentaire)
OriginalL'auteur Max Kielland