Etape 5 - Propriétés personnalisées (Object Pascal)

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Création d'un composant FireMonkey (Object Pascal)


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 :

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Controls, System.UITypes;

type
  TDialogButtonPanel = class(TPanel)
  private
    FDoVerb: string;
    function GetDoVerb: string;
    procedure SetDoVerb(AString: string);
  protected
    function GetStyleObject: TControl; override;
    procedure ApplyStyle; override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property DoVerb: string read GetDoVerb write SetDoVerb;
    property Align default TAlignLayout.Bottom;
  end;

const
  DoButtonName = 'DoButton';
  DontButtonName = 'DontButton';
  CancelButtonName = 'CancelButton';
  mrDont = -mrOK;
constructor TDialogButtonPanel.Create(AOwner: TComponent);
begin
  inherited;
  Height := 46;
  Width := 300;
  Align := TAlignLayout.Bottom;
  DoVerb := 'Verb';
end;

function TDialogButtonPanel.GetDoVerb: string;
var
  Base: TFmxObject;
begin
  Base := FindStyleResource(DoButtonName);
  if Base is TTextControl then
    FDoVerb := TTextControl(Base).Text;
  Result := FDoVerb;
end;

procedure TDialogButtonPanel.SetDoVerb(AString: string);
var
  Base: TFmxObject;
resourcestring
  Dont = 'Don'#39't %s';
begin
  FDoVerb := AString;
  Base := FindStyleResource(DoButtonName);
  if Base is TTextControl then
    TTextControl(Base).Text := AString;
  Base := FindStyleResource(DontButtonName);
  if Base is TTextControl then
    TTextControl(Base).Text := Format(Dont, [AString]);
end;

procedure TDialogButtonPanel.ApplyStyle;
begin
  inherited;
  SetDoVerb(FDoVerb);
end;

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 :

  1. 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é.
  2. 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.
  3. 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.
  4. 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.


Précédent

Voir aussi