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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

Creer un composant qui contient un ensemble de propriétés, un TBindNavigator colorisé


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut Creer un composant qui contient un ensemble de propriétés, un TBindNavigator colorisé
    Bonjour,

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    //    TGlyphColors = class
    //      private
    //        FColors: array[0..3] of TAlphaColor;
    //        function GetColor(Index: Integer): TAlphaColor;
    //        procedure SetColor(Index: Integer; Value: TAlphaColor);
    //      public
    //        property Navigation : TAlphaColor index 0  read GetColor
    //                                        write SetColor;
    //        property Edit : TAlphaColor index 1   read GetColor
    //                                        write SetColor;
    //        property Cancel : TAlphaColor index 2 read GetColor
    //                                        write SetColor;
    //        property Colors[Index: Integer]: TAlphaColor
    //                                        read GetColor
    //                                        write SetColor;
    //    end;
     
        TColoredBindNavigator = class(TCustomBindNavigator)
        private
          FColors: array [0 .. 3] of TAlphaColor;
          FNavigation : TAlphaColor;
          FEdit : TAlphaColor;
          FCancel : TAlphaColor;
          function GetColor(const Index: Integer): TAlphaColor;
          procedure SetColor(const Index: Integer; const Value: TAlphaColor = TAlphaColors.Null);
        protected
          property Navigation: TAlphaColor index 0 read GetColor write SetColor;
          property Edit: TAlphaColor index 1 read GetColor write SetColor;
          property Cancel: TAlphaColor index 2 read GetColor write SetColor;
        public
          { Déclarations publiques }
          constructor Create(AOwner: TComponent); override;
          destructor Destroy; override;
        published
          ??????
        end;
    Après avoir (plus ou moins) réalisé mon composant dérivé d'un TCustomGrid en ayant les trois propriétés (Navigation, Edit, Cancel) je voudrais avoir un propriété "racine" GlyphColors qui proposerait le remplissage des 3 propriétés

    J'ai bien réussi un truc comme ça via un TCollection
    Nom : Capture.PNG
Affichages : 247
Taille : 19,6 Ko
    mais cela ne correspond pas trop à mon attente les x-GlyphColor ... c'est pas très parlant, j'eusse aimé à la place les noms cités au dessus

    D'où mon code différent. En commentaire la syntaxe est correcte mais impossible de mettre
    property Colors[Index: Integer]: TAlphaColor read GetColor write SetColor;dans le code du composant (encore un truc qui me fait douter de ma maitrise de Delphi !)

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    La Gestionnaire de Flux ne gère pas les propriétés avec indice
    D'ailleurs dans TStrings ou TCollection, la propriété Items ou Strings, propriété par défaut au passage est public et non published !

    TCollection ne se sérialize pas elle-même c'est le composant qui la contient (une version héritée d'ailleurs) qui indique comme la sérialiser (souvent via TReader.ReadCollection et TWriter.WriteCollection)
    TStrings se sérialize de lui-même, il fourni ReadData et WriteData pour écrire la propriété Strings qui est bien géré manuellement (non publiée mais sérializée quand même, vicelard quand on y pense)

    Il te faut utiliser DefineProperty que tu définis dans une redefinition de DefineProperties
    Il te faut fournir la fonction de Lecture et d'Écriture à DefineProperty

    ça c'est pour le gestionnaire de flux

    Pour l'IDE, il faut un Property Editor
    On le voit pas mais la TCollection doit fournir un Property Editor par défaut c'est dans ColnEdit.pas TCollectionEditor
    .
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    La classe TGlyphColors doit hériter de TPersistent et ses trois propriétés couleurs être published.

    TColoredBindNavigator crée une instance de cette classe, accessible à travers une propriété publiée et donc visible dans l'inspecteur.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    La classe TGlyphColors doit hériter de TPersistent et ses trois propriétés couleurs être published.
    Oui, j'en étais arrivé à cette conclusion en fin de matinée hier.
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    type
      TGlyphColors = class(TPersistent)
      private
        FColors: array [0 .. 3] of TAlphaColor;
        function GetColor(Index: Integer): TAlphaColor;
        procedure SetColor(Index: Integer; Value: TAlphaColor);
      public
        constructor Create();
        destructor Destroy; override;
      published
        property Navigation: TAlphaColor index 0 read GetColor write SetColor;
        property Edit: TAlphaColor index 1 read GetColor write SetColor;
        property Cancel: TAlphaColor index 2 read GetColor write SetColor;
        // property Colors[Index: Integer]: TAlphaColor
        // read GetColor
        // write SetColor;
      end;
     
      TColoredBindNavigator = class(TCustomBindNavigator)
      private
        FGlyphColors: TGlyphColors;
        function GetGlyphColor(const Index: Integer): TAlphaColor;
        procedure SetGlyphColor(const Index: Integer; const Value: TAlphaColor);
        function read: TGlyphColors;
        procedure SetGlyphColors(const Value: TGlyphColors);
      public
        { Déclarations publiques }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property GlyphColors: TGlyphColors read FGlyphColors write SetGlyphColors;
      end;
    et j'en étais à ce stade : il y a le groupe mais pas le détail de celui-ci
    Nom : Capture.PNG
