IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Blog de Serge Girard (aka SergioMaster)

[FMX] ListBox et styles

Noter ce billet
par , 17/07/2019 à 12h17 (1686 Affichages)
Je reviens un peu sur TListBox que j'avais largement laissé tomber au profit de TListView.
Ma première étape a été de revoir les styles d'items proposés en particulier colorlistboxitemstyle les autres étant plus aisé puisqu'il ne s'agit que de diverses variation avec une zone détail visible et des positions des textes.
Nom : Capture_1.PNG
Affichages : 1894
Taille : 7,6 Ko
Bien sûr pour arriver à ce résultat il y a plusieurs manières de procéder, de plus en plus habitué à TListView j'ai d'abord tenté une approche à base de FindStyleResource mais, même si j'ai fini par y arriver, force est de constater que ce n'était pas la bonne solution. Il m'a fallu relire mon propre tutoriel Introduction aux Styles Firemonkey pour me remettre dans la bonne direction.

Au cas où vous vous questionnerez sur la manière de faire pour le "coloriage" toute l'astuce réside dans l'utilisation de l'évènement de liste : OnFilledListItem.*

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
procedure TForm1.FillListeFilledListItem(Sender: TObject;
  const AEditor: IBindListEditorItem);
var aItem : TListBoxItem;
begin
if AEditor.CurrentObject is TListBoxItem then
 begin
  AItem:=TListBoxItem(AEditor.CurrentObject);
  try
    AItem.StylesData['Color.Fill.Color']:=StringToAlphaColor(AItem.Text);
  except
    AItem.StylesData['Color.Fill.Color']:=TAlphaColors.null;
    AItem.StylesData['Color.Stroke.Color']:=TAlphaColors.null;
   end;
 end;
end;
Pour ce qui est du remplissage, j'ai utilisé un TProtypeBindSource pour obtenir toutes les couleurs répertoriées et bien sûr les LiveBindings

Nom : Capture_2.PNG
Affichages : 460
Taille : 42,5 Ko

Toutes les couleurs ? En fait, et c'est pour cela qu'il y a un bloc try except, il semblerait qu'il y ait un petit bogue dans le générateur car certains noms de couleurs sont inconnus : Cream,LegacySkyBlue, LtGray, MedGray sont ceux que j'ai relevés. Je me demande si ce petit bogue a été signalé .

Modifiez le bloc d'exception en AItem.SytlesData['Color.Visible']:=False; pour les mettre plus facilement en exergue.

Seconde étape, j'ai voulu personnaliser la présentation ce qui m'a fait prendre conscience du bond en avant de l'éditeur de style entre la version XE4 utilisée au cours de l'écriture du tutoriel déjà cité et la version Rio (10.3) que j'utilise actuellement, fini les manipulations "AFRO" évitant les crises de nerfs
Voilà donc le nouveau style que je vais appliquer
Nom : Capture_3.PNG
Affichages : 437
Taille : 17,2 Ko
J'ai modifié le type d'alignement aussi bien du rectangle (color), également relégué en arrière plan, ainsi que celui du texte (text) avant d'ajouter un autre TText pour afficher la valeur hexadécimale de la couleur (mettre la fonte en "courrier new" permet d'obtenir un meilleur rendu). Si dans mon style personnalisé j'ai utilisé comme propriété StyleName la valeur "hexvalue" ce n'est pas aussi anodin que cela le semble, le fait d'indiquer un nom de style permet ainsi d'utiliser StylesData

Il me suffira de deux étapes :
  1. Modifier le style par défaut (propriété DefaultItemStyle.ItemStyle);
  2. Changer légèrement le code pour affecter la nouvelle valeur

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
procedure TForm1.FillListeFilledListItem(Sender: TObject;
  const AEditor: IBindListEditorItem);
var aItem : TListBoxItem;
     color : TAlphaColor;
begin
if AEditor.CurrentObject is TListBoxItem then
 begin
  AItem:=TListBoxItem(AEditor.CurrentObject);
  try
    AItem.StylesData['Color.Fill.Color']:=StringToAlphaColor(AItem.Text);
    Color:=StringToAlphaColor(AItem.Text);
    AItem.StylesData['hexvalue']:=Format('#%x',[Color]);
  except
    AItem.StylesData['Color.Fill.Color']:=TAlphaColors.null;
    AItem.StylesData['Color.Stroke.Color']:=TAlphaColors.null;
    AItem.StylesData['hexvalue']:='unkwown';
   end;
 end;
end;
Nom : Capture.PNG
Affichages : 501
Taille : 16,1 Ko

Le résultat souhaité est bien obtenu, le seul hic concerne la couleur noire puisque le nom est invisible (noir sur noir = invisible ). Il y aurait certainement quelque chose de possible à faire au niveau du code sujet possible d'un futur billet.


*28/03/2021 Cela fait plus d'un an que j'ai publié ce billet, personne n'a relevé que le TListBox n'avait aucun évènement OnFilledListItem.
mea culpa, les plus de 500 lecteurs (merci à eux) ont dû être déçu de ne pouvoir reproduire ça sans passer par la case "étude du source".
En fait il s'agit de l'utilisation d'un évènement du LiveBinding associé à la liste, un TLinkFilledControlToField, que j'avais renommé en 'FillList'
Miniatures attachées Fichiers attachés

Envoyer le billet « [FMX] ListBox et styles » dans le blog Viadeo Envoyer le billet « [FMX] ListBox et styles » dans le blog Twitter Envoyer le billet « [FMX] ListBox et styles » dans le blog Google Envoyer le billet « [FMX] ListBox et styles » dans le blog Facebook Envoyer le billet « [FMX] ListBox et styles » dans le blog Digg Envoyer le billet « [FMX] ListBox et styles » dans le blog Delicious Envoyer le billet « [FMX] ListBox et styles » dans le blog MySpace Envoyer le billet « [FMX] ListBox et styles » dans le blog Yahoo

Mis à jour 28/03/2021 à 09h28 par SergioMaster

Tags: delphi, fmx, listes, styles
Catégories
Programmation , Delphi , FMX

Commentaires

  1. Avatar de SergioMaster
    • |
    • permalink
    Il semblerait que le zip contenant la démo soit corrompu, en attendant que je le corrige je vous fournis une version qui gère plus ou moins bien la couleur de texte en fonction de la couleur de fond.