Schritt 5 - Benutzerdefinierte Eigenschaften (C++)
Nach oben zu Erstellen einer FireMonkey-Komponente (C++)
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:
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;
}
}
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:
- 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 mitSetDoVerb
das Standardverb in die Eigenschaft. Das Feld wird gesetzt, und es werden keine Schaltflächen gefunden. - Bei der Zuweisung der Eigenschaftswerte aus der Datei
.fmx
wirdSetDoVerb
erneut mit dem vom Designer gespeicherten String (z.B. "Speichern") aufgerufen und das Feld geändert. - 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. - 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.