Umgang mit 'Set' (zB. TStringGrid::Options)



  • s.u.

    [ Dieser Beitrag wurde am 20.07.2002 um 22:46 Uhr von Jansen editiert. ]



  • Set ist ein aus ObjectPascal (Delphi) übernommener Datentyp und dient üblicherweise zum Speichern eines Satzes (Set) bestimmter Optionen (Flags) in einer Art Array. Über das Hinzufügen oder Entfernen bestimmter Flags lassen sich darauf aufbauende Klassen und Komponenten auf einfache Weise steuern bzw. konfigurieren.

    Prinzipiell lassen sich die Flags auf zwei verschiedene Arten setzen.

    Zum einen kann man man ein abstraktes, "leeres" Objekt des jeweiligen Set-Typs benutzen, wie es zB. bei StringReplace mit TReplaceFlags() geschieht. Das ist immer dann angebracht, wenn es sich
    a) "nur" um eine Klasse bzw. Funktion handelt (wie StringReplace, im Gegensatz zu Komponenten wie zB. TStringGrid) oder
    b) das Set einer Komponente noch nicht konfiguriert ist oder komplett neu gesetzt werden soll.

    Beispiele:

    String str = "X für ein U vormachen lassen";
    str = StringReplace(str, "X", "U", TReplaceFlags() << rfReplaceAll << rfIgnoreCase);
    
    StringGrid1->Options = TGridOptions() << goEditing << goThumbTracking;
    

    Durch das '<<' werden die jeweiligen Flags gesetzt, die Optionen also aktiviert; nicht aufgeführte Flags werden nicht gesetzt, die entsprechenden Optionen bleiben demnach deaktiviert.

    Der zweite Weg trifft nur dann zu, wenn das Set die Property einer Komponente ist. Im Gegensatz zu dem abstrakten Set ist hier nämlich eine Grundkonfiguration der Flags vorhanden, die man üblicherweise zur Entwurfszeit im ObjectInspector beeinflussen kann. Zur Laufzeit wird beim Setzen der Flags das Set der Komponente selbst als Ausgangspunkt benutzt, man bearbeitet also die bestehende Konfiguration.

    Hier kommt jetzt auch das '>>' zum Einsatz, mit dem man bereits gesetzte Flags wieder aus dem Set entfernt.

    Beispiel:
    Aus den StringGrid-Options des obigen Beispieles möchte ich GoEditing wieder entfernen, goThumbTracking und den ganzen Rest der Flags aber beibehalten.

    StringGrid1->Options = StringGrid1->Options >> goEditing;
    

    TGridOptions() lässt sich hier nicht verwenden (da leer), sonst wären im Anschluss alle Flags aus den StringGrid-Options gelöscht.

    Natürlich kann man das Setzen und Löschen von Flags auch kombinieren, hier am Beispiel des TMediaPlayer (bei Wiedergabe Play-Button deaktivieren, Pause und Stop aktivieren).

    MediaPlayer1->EnabledButtons = MediaPlayer1->EnabledButtons >> btPlay << btPause << btStop;
    

    Manchmal möchte man auch einfach wissen, ob ein bestimmtes Flag in einem Set gesetzt ist. Ein häufiger Anwendungsfall ist das OnKeyDown-Event verschiedener Controls, bei dem man per TShiftState mitgeteilt bekommt, welche zusätzliche(n) Taste(n) gedrückt wurde (Shift, Alt oder Strg). Dafür gibt es die Methode Contains(), hier am Beispiel einer "Alles markieren"-Implementierung für ein Memo mit der Standard-Tastenkombination Strg+A

    void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
      if (Key == 65 && Shift.Contains(ssCtrl))
        Memo1->SelectAll();
    }
    

    [ Dieser Beitrag wurde am 02.12.2002 um 21:34 Uhr von Jansen editiert. ]


Anmelden zum Antworten