Einführung in das Programmieren mit DELPHI  

19. Mengen-Typen

Mit dem Datentyp Set können Mengen mit bis zu 256 Elementen definiert werden. Die Elemente können von einem ordinalen Basistyp wie char sein, oder Teilbereiche von char, von integer oder von einem Aufzählungstyp. Als Konstante werden Mengen mit eckigen Klammern, z.B. ['a','e','i','o','u'], geschrieben.

Mengentypen sind eine Besonderheit von Pascal. Sie erlauben es viele Vergleiche und Abfragen prägnanter zu formulieren und minimieren damit Fehler.

Mögliche Verknüpfungen von Mengen sind:

a + b ergibt die Vereinigungsmenge a ∪ b.
a * b ergibt die Schnittmenge a ∩ b.
a - b ergibt die Differenzmenge a \ b.

  a ∪ b = { x | x∈a oder x∈b }

  a ∩ b = { x | x∈a  und  x∈b }

  a \ b = { x | x∈a  und  x ∉ b }

Folgende Bedingungen können abgefragt werden:

e IN aergibt true, wenn e ∈ a, andernfalls false.
a = bergibt true, wenn a und b identsich sind.
a <> bergibt true, wenn a und b verschieden sind.
a <= bergibt true, wenn a ⊂ b, andernfalls false.
a >= bergibt true, wenn a ⊃ b, andernfalls false.

Beispiel für die Mengenoperationen   a + b ,  a * b  und  a - b :

unit Unit1;

interface

 . . .

type
  TMenge = set of char;

var
  Form1: TForm1;
  a, b : TMenge;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  a := ['a','b','c','d','e','f','g','h','i'];
  b := ['a','e','i','o','u'];
end;

procedure TForm1.ausgeben(s:string; a:TMenge);
var i: Char;
begin
    Memo1.Lines.Add('');
    Memo1.Text := Memo1.Text + s + '= { ';
    for i := ' ' to 'z' do
        if i in a then
           Memo1.Text := Memo1.Text + i + ' ';
    Memo1.Text := Memo1.Text + '}';
    Memo1.Lines.Add('');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ausgeben(' a ',a);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ausgeben(' b ',b);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ausgeben('a+b',a+b);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  ausgeben('a*b',a*b);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  ausgeben('a-b',a-b);
end;

Eine nicht ganz ernst zu nehmende Anwendung der Abfrage mit dem Operator IN ist das Lied von den drei Chinesen

procedure TForm1.Button1Click(Sender: TObject);
var s: string;
    i: integer;
begin
    s := Memo1.Lines[0];
    for i:=1 to Length(s) do
      if s[i] in ['a','e','i','o','u','ä','ö','ü'] then 
         s[i] := Edit1.Text[1];
    Memo1.Lines.Add(s);
end;

Delphi selbst verwendet Mengen beispielsweise bei der Eigenschaft Font.Style:

Font.Style := [];                         // keine Textauszeichnung 
Font.Style := [fsBold];                   // Text in fett 
Font.Style := [fsBold, fsItalic];         // Text in fett und kursiv

Font.Style := Font.Style + [fsUnderline]  // zusätzlich unterstrichen
Font.Style := Font.Style - [fsItalic]     // kursiv wieder entfernt

Auch die Eigenschaft BorderIcons =[biSystemMenu,biMinimize,biMaximize,biHelp] ist eine Menge. Sie bestimmt welche Buttons in der Titelleiste des Formulars angezeigt werden. Setzt man BorderIcons := [ ] , so lässt sich das Programmfenster nur noch mit Alt-F4 schließen.

© 2009 : Bernd Schultheiss