Wie arbeitet man mit Mengen (Sets, TSet)

Mengen sind eine praktische Sache. Sie kommen zwar innerhalb der VCL nicht so oft vor, aber manchmal doch an entscheidender Stelle. Als Beispiel für eine Menge dient hier die Eigenschaft Styles der Schriftart, die beispielsweise in einem TMemo oder TRichEdit Objekt gesetzt werden kann und die für die Darstellung des Schriftstiles zuständig ist (bold, kursiv,..)

Das Einstellen im Objektinspektor ist einfach. Programmgesteuert gibt es ein paar kleine Hürden.

Grundsätzlich gib es 3 Methoden des Zugriffes:

  1. Nicht temporäre Menge
  2. temporäre Menge
  3. Explizite Zuweisung

1. Nicht temporäre Menge

Die in den Fontstyles verwendete Menge heisst TFontStyles. Von dieser legen wir uns eine eigene Menge an

TFontStyles mystyle;

Nun weisen wir dieser Menge die von uns gewünschten Element zu. Das geschieht mit dem << Operator. Im folgenden wollen wir erreichen, dass die Schrift bold und italic ist:

mystyle<<fsBold<<fsItalic;

Die Menge enthält nun die von uns gewünschten Stile. Nun mussen wir diese Stile unserer TMemo oder TRichEdit Komponente zuweisen. Hier für eine TMemo1 Komponente:

TMemo1->Font->Style=mystyles;

Nun wird der Text in der gewünschten Form ausgegeben. Nun wollen wir das der Stil italic nicht mehr unseren Text ziert. Das entfernen eine Elementes aus der Menge geschiet mit dem >> Operator

mystyle>>fsItalic;
TMemo1->Font->Style=mystyles;

entfernt den italic Stil und weist der Komponete die neuen Angaben zu. Manchmal kann es nützlich sein, die Menge komplett zu löschen:

mystyle.Clear();

oder zu wissen ob ein bestimmtes Element gesetzt ist:

bool test=mystyles.Contains(fsItalic);
if(test)
//ist enthalten

2. Temporäre Menge

Für eine schnelle Änderung kann das Mengenfeld der Komponente mit einer temporären Menge geändert werden:

TMemo1->Font->Style=TFontStyles()<<fsBold;

Dies ist jedoch nur für das setzen von Elementen sinnvoll.

3. Explizite Zuweisung

Noch kürzer ist folgende Methode:

TMemo1->Font->Style=TMemo1->Font->Style<<fsBold;

oder

TMemo1->Font->Style=TMemo1->Font->Style>>fsBold;

Was nicht geht

Aus den obigen Ausführungen geht hervor, dass leider die naheliegende Lösung

TMemo1->Font->Style<<fsBold

nicht funktioniert. Diese Code wird zwar compiliert und führt zu keinem Fehler, bewrikt aber leider auch nichts.

Zur Übersicht