Etape 5 - Propriétés personnalisées (C++)
Remonter à Création d'un composant FireMonkey (C++)
Le composant nécessite une propriété supplémentaire pour le verbe d'action du dialogue, comme "Enregistrer", apparaissant sur le bouton Do. Ce verbe est aussi combiné à "Don't" sur le bouton Don't. L'internationalisation plus complexe n'est pas incluse dans la portée de cette rubrique.
Ce serait plus simple si vous pouviez compter sur la présence du bouton et déléguer sa propriété Text pour contenir le verbe. Mais les boutons ne sont pas là tant que le style n'est pas appliqué, et si le style est ré-appliqué, les boutons existants sont abandonnés. Le composant a donc besoin de contenir cette chaîne lui-même. Déclarez et implémentez une propriété DoVerb :
class PACKAGE TDialogButtonPanel : public TPanel
{
private:
String FDoVerb;
TAlignLayout FAlign;
void __fastcall SetDoVerb(String AString);
String __fastcall GetDoVerb();
protected:
TControl* __fastcall TDialogButtonPanel::GetStyleObject();
void __fastcall ApplyStyle();
public:
__fastcall TDialogButtonPanel(TComponent* Owner);
__published:
__property Align = { default = TAlignLayout::Bottom };
__property String DoVerb ={ read=GetDoVerb, write=SetDoVerb };
};
//---------------------------------------------------------------------------
const String DoButtonName = "DoButton";
const String DontButtonName = "DontButton";
const String CancelButtonName = "CancelButton";
// ---------------------------------------------------------------------------
__fastcall TDialogButtonPanel::TDialogButtonPanel(TComponent* Owner)
: TPanel(Owner) {
Height = 46;
Width = 300;
Align = TAlignLayout::Bottom;
DoVerb = "Verb";
}
// ---------------------------------------------------------------------------
void __fastcall TDialogButtonPanel::ApplyStyle() {
TStyledControl::ApplyStyle();
SetDoVerb(FDoVerb);
}
// ---------------------------------------------------------------------------
String __fastcall TDialogButtonPanel::GetDoVerb(){
TFmxObject* Base;
TTextControl* TextBase;
Base = FindStyleResource(DoButtonName);
if ((TextBase = dynamic_cast<TTextControl*>(Base)) != NULL) {
FDoVerb = TextBase->Text;
}
return FDoVerb;
}
// ---------------------------------------------------------------------------
void __fastcall TDialogButtonPanel::SetDoVerb(String AString) {
TFmxObject* Base;
TTextControl* TextBase;
Base = FindStyleResource(DoButtonName);
FDoVerb = AString;
if ((TextBase = dynamic_cast<TTextControl*>(Base)) != NULL) {
TextBase->Text = AString;
}
Base = FindStyleResource(DontButtonName);
if ((TextBase = dynamic_cast<TTextControl*>(Base)) != NULL) {
TextBase->Text = "Don't " + AString;
}
}
Le StyleName pour chacun des trois boutons est déclaré en tant que constante, avec le code de résultat modal "negative OK" pour le bouton Don't. Le champ FDoVerb est ajouté à l'objet pour contenir la chaîne du verbe.
A l'exécution, la séquence d'accès se déroule comme suit :
- Quand l'application est exécutée, toutes ses fiches sont créées, notamment la fiche de boîte de dialogue contenant le panneau des boutons. Le panneau est instancié par sa ligne
object
lors du chargement depuis le.fmx
. Le constructeur écrit le verbe par défaut dans la propriété, en appelant SetDoVerb. Le champ est défini, et aucun bouton n'est trouvé. - En assignant les valeurs des propriétés depuis le
.fmx
, SetDoVerb est de nouveau appelée avec la chaîne enregistrée par le concepteur (par exemple, "Enregistrer"), en changeant le champ. - Quand la boîte de dialogue est ouverte, elle est dessinée, et l'une des étapes préliminaires du dessin d'un contrôle consiste à appliquer son style si nécessaire, qui inclut la première fois que le contrôle est dessiné. Cela termine l'appel de ApplyStyle, qui est redéfini ici pour réappliquer la chaîne de verbe depuis le champ. Il ré-assigne de façon redondante le champ, mais maintenant que les boutons sont présents, il définit aussi le verbe du bouton Do, et combine "Don't" et le verbe du bouton Don't.
- Le rendu des boutons ne s'effectue pas à travers GetDoVerb, car les boutons qui constituent le style sont rendus directement, et ils ont déjà le texte approprié, assigné par la méthode d'accesseur en écriture. La méthode d'accesseur en lecture est utilisée principalement par le Concepteur de fiches et par tout code d'exécution qui obtient les propriétés du panneau. Pour terminer, la méthode essaiera de mettre à jour le champ depuis le bouton Do s'il existe ; mais à moins que le bouton ne soit manipulé directement (en contournant l'encapsulation), son texte et le champ devraient déjà être synchronisés.