Delphiの集合型のまとめ

Delphiの集合型について調べました。

集合型とは

集合型は同一の順序型の値の集まりです。
同じ値を複数登録できません。

集合型の宣言

set of baseType

type
  TSomeInts = 1 .. 250;

var
  Set1: set of TSomeInts;

begin
  Set1 := [1, 2, 3];

var
  MySet1: set of 'a'..'z';
  MySet2: set of Byte;
  MySet3: set of (Club, Diamond, Heart, Spade);

集合型の値の範囲

順序型の値は0~255 の範囲でなければなりません。
範囲を超える集合型を宣言するとコンパイルエラー「E2028: 集合型は 256 個以下の要素しか持てません」が発生します。

BigSet = set of 1..256;  (*<-- ここでエラーメッセージ*)

値が含まれているか

in演算子は、ある値が集合に含まれているかどうかをテストします。

var
  MySet1: set of 0 .. 255;

begin
  MySet1 := [1, 2, 3];
  if 1 in MySet1 then
    Writeln('1は含まれています')
  else
    Writeln('1は含まれていません。');

System.SysUtils.CharInSet関数は、指定された文字が集合に含まれているかどうかをチェックします。

var
  MySet1: set of 'a' .. 'z';

begin
  MySet1 := ['a', 'b'];
  if System.SysUtils.CharInSet('a', MySet1) then
    Writeln('aは含まれています')
  else
    Writeln('aは含まれていません。');

集合の値を取得する

for in do文で集合の要素を取得できます。

var
  MySet1: set of 'a' .. 'z';
  C: Char;

begin
  MySet1 := ['a', 'b', 'c'];

  for C in MySet1 do
  begin
    Write(C);
  end;
  // 「abc」が出力される

集合に値を追加する

+演算子で、集合に値を追加できます。

var
  MySet1: set of 'a' .. 'z';

begin
  MySet1 := ['a', 'b'];
  MySet1 := MySet1 + ['c', 'd'];
  //MySet1は['a', 'b', 'c', 'd']

System.Include関数で、集合に値を追加できます。
+演算子よりも効率の良いコードになります。

var
  MySet1: set of 0 .. 255;

begin
  MySet1 := [1, 2];
  System.Include(MySet1, 3);
  //MySet1は[1, 2, 3}

集合から値を削除する

-演算子で、集合から値を削除できます。

var
  MySet1: set of 'a' .. 'z';

begin
  MySet1 := ['a', 'b', 'c', 'd'];
  MySet1 := MySet1 - ['c', 'd'];
  // MySet1は['a', 'b']

System.Exclude関数で、集合から値を削除できます。
-演算子よりも効率の良いコードになります。

var
  MySet1: set of 0 .. 255;

begin
  MySet1 := [1, 2, 3, 4];
  System.Exclude(MySet1, 3);
  // MySet1は[1, 2, 4}

実行時に集合型の情報を取得する

TRttiSetTypeを使用すると、実行時に集合型の情報を取得できます。

下記のコードで使用している「TEnumHelper」は、「Owl’s perspective: 列挙型と列挙子名(文字列)の相互変換(ジェネリックス版)」で紹介されているコードを使用しています。

type
  TByteSet = set of Byte;

var
  LContext: TRttiContext;
  LType: TRttiSetType;

begin
  LContext := TRttiContext.Create;
  LType := LContext.GetType(TypeInfo(TByteSet)) as TRttiSetType;
  Writeln('集合の名前  ', LType.ElementType.Name);
  //集合の名前  Byte
  Writeln('集合の型   ', TEnumHelper.GetEnumName(LType.ElementType.TypeKind));
  //集合の型   tkInteger

コンポーネントのプロパティの集合値を取得する

System.TypInfo.SetToString関数を使うと、コンポーネントのプロパティの集合値を取得できます。

uses
  System.TypInfo;

begin
  Form1 := TForm1.Create(nil);
  WriteLn(SetToString(GetPropInfo(Form1.ClassInfo, 'Anchors'), GetOrdProp(Form1, 'Anchors'), False));
  //akLeft,akTop
  WriteLn(SetToString(GetPropInfo(Form1.ClassInfo, 'Anchors'), GetOrdProp(Form1, 'Anchors'), True));
  //[akLeft,akTop]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください