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

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

[FMX] Des navigateurs de données (TBindNavigator) en couleur
Un billet blog de SergioMaster

Le , par SergioMaster

0PARTAGES

Via ce billet, je vous propose d'égayer le composant FMX TBindNavigator.
On pourrait penser que toucher au style permettrait ce genre de chose, mais cet élément de style n'existe pas.
La couleur appliquée pour les glyphes est celle de la couleur d'un texte du style en cours. Pour les curieux le code d'obtention de cette couleur se trouve dans la procédure TBindNavButton.ApplyStyle de l'unité FMX.Bind.Navigator.
En n'utilisant "aucun" style on obtient ceci

661509

Alors qu'en VCL un navigator s'affiche ainsi

661510

Bien qu'en FMX je ne suis pas un fervent utilisateur du composant TBindNavigator ou alors uniquement de la partie concernant la navigation, je me suis mis au défi de customiser ce composant. Avant de passer à de grands travaux, l'écriture d'un composant, j'ai voulu tester la faisabilité via des Helpers.

Je vous propose donc cette unité
unit ColoredBindNavigator;

interface

uses System.Classes, System.UIConsts,System.UITypes,
FMX.Bind.Navigator, Data.Bind.Controls;

/// range TNavigateButton in three groups
const NavigatorScrollings = [nbFirst, nbPrior, nbNext, nbLast,nbRefresh];
NavigatorValidations = [nbInsert, nbDelete, nbEdit, nbPost, nbCancel,
nbApplyUpdates];
NavigatorCancelations = [nbDelete,nbCancel,nbCancelUpdates];

type

TNavigatorColors = record
scroll : TAlphacolor;
update : TAlphacolor;
cancel : TAlphacolor;
class operator initialize (out Dest: TNavigatorColors);
class operator finalize (var Dest: TNavigatorColors);
end;

TColorNavButton = class helper for TBindNavButton
/// set the color of the Tpath.fill.color property
procedure setcolor(c : TAlphaColor);
/// apply the custom colors corresponding to the TNavigateButton type
/// Three groups NavigatorScrollings,NavigatorValidations,NavigatorCancelations
/// see const part
procedure ApplyColorStyle(customcolors : TNavigatorColors);
end;

TColorBindNavigator = class helper for TCustomBindNavigator
/// initialize and apply custom colors
function customcolors(scrollcolor, Updatecolor, cancelcolor : TAlphaColor) : TNavigatorColors; overload;
function customcolors(colors : TNavigatorColors) : TNavigatorColors; overload;
end;

implementation

{ TColorNavButton }
procedure TColorNavButton.ApplyColorStyle(customcolors : TNavigatorColors);
var defaultstylecolor : TAlphaColor;
begin
inherited;
with Self do
DefaultStylecolor:=FPath.Fill.Color;
if (TNavigateButton(Self.index) in NavigatorScrollings)
AND (customcolors.scroll<>TAlphacolors.Alpha)
// todo test AND (customcolors.scroll<>DefaultStyleColor)
then Setcolor(customcolors.scroll);
if (TNavigateButton(Self.index) in NavigatorValidations)
AND (customcolors.update<>TAlphacolors.Alpha)
then Setcolor(customcolors.update);
if (TNavigateButton(Self.index) in NavigatorCancelations)
AND (customcolors.cancel<>TAlphacolors.Alpha)
then Setcolor(customcolors.cancel);
end;

procedure TColorNavButton.setcolor(c: TAlphaColor);
begin
with Self do
FPath.Fill.Color:=c;
end;

{ TNavigatorColors }
class operator TNavigatorColors.finalize(var Dest: TNavigatorColors);
begin
// nothing to do
end;

class operator TNavigatorColors.initialize(out Dest: TNavigatorColors);
begin
Dest.scroll:=TAlphaColors.Alpha;
Dest.update:=TAlphaColors.Alpha;
Dest.cancel:=TAlphaColors.Alpha;
end;


{ TColorBindNavigator }
function TColorBindNavigator.customcolors(scrollcolor, Updatecolor,
cancelcolor: TAlphaColor) : TNavigatorColors;
begin
result.scroll:=scrollcolor;
result.update:=updatecolor;
result.cancel:=cancelcolor;
for var i := 0 to self.ControlsCount-1 do
TBindNavButton(Self.Controls).ApplyColorStyle(result);
end;

function TColorBindNavigator.customcolors(
colors: TNavigatorColors): TNavigatorColors;
begin
for var i := 0 to self.ControlsCount-1 do
TBindNavButton(Self.Controls).ApplyColorStyle(colors);
end;

end.


L'utilisation en est assez simple :

  • Ajoutez l'unité au projet.
  • Dans la forme contenant le composant TBindNavigator que vous voulez "colorier", ajoutez l'unité à la clause uses dans la partie interface.Vous obtiendrez alors quelque chose de ce genre :


    interface

    uses
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
    Data.Bind.Controls, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts,
    Fmx.Bind.Navigator, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMX.Objects,
    FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
    FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
    FireDAC.Stan.StorageBin, Data.Bind.Components, Data.Bind.DBScope, Data.DB,
    FireDAC.Comp.DataSet, FireDAC.Comp.Client,
    ColoredBindNavigator
    ;


  • Déclarez une variable privée (à moins que vous ne vouliez la partager) au sein de votre forme.

    type
    TForm1 = class(TForm)
    BindNavigator1: TBindNavigator;
    btnDark: TButton;
    Memo1: TMemo;
    FDMemTable1: TFDMemTable;
    BindSourceDB1: TBindSourceDB;
    Label1: TLabel;
    StyleBook1: TStyleBook;
    Button1: TButton;
    procedure btnDarkClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    private
    { Déclarations privées }
    Colors : TNavigatorColors;
    public
    { Déclarations publiques }
    end;


  • Utilisez ensuite les diverses fonctions proposées.

    Deux exemples :

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    CustomColorsNavigator :=true;
    colors:=BindNavigator1.customcolors(Talphacolors.blue,Talphacolors.Green,Talphacolors.Red);
    end;


    procedure TForm1.btnDarkClick(Sender: TObject);
    begin
    colors.scroll:=Talphacolors.darkBlue;
    colors.update:=Talphacolors.darkGreen;
    colors.cancel:=TAlphacolors.darkRed;
    for var i := 0 to BindNavigator1.ControlsCount-1 do
    TBindNavButton(BindNavigator1.Controls).ApplyColorStyle(colors);
    end;


    Vous pourrez ainsi obtenir ce navigateur, qui sans être totalement identique à celui proposé en VCL, la technique des TPath
    utilisée empêchant un remplissage autre que monochrome les boutons nbApplyUpdates et nbCancelUpdates sont donc un peu pénalisés.

    661511

    661512 contient les sources de mon programme test écrit en Delphi 12ֽ_1.
    Note : L'utilisation d'un managed record limite aux versions supérieures ou égales à 10_4.

    Que reste t-il à contrôler ? L'utilisation d'un style, mes essais m'ont imposé l'utilisation d'une variable et d'un évènement OnPainting (commentés dans le source proposé), vérifiez donc que les commentaires sur ce billet ne contienne pas un correctif car bien évidemment ;) je ne veux pas rester sur cette constatation.
  • Vous avez lu gratuitement 3 834 articles depuis plus d'un an.
    Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

    Une erreur dans cette actualité ? Signalez-nous-la !