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]