Affichages : 210
Taille : 11,2 Ko

    Mais fin de matinée égal souvent, pour moi, fin d'utilisation de Delphi (privilège de retraité ), je rendrai donc compte plus tard du résultat

    [Edit : 10:00]
    c'est pas gagné mais ça avance.
    Nom : Capture.PNG
Affichages : 199
Taille : 6,7 Ko
    Je ne peux pas encore changer les couleurs et les valeurs affichées sont étranges (normalement ce devrait être Null à la création)

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Pense au Default aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property Navigation: TAlphaColor index 0 read GetColor write SetColor default TAlphaColors.Null;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut Fin de matinée
    Bonjour,

    @ShaiLeTroll les valeurs par défaut sont faites à l'initialisation donc pas de souci

    Créé au runtime mon composant fonctionne
    Nom : Capture.PNG
Affichages : 184
Taille : 4,5 Ko
    Bon, en fait, pas tout à fait puisque les sélections de couleurs des boites de choix ne s'appliquent pas.

    Ce qui me ramène à ce souci, à la pose du composant au design
    Nom : Capture.PNG
Affichages : 184
Taille : 12,3 Ko
    Je ne trouve pas vraiment le moyen d'appliquer les couleurs à chaque changement des propriétés de couleur, il doit me manquer un truc

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    @ShaiLeTroll les valeurs par défaut sont faites à l'initialisation donc pas de souci
    default sur la propriété évite la sauvegarde dans le DFM, c'est sans rapport avec l'initialisation à la construction, même si habituellement on met les mêmes valeurs.

    Citation Envoyé par SergioMaster Voir le message
    Je ne trouve pas vraiment le moyen d'appliquer les couleurs à chaque changement des propriétés de couleur, il doit me manquer un truc
    Tu as toujours deux classes indépendantes, TColoredBindNavigator connait TGlyphColors par sa propriété mais l'inverse n'est pas vrai.

    Tu dois ajouter un champ Owner (par exemple) à TGlyphColors et l'initialiser à son instanciation et ajouter une méthode ColorChanged à TColoredBindNavigator, méthode invoquée par le setter de TGlyphColors permettant de demander un invalidate.

    Quelque chose comme ceci :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    type
      TColoredBindNavigator = class;
     
      TGlyphColors = class(TPersistent)
      private
        FOwner :TColoredBindNavigator;
        procedure SetColor(const Index: Integer; const Value: TAlphaColor);
      public
        constructor Create(aOwner :TColoredBindNavigator);
      published
        property Navigation: TAlphaColor index 0 read GetColor write SetColor;
      end;
     
      TColoredBindNavigator = class(TCustomBindNavigator)
      private
        FGlyphColors: TGlyphColors;
        procedure ColorChanged;
      public
        constructor Create(AOwner: TComponent); override;
      end;
     
    implementation
     
    { TGlyphColors }
     
    constructor TGlyphColors.Create(aOwner: TColoredBindNavigator);
    begin
      inherited Create;
      FOwner := aOwner;
    end;
     
    procedure TGlyphColors.SetColor(const Index: Integer; const Value: TAlphaColor);
    begin
      if FColors[Index] <> Value then
      begin
        FColors[Index] := Value;
     
        if Assigned(FOwner) then
          FOwner.ColorChanged;
      end;
    end;
     
    { TColoredBindNavigator }
     
    procedure TColoredBindNavigator.ColorChanged;
    begin
      Invalidate;
    end;
     
    constructor TColoredBindNavigator.Create(AOwner: TComponent);
    begin
      inherited;
      FGlyphColors := TGlyphColors.Create(Self);
    end;

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut
    Bonjour et merci

    Citation Envoyé par Andnotor Voir le message
    default sur la propriété évite la sauvegarde dans le DFM
    Ben justement, je veux que les couleurs soient stockées dans le dfm pour que, au runtime elles soient appliquées

    Tu dois ajouter un champ Owner (par exemple) à TGlyphColors
    Mais oui, bien sûr, et dire que je l'avais fait dans une version ultérieure de mes essais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ajouter une méthode ColorChanged
    Même si elle n'a pas le même nom j'ai lui ai préféré un ApplyColors c'est réglé, il fallait juste que je l'utilise aussi dans les Setters des couleurs.

    À partir ces deux dernières remarques plus de problème au design.

    Reste désormais la partie runtime, qui me pose souci au démarrage, pas de couleurs

    Invalidate;
    J'oublie toujours cette instruction si pratique

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Ben justement, je veux que les couleurs soient stockées dans le dfm pour que, au runtime elles soient appliquées
    C'est sans rapport. Si cette donnée n'apparait pas dans le DFM tu auras par défaut ce qui est défini dans le constructeur (ou 0, nil, etc.).
    default permet de ne stocker que ce qui diffère d'une utilisation normale et ainsi réduire la taille du DFM (et de cause à effet celle de l'exe).

    default se base sur une constante mais on pourrait aussi se baser sur un critère avec stored et une fonction (obligatoire dans certains cas comme les réels).

    Mais il n'y a aucune obligation de procéder ainsi.

    Citation Envoyé par SergioMaster Voir le message
    Reste désormais la partie runtime, qui me pose souci au démarrage, pas de couleurs
    Les setters ne sont pas invoqués au chargement du DFM, ce qui est logique puisque le composant n'est pas encore entièrement configuré. Toute action immédiate au chargement d'une propriété se baserait sur des données potentiellement incomplètes/erronées.
    Tu dois redéfinir la méthode Loaded qui n'est invoquée qu'une fois le chargement terminé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TColoredBindNavigator.Loaded;
    begin
      inherited;
      Invalidate;
    end;

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut
    Ok, en fait, j'utilise stored true pour les trois couleurs.
    Default ou Stored est désormais la question quel serait le mieux ?

    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
    20
    21
    22
    23
    24
     TGlyphColors = class(TPersistent)
      private
        FOwner : TColoredBindNavigator;
        FColors: array [0 .. 3] of TAlphaColor;
     
        procedure SetColor(Index: Integer; Value: TAlphaColor);
        function GetCancelColor: TAlphaColor;
        function GetEditColor: TAlphaColor;
        function GetNavigationColor: TAlphaColor;
        procedure SetCancelColor(const Value: TAlphaColor);
        procedure SetEditColor(const Value: TAlphaColor);
        procedure SetNavigationColor(const Value: TAlphaColor);
        function IsColorsStored: Boolean;
        procedure SetDefaultColor(const Value: TAlphaColor);
        property defaultcolor : TAlphaColor read FColors[3] write SetDefaultColor;
      public
        constructor Create(aOwner : TColoredBindNavigator);
        destructor Destroy; override;
        function GetColor(Index: Integer): TAlphaColor;
       published
        property Navigation: TAlphaColor read FColors[0] write SetNavigationColor stored true;
        property Edit: TAlphaColor read FColors[1] write SetEditColor stored true;
        property Cancel: TAlphaColor read FColors[2] write SetCancelColor stored true;
      end;
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
      TColoredBindNavigator = class(TCustomBindNavigator)
      private
        FController: TBindNavigatorController;
        FNavigatorGlyphColors: TGlyphColors;
        function GetGlyphColor(const Index: Integer): TAlphaColor;
        procedure SetGlyphColor(const Index: Integer; const Value: TAlphaColor);
        procedure SetGlyphColors(const Value: TGlyphColors);
        procedure Loaded; override;
      public
        { Déclarations publiques }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure customcolors(scrollcolor, Updatecolor, cancelcolor : TAlphaColor);
        procedure ApplyColors;
      published
        property NavigatorGlyphColors: TGlyphColors read FNavigatorGlyphColors write SetGlyphColors stored true; // nécessaire ?
        property DataSource;
        property VisibleButtons;
        property Align;
        property Enabled;
        property CornerType;
        property Corners;
        property xRadius;
        property yRadius;
        property ConfirmDelete;
        property Visible;
        property BeforeAction;
        property OnClick;
      end;
    Le Loaded semble être ce qui manquait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TColoredBindNavigator.Loaded;
    begin
    //  inherited; // pointe sur rien 
    //  invalidate; // methode inconnue ????? 
      ApplyColors; 
    end;

    mais il fallait aussi une procedure Paint
    au design
    Nom : Capture.PNG
Affichages : 169
Taille : 29,7 Ko
    Avec ou sans style appliqué.

    test utilisant le style calypso
    Nom : Capture.PNG
Affichages : 163
Taille : 28,5 Ko

    me reste à trouver la couleur par défaut (couleur d'un TText) dans le test cela devrait donner un beau blanc
    et ajouter peut-être quelques trucs ( effacer les couleurs me semble un possible besoin)

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Default ou Stored est désormais la question quel serait le mieux ?
    Default clairement. Vouloir tout stocker limite l'évolution puisque tout est figé dans le DFM.

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut Produit final ou presque
    P.S. Govel [breton] -> forge
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    unit Govel.BindNavigator;
     
    interface
     
    uses
      System.SysUtils, System.Classes,
      System.UITypes,
      FMX.Types, FMX.Controls, FMX.Layouts, FMX.Objects, FMX.StdCtrls,
      Data.Bind.Controls, Data.Bind.Components,
      FMX.Bind.Navigator;
     
    /// range TNavigateButton in three groups
    const   NavigatorScrollings = [nbFirst, nbPrior, nbNext, nbLast,nbRefresh];
            NavigatorValidations = [nbInsert, nbDelete, nbEdit, nbPost, nbCancel,
                                    nbApplyUpdates];
            NavigatorCancelations = [nbDelete,nbCancel,nbCancelUpdates];
     
    type
     
      TColoredBindNavigator = class;
     
      TGlyphColors = class(TPersistent)
      private
        FOwner : TColoredBindNavigator;
        FColors: array [0 .. 2] of TAlphaColor;
     
        procedure SetColor(Index: Integer; Value: TAlphaColor);
        function GetCancelColor: TAlphaColor;
        function GetEditColor: TAlphaColor;
        function GetNavigationColor: TAlphaColor;
        procedure SetCancelColor(const Value: TAlphaColor);
        procedure SetEditColor(const Value: TAlphaColor);
        procedure SetNavigationColor(const Value: TAlphaColor);
        function IsColorsStored: Boolean;
        procedure SetDefaultColor(const Value: TAlphaColor);
      public
        constructor Create(aOwner : TColoredBindNavigator);
        destructor Destroy; override;
        function GetColor(Index: Integer): TAlphaColor;
       published
        property Navigation: TAlphaColor read FColors[0] write SetNavigationColor default TAlphaColors.Blue;
        property Edit: TAlphaColor read FColors[1] write SetEditColor default TAlphaColors.Green;
        property Cancel: TAlphaColor read FColors[2] write SetCancelColor default TAlphaColors.Red;
      end;
     
      TColorNavButton = class helper for TBindNavButton
        /// set the color of the Tpath.fill.color property
       procedure setcolor(const c : TAlphaColor);
        /// apply the custom colors corresponding to the TNavigateButton type
        /// Three groups NavigatorScrollings,NavigatorValidations,NavigatorCancelations
        /// see const part
       procedure ApplyColorStyle(const customcolors : TGlyphColors);
        ///
      end;
     
     
      TColoredBindNavigator = class(TCustomBindNavigator)
      private
        FController: TBindNavigatorController;
        FNavigatorGlyphColors: TGlyphColors;
        function GetGlyphColor(const Index: Integer): TAlphaColor;
        procedure SetGlyphColor(const Index: Integer; const Value: TAlphaColor);
        procedure SetGlyphColors(const Value: TGlyphColors);
        procedure Loaded; override;
        procedure Paint ; override;
      public
        { Déclarations publiques }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure customcolors(scrollcolor, Updatecolor, cancelcolor : TAlphaColor);
        procedure ApplyColors;
        function GetDefaultGlyphColor : TAlphaColor;
      published
        property NavigatorGlyphColors: TGlyphColors read FNavigatorGlyphColors write SetGlyphColors; // stored true;
        property DataSource;
        property VisibleButtons;
        property Align;
        property Enabled;
        property CornerType;
        property Corners;
        property xRadius;
        property yRadius;
        property ConfirmDelete;
        property Visible;
        property BeforeAction;
        property OnClick;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('Govel', [TColoredBindNavigator]);
    end;
     
    { TColoredBindNavigator }
     
    procedure TColoredBindNavigator.ApplyColors;
    begin
      for var aButton  in Buttons do
          aButton.ApplyColorStyle(NavigatorGlyphColors);
    end;
     
    constructor TColoredBindNavigator.Create(AOwner: TComponent);
    begin
        inherited;
        if not assigned(FNavigatorGlyphColors)
                    then FNavigatorGlyphColors:=TGlyphColors.Create(Self);
        ApplyColors;
    end;
     
    destructor TColoredBindNavigator.Destroy;
    begin
      FNavigatorGlyphColors.Free;
      inherited;
    end;
     
    function TColoredBindNavigator.GetDefaultGlyphColor: TAlphaColor;
    begin
    var d := TCornerButton.Create(Self);
    d.Parent:=Self;
    d.ApplyStyleLookup;
    var S := d.FindStyleResource('text');
    if (S <> nil) and (S is TText) then
          result:= TText(S).Color
     else result:=TAlphaColors.Null;
    FreeAndNil(d);
    end;
     
    function TColoredBindNavigator.GetGlyphColor(const Index: Integer): TAlphaColor;
    begin
      if index in [0 .. 2] then
        Result := FNavigatorGlyphColors.GetColor(index)
      else
        Result := GetDefaultGlyphColor; // défaut TAlphaColors.Null
    end;
     
     
    procedure TColoredBindNavigator.Loaded;
    begin
      inherited Loaded;
      ApplyColors;
    end;
     
    procedure TColoredBindNavigator.Paint;
    begin
      inherited Paint;
      ApplyColors;
    end;
     
    procedure TColoredBindNavigator.SetGlyphColor(const Index: Integer;
      const Value: TAlphaColor);
    begin
      NavigatorGlyphColors.SetColor(index,Value);
      ApplyColors;
    end;
     
    procedure TColoredBindNavigator.SetGlyphColors(const Value: TGlyphColors);
    begin
      FNavigatorGlyphColors.Assign(Value);
      ApplyColors;
    end;
     
    procedure TColoredBindNavigator.customcolors(scrollcolor, Updatecolor,
      cancelcolor: TAlphaColor);
    begin
      FNavigatorGlyphColors.Navigation:=ScrollColor;
      FNavigatorGlyphColors.Edit:=UpdateColor;
      FNavigatorGlyphColors.Cancel:=CancelColor;
      ApplyColors;
    end;
     
    { TGlyphColors }
     
    constructor TGlyphColors.Create(aOwner : TColoredBindNavigator);
    begin
      FOwner:=aOwner;
      FColors[0] := TAlphaColors.Blue;
      FColors[1] := TAlphaColors.Green;
      FColors[2] := TAlphaColors.Red;
    end;
     
    destructor TGlyphColors.Destroy;
    begin
      inherited;
    end;
     
    function TGlyphColors.GetCancelColor: TAlphaColor;
    begin
    result:=GetColor(2);
    end;
     
    function TGlyphColors.GetColor(Index: Integer): TAlphaColor;
    begin
     if index in [0..2] then
      Result := FColors[Index]
     else Result:=TAlphaColors.Null
    end;
     
    function TGlyphColors.GetEditColor: TAlphaColor;
    begin
    Result:=GetColor(1);
    end;
     
    function TGlyphColors.GetNavigationColor: TAlphaColor;
    begin
    Result:=GetColor(0);
    end;
     
    function TGlyphColors.IsColorsStored: Boolean;
    begin
    result:=True;
    end;
     
    procedure TGlyphColors.SetCancelColor(const Value: TAlphaColor);
    begin
    SetColor(2,Value);
    FOwner.ApplyColors;
    end;
     
    procedure TGlyphColors.SetColor(Index: Integer; Value: TAlphaColor);
    begin
      FColors[Index] := Value;
    end;
     
    procedure TGlyphColors.SetDefaultColor(const Value: TAlphaColor);
    var acolor : TAlphaColor;
    begin
      var S:=FOwner.FindStyleResource('text');
      if Assigned(s) then acolor:=TText(S).Color
                     else acolor:=TAlphaColors.Alpha;
    end;
     
    procedure TGlyphColors.SetEditColor(const Value: TAlphaColor);
    begin
    SetColor(1,Value);
    FOwner.ApplyColors;
    end;
     
    procedure TGlyphColors.SetNavigationColor(const Value: TAlphaColor);
    begin
    SetColor(0,Value);
    FOwner.ApplyColors;
    end;
     
     
     
    { TColorNavButton }
    procedure TColorNavButton.ApplyColorStyle(const customcolors : TGlyphColors);
    var defaultstylecolor : TAlphaColor;
    begin
    if (TNavigateButton(Self.index) in NavigatorScrollings)
        AND (customcolors.Navigation<>TAlphacolors.Null)
    //    AND (customcolors.scroll<>DefaultStyleColor)   // todo test
     then Setcolor(customcolors.Navigation);
    if (TNavigateButton(Self.index) in NavigatorValidations)
        AND (customcolors.Edit<>TAlphacolors.Null)
     then Setcolor(customcolors.Edit);
    if (TNavigateButton(Self.index) in NavigatorCancelations)
        AND (customcolors.cancel<>TAlphacolors.null)
     then Setcolor(customcolors.cancel);
    end;
     
    procedure TColorNavButton.setcolor(const c: TAlphaColor);
    begin
    with Self do
       FPath.Fill.Color:=c;
    end;
     
    end.
    Il manque encore quelques commentaires (toutes suggestions pour indiquer un manque nécessaire acceptées).

    Quelques petites choses encore qui me dérangent :
    1. Si j'ai un thème sombre (dans ce cas GetDefaultGlyphColor=White) j'eusse aimé "éclaicir" les couleurs par défaut toutefois pour l'instant, je doute de la possibilité ?
    2. Je n'ai pas prévu une propriété qui pourrait être utile : ne pas appliquer les couleurs qui éviterait de perdre les couleurs définies.


    et bien évidemment toute suggestion/correction supplémentaire sera pesée et adoptée

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 912
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 912
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Si j'ai un thème sombre (dans ce cas GetDefaultGlyphColor=White) j'eusse aimé "éclaicir" les couleurs par défaut toutefois pour l'instant, je doute de la possibilité ?
    C'est surtout au niveau de la détection. Ca se fait facilement en Vcl par la base des registres et WM_SETTINGCHANGE, et en Fmx ?


    Sinon je trouve que c'est un peu compliqué, qu'il y a beaucoup de méthodes non utilisées, que c'est souvent redondant (ApplyColors) et parfois non fonctionnel parce que incomplet (FNavigatorGlyphColors.Assign(Value)).

    J'ai pas trop le temps de disserter aujourd'hui.

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ca se fait facilement en Vcl par la base des registres et WM_SETTINGCHANGE, et en Fmx ?
    ça existe aussi mais au runtime

    Citation Envoyé par Andnotor Voir le message
    Sinon je trouve que c'est un peu compliqué, qu'il y a beaucoup de méthodes non utilisées, que c'est souvent redondant (ApplyColors) et parfois non fonctionnel parce que incomplet (FNavigatorGlyphColors.Assign(Value)).
    Oui, il y encore des déchets, c'est la phase de finalisation et c'est long car il m'a fallu beaucoup de test.
    C'est compliqué car le BindNavigator n'est pas vraiment simple non plus

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Par défaut
    salut trés largement inspiré de ton composant j'ai osé celui-ci mais je butte avec ApplyColors ,j'aimerais remplacer "background.fill.Color" par "font.fill.Color" pour laisser un choix à l'utilisateur en ajoutant une propriété ,background ou font mais ça marche pas pour font !!!
    ceci dit merci pour tes recherches qui mon fait avancer

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    /// <summary>Unit pour composant Navigator color
    ///trés largement inspiré de SergioMaster
    ///https://www.developpez.net/forums/d2171959/environnements-developpement/delphi/langage/creer-composant-fmx-propriete-contient-ensemble-proprietes/
    /// </summary>
    unit uCustomBindNavigator;
    interface
      uses
      System.SysUtils, System.Classes, FMX.Bind.Navigator, FMX.Objects, FMX.Types, FMX.Controls, FMX.StdCtrls,
      System.UITypes, System.Rtti, FMX.Forms;
     
    type
      TCustomBindNavigatorColor = class(TBindNavigator)
      private
        FNavigationColor: TAlphaColor;
        FEditColor: TAlphaColor;
        FCancelColor: TAlphaColor;
     
        procedure SetNavigationColor(const Value: TAlphaColor);
        procedure SetEditColor(const Value: TAlphaColor);
        procedure SetCancelColor(const Value: TAlphaColor);
        procedure Paint; override;
      public
        constructor Create(AOwner: TComponent); override;   procedure ApplyColors;
      published
        property NavigationColor: TAlphaColor read FNavigationColor write SetNavigationColor;
        property EditColor: TAlphaColor read FEditColor write SetEditColor;
        property CancelColor: TAlphaColor read FCancelColor write SetCancelColor;
      end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin
      RegisterComponents('de Tout', [TCustomBindNavigatorColor]);
    end;
     
    { TCustomBindNavigatorColor }
     
    constructor TCustomBindNavigatorColor.Create(AOwner: TComponent);
    begin
      inherited
     
      Create(AOwner);
      FNavigationColor := TAlphaColorRec.Lightblue;
      FEditColor := TAlphaColorRec.Lightgreen;
      FCancelColor := TAlphaColorRec.Lightcoral;
      ApplyColors;
     
     
      //penser a activer ShowHint du composant à True
        TButton(Controls[0]).Hint := 'Premier enregistrement';
        TButton(Controls[1]).Hint := 'Enregistrement précédent';
        TButton(Controls[2]).Hint := 'Enregistrement suivant';
        TButton(Controls[3]).Hint := 'Dernier enregistrement';
        //...  à compléter
     
    end;
     
    procedure TCustomBindNavigatorColor.Paint;
    begin
      inherited Paint;
      ApplyColors;
    end;
     
    procedure TCustomBindNavigatorColor.SetNavigationColor(const Value: TAlphaColor);
    begin
      if FNavigationColor <> Value then
      begin
        FNavigationColor := Value;
        ApplyColors;
      end;
    end;
     
    procedure TCustomBindNavigatorColor.SetEditColor(const Value: TAlphaColor);
    begin
      if FEditColor <> Value then
      begin
        FEditColor := Value;
        ApplyColors;
      end;
    end;
     
    procedure TCustomBindNavigatorColor.SetCancelColor(const Value: TAlphaColor);
    begin
      if FCancelColor <> Value then
      begin
        FCancelColor := Value;
        ApplyColors;
      end;
    end;
     
    procedure TCustomBindNavigatorColor.ApplyColors;
    begin
     // if ControlCount < 12 then Exit; // S'assurer que tous les boutons sont présents
     
      // Boutons de navigation
      TButton(Controls[0]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // First
      TButton(Controls[1]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // Prior
      TButton(Controls[2]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // Next
      TButton(Controls[3]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // Last
     
      // Boutons d'édition
      TButton(Controls[4]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FEditColor); // Insert
      TButton(Controls[5]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FCancelColor); // Delete
      TButton(Controls[6]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FEditColor); // Edite
     
      // Bouton d'annulation
      TButton(Controls[7]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FEditColor); // Post
      TButton(Controls[8]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FCancelColor); // Cancel ApplUpDate
      TButton(Controls[9]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // Refesh CancelUpDate
     
      TButton(Controls[10]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FEditColor); // ApplUpDate
      TButton(Controls[11]).StylesData['background.fill.Color'] := TValue.From<TAlphaColor>(FCancelColor); // CancelUpDate
     
    {
      // Boutons de navigation    marche pas  comment remplacer  background.fill.Color ????
      TButton(Controls[0]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // First
      TButton(Controls[1]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // Prior
      TButton(Controls[2]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // Next
      TButton(Controls[3]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // Last
     
      // Boutons d'édition
      TButton(Controls[4]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FEditColor); // Insert
      TButton(Controls[5]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FCancelColor); // Delete
      TButton(Controls[6]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FEditColor); // Edite
     
      // Bouton d'annulation
      TButton(Controls[7]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FEditColor); // Post
      TButton(Controls[8]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FCancelColor); // Cancel ApplUpDate
      TButton(Controls[9]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FNavigationColor); // Refesh CancelUpDate
     
      TButton(Controls[10]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FEditColor); // ApplUpDate
      TButton(Controls[11]).StylesData['font.fill.Color'] := TValue.From<TAlphaColor>(FCancelColor); // CancelUpDate       }
     
    end;
     
    end.

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par papyvore Voir le message
    j'aimerais remplacer "background.fill.Color"
    je n'avais pas pensé à celle là, pour moi le style fait le job

    Citation Envoyé par papyvore Voir le message
    mais je butte avec ApplyColors
    Je vois que tu dérives TBindNavigator alors que moi j'ai dérivé TCustomBindNavigator pour accéder (entre autres, à Buttons qui est protected.

    De plus, j'utilise un Helper (TColorNavButton = class helper for TBindNavButton) pour accéder aux propriétés d'un bouton je ne suis pas sûr que tu ne sois pas obligé de faire de même.

    pour obtenir la couleur de la fonte j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function TColoredBindNavigator.GetDefaultGlyphColor: TAlphaColor;
    begin
    var d := TCornerButton.Create(Self);  // un TNavigateButton est en fait un  TCornerButton spécifique 
    d.Parent:=Self;
    d.ApplyStyleLookup;
    var S := d.FindStyleResource('text');
    if (S <> nil) and (S is TText) then
          result:= TText(S).Color
     else result:=TAlphaColors.Null;
    FreeAndNil(d);
    end;
    En théorie (au runtime) le changement de fond peut fonctionner ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm5.Button2Click(Sender: TObject);
    begin
    for var i:=0 to ColoredBindNavigator1.ControlsCount-1 do
       begin
        var s:=TBindNavButton(ColoredBindNavigator1.Controls[i]).FindStyleResource('background');
        if Assigned(s) AND (s is TRectangle)
           then TRectangle(s).Fill.Color:=TAlphaColors.Gold;
       end;
    end;
    Nom : Capture.PNG
Affichages : 144
Taille : 10,1 Ko
    avec le style Calypso c'est même assez intéressant


    Pour le hint, j'ai un doute car quand on regarde le source FMX.Bind.Navigator la partie Hint est commentée

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Par défaut
    merci je regarde tout ça.
    pour le hint j'ai testé avec ton composant ça fonctionne

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par papyvore Voir le message
    pour le hint j'ai testé avec ton composant ça fonctionne
    Alors, je vais tenter de l'intégrer

    Pour l'instant je cherche à rendre plus claire les couleurs des glyphes si la couleur par défaut est une nuance de Blanc (donc un fond de bouton sombre)
    à priori une fonction comme celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Light(const Col : TAlphaColor; const percent : byte) : TAlphaColor;
    var  H,S,L : Single;
    begin
        RGBToHSL(col,H,S,L);
        H:=H*percent/100;
        Result := HSLtoRGB(H,S,L);
    end;
    me donne pour TalphaColors.Blue et un percent 75 ce que je recherche (un beau bleau des mers du sud)

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Par défaut
    si ça peut t'éclairer je l'ai testé comme ça
    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
     
     
    constructor TGlyphColors.Create(aOwner: TColoredBindNavigator);
    begin
      FOwner     := aOwner;
      FColors[0] := TAlphaColors.Blue;
      FColors[1] := TAlphaColors.Green;
      FColors[2] := TAlphaColors.Red;
     
    //penser a activer ShowHint du composant à True
      TBindNavButton(aOwner.Controls[0]).Hint := 'Premier enregistrement';
      TBindNavButton(aOwner.Controls[1]).Hint := 'Enregistrement précédent';
      TBindNavButton(aOwner.Controls[2]).Hint := 'Enregistrement suivant';
      TBindNavButton(aOwner.Controls[3]).Hint := 'Dernier enregistrement';
      // ... à compléter
     
    end;

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 567
    Billets dans le blog
    65
    Par défaut
    J'ai basculé la conversation vers Composants FMX car je commence à déborder considérablement du titre initial "Créer un composant (FMX) avec une propriété qui contient un ensemble de propriétés" du forum Langage


    @Papyvore OK, mais dans le cadre d'un composant, ce n'est pas, de mon point de vue, très "propre".
    En faire un ensemble de propriétés et cette fois-ci c'est bien stored true que j'y mettrai (si par exemple, on veut par la suite internationaliser facilement i.e avec DKLang, les chaines étant dans le dfm, elles seront extraites plus facilement)

    J'ai pour l'instant quelque chose comme ça
    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
      TBtnsHints = class (TPersistent)
      private
        FOwner : TColoredBindNavigator;
        FHints : Array [0..12] of String;
        procedure SetHintFirst(const Value: String);
        procedure SetHintLast(const Value: String);
        procedure SetHintNext(const Value: String);
        procedure SetHintPrior(const Value: String);
      public
        constructor Create(aOwner : TColoredBindNavigator);
        destructor Destroy; override;
      published
        property hintFirst : String read FHints[0] write SetHintFirst stored true;
        property hintPrior : String read FHints[1] write SetHintPrior stored true;
        property hintNext : String read FHints[2] write SetHintNext stored true;
        property hintLast : String read FHints[3] write SetHintLast stored true;
     
      end;
    ce qui m'ennui c'est au design, les Hints son en ordre par nom
    Nom : Capture.PNG
Affichages : 101
Taille : 5,8 Ko
    Y a t-il un moyen d'avoir un ordre défini (First,Next,Prior,Last)


    Un autre truc, c'est que le hint est fait via le survol de la souris donc, quid des mobiles ? Peut-on indiquer qu'une propriété n'est que pour certains OS, ce pourrait être interessant de le savoir ? Bien sûr, il y a les $IFDEF mais dans un composant !?

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/10/2008, 00h02
  2. Créer une feuille qui contient une seule page seulement
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/05/2007, 17h38
  3. Comment creer une BD qui contient d'image
    Par mamou30 dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/03/2007, 16h36
  4. [VBA-E]Créer une feuille qui contient du code
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 04/04/2006, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo