Schritt 5 - Benutzerdefinierte Eigenschaften (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Erstellen einer FireMonkey-Komponente (Delphi)


Die Komponente benötigt eine weitere Eigenschaft, damit das Verb der Dialogfeldaktion, wie z.B. "Speichern" auf der "Ausführen"-Schaltfläche angezeigt wird. Dieses Verb ist auch mit "Nicht ausführen" auf der "Nicht ausführen"-Schaltfläche verbunden. (Eine komplexere Internationalisierung würde den Rahmen dieses Themas überschreiten.)

Es wäre einfacher, wenn die Aufnahme des Verbs über die Eigenschaft Text der Schaltfläche durchgeführt werden könnte. Aber die Schaltflächen sind erst vorhanden, wenn der Stil übernommen wird, und bei erneuter Übernahme des Stils werden die vorhandenen Schaltflächen verworfen. Daher muss die Komponente diesen String bereitstellen. Deklarieren und implementieren Sie die Eigenschaft 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;

Der StyleName für jede der drei Schaltflächen wird zusammen mit dem modalen, "negativen OK"-Ergebniscodes für die "Nicht ausführen"-Schaltfläche als Konstante deklariert. Das Feld FDoVerb wird dem Objekt zur Aufnahme des Verb-Strings hinzugefügt.

Zur Laufzeit erfolgt der Zugriff folgendermaßen:

  1. Wenn die Anwendung ausgeführt wird, werden alle Formulare erstellt, einschließlich des Dialogfeldformulars mit dem Schaltflächenbereich (TPanel). Die TPanel-Komponente wird durch die object-Zeile beim Laden der .fmx-Datei instantiiert. Der Konstruktor schreibt mit SetDoVerb das Standardverb in die Eigenschaft. Das Feld wird gesetzt, und es werden keine Schaltflächen gefunden.
  2. Bei der Zuweisung der Eigenschaftswerte aus der Datei .fmx wird SetDoVerb erneut mit dem vom Designer gespeicherten String (z.B. "Speichern") aufgerufen und das Feld geändert.
  3. Beim Öffnen des Dialogfelds wird es gezeichnet, und einer der vorbereitenden Schritte beim Zeichnen eines Steuerelements ist die Übernahme des Stils (falls erforderlich), wozu auch das erste Zeichnen des Steuerelements gehört. Zum Schluss wird die Prozedur ApplyStyle aufgerufen, die hier überschrieben wird, um den Verb-String aus dem Feld erneut zu übernehmen. Die Prozedur weist das Feld redundant erneut zu, aber jetzt sind die Schaltflächen vorhanden, und zudem wird das Verb in der "Ausführen"-Schaltfläche und das Verb in der "Nicht ausführen"-Schaltfläche gesetzt.
  4. Das Rendern der Schaltflächen erfolgt nicht in der Funktion GetDoVerb, weil die Schaltflächen, die den Stil umfassen, direkt gerendert werden, und sie bereits über die Setter-Methode den passenden Text erhalten haben. Die Getter-Methode wird hauptsächlich vom Formular-Designer und von Laufzeitcode verwendet, der die Eigenschaften der TPanel-Komponente ermittelt. Die Methode versucht, das Feld aus der "Ausführen"-Schaltfläche (falls vorhanden) zu aktualisieren; aber wenn die Schaltfläche nicht direkt manipuliert wird (durch Umgehung der Kapselung), sollten ihr Text und das Feld bereits synchronisiert sein.


Zurück

Siehe auch