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.
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.*
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
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
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 :
Modifier le style par défaut (propriété DefaultItemStyle.ItemStyle);
Changer légèrement le code pour affecter la nouvelle valeur
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;
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'
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité,
merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.