J'ai également répondu à cette même question sur Stack Overflow (lien), mais :
- je ne suis pas sûr que Kamel38 reçoive la notification
- comme je suis avant tout francophone, autant la poster ici en français, ce qui pourrait servir à d'autres
Durant l'exécution de l'appli, les ListBoxItems ont un style déjà calculé et appliqué : aListBoxItem.StyledSettings.
Pour le changer à ce moment-là, on doit d'abord retirer la propriété visée de la liste des StyledSettings.
La propriété WordWrap est définie dans TStyledSetting.Other.
1 2 3 4
| //Pour la changer, on retire la définition de TStyledSetting.Other:
aListboxItem.StyledSettings := aListboxItem.StyledSettings - [TStyledSetting.Other];
//Puis on applique notre valeur à cette propriété:
aListboxItem.WordWrap := True; |
Pour une correspondance entre les constantes TStyledSetting et les propriétés TTextSettings voir la doc Delphi.
A noter, la propriété ListBox.Items[i] donne accès au contenu de l'objet, pas l'objet lui-même.
Pour manipuler un ListboxItem et ses propriétés on doit utiliser :
1 2 3
| aListboxItem := theListBox.ListItems[i];
//ou
aListboxItem := theListBox.ItemByIndex(i); |
Les deux donnent le même résultat, je ne sais pas où se situe la différence.
Une fois que le texte revient à la ligne comme on le souhaite, on doit redimensionner le ListBoxItem pour voir le texte en entier.
On peut le faire dans l'évènement OnApplyStyleLookup, en utilisant un TTextLayout :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| uses
... ,FMX.TextLayout;
procedure TfrmForm1.ListBoxItem1ApplyStyleLookup(Sender: TObject);
var
myLayout: TTextLayout;
i: integer;
aPoint: TPointF;
begin
myLayout := TTextLayoutManager.DefaultTextLayout.Create;
myLayout.BeginUpdate;
// paramétrer layout MaxSize
aPoint.X := ListBoxItem1.Width;
aPoint.Y := TfrmForm1.Height;
myLayout.MaxSize := aPoint;
myLayout.Text := ListBoxItem1.Text;
myLayout.WordWrap := True ;
myLayout.Font := ListBoxItem1.Font;
myLayout.HorizontalAlign := ListBoxItem1.TextSettings.HorzAlign;
myLayout.VerticalAlign := ListBoxItem1.TextSettings.VertAlign;
myLayout.Padding := ListBoxItem1.Padding;
// paramétrer les propriétés nécessaires
myLayout.EndUpdate;
ListBoxItem1.Height := Trunc(myLayout.TextHeight) + 3 ; // ajuster la taille pour bien voir le texte en entier
end; |
A noter : MaxSize est limitante. Si myLayout.TextHeight est supérieur à myLayout.MaxSize.Y c'est myLayout.MaxSize.Y qui sera pris en compte, quel que soit la valeur de TextHeight.
Il faut donc prévoir un aPoint.Y suffisamment grand pour ne pas être limité.
N.B.: Il peut être nécessaire de redimensionner le texte avant d'effectuer le calcul du Layout.
Dans mon cas (Samsung Note 2), la lecture de la propriété ListBoxItem1.Font.Size = 14 mais le rendu à l'écran est 18.
Pour ce faire on peut appliquer :
1 2
| ListBoxItem1.StyledSettings := ListBoxItem1.StyledSettings - [TStyledSetting.Size] ;
ListBoxItem1.Font.Size := ListBoxItem1.Font.Size ; |
Il est également possible d'utiliser un composant TListView à la place d'un TListBox.
TListView est plus à l'aise avec les grandes listes d'éléments et la propriété WordWrap est accessible dans l'inspecteur d'objets.
ListView1 > ItemAppearanceObjects > ItemObjects > Text > WordWrap
Partager