複雑なデータ型は複合データ型とも呼ばれ、単純なデータ型(または基本的なデータ型)に関連しています。私はそれを複合データ型と呼ぶことを好みます、明らかにそれは実際には1つ以上の基本的なデータ型の組み合わせです
列挙型
Pascalプログラムは、数値処理だけでなく、非数値データの処理にも広く使用されています。たとえば、性別、月、曜日、色、ユニット名、学歴、職業などです。
定義
タイプ列挙型識別子=(識別子1、識別子2、...、識別子n)
特徴
列挙型要素は識別子のみにすることができます。列挙型を定義するときにリストされるすべての列挙型要素は、この列挙型の範囲(値の範囲)を構成します。例えば
次の型定義は有効です。
type
days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
そして、次の型の定義は間違っています:
type
colortype=('red','yellow','blue','white');
numbers=(1,3,5,7,9);
最初、初めて列挙型を使用したとき、Javaで列挙型の使用法を直接適用しましたが、明らかに壊れていました。
列挙型はシーケンシャル型です。各列挙型要素のシーケンス番号は、型が定義されたときの列挙型要素の配置順序に従って決定され、シーケンス番号は0から始まります。例えば
タイプdays =(sun、mon、tue、wed、thu、fri、sat);を定義し、次に、ord(sun)= 0、ord(mon)= 1、...などを定義します。
同じ列挙型要素を2つ以上の列挙型定義に含めることはできません。次の定義は間違っています:
type
color1=(red,yellow,white); // 因为red属于枚举类型color1和 color2
color2=(blue,red,black);
列挙型変数は、代入演算と関係演算のみを実行できますが、算術演算と論理演算は実行できません。列挙型要素を比較する場合、実際にはそれらのシリアル番号の比較です。例えば:
type
days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
var
color:colors;
weekday:days;
//则下面语句是合法的:
weekday:=mon;
if weekday=sun then
write('rest');
{而下面语句是不合法的:}
mon:=1; {错把枚举值当成变量名}
weekday:=blue; {枚举值blue不属于枚举变量weekday的值域}
read(color); {枚举类型变量 不能用读语句进行赋值}
write(weekday); {不能通过写语句输出枚举类型的变量值和枚举值。}
writeln(blue);
変数の説明を型の定義とマージできます。この種のゲームプレイはDelphiで非常に一般的であり、元の2つのステップを1つにマージするのと同じです。例えば:
var
holiday,workday:(sun,mon,tue,wed,thu,fri,sat);
color:(red,yellow,blue,white,black,green);
列挙データの入出力は間接的に行うことができます。入力の際は、通常、コードを入力してプログラムで変換し、出力の場合は、列挙した要素に対応する文字列を出力するだけです。これは、次のサンプル質問で使用されます。
列挙型要素を取得する
単一値の取得は比較的まれですが、取得できないわけではありません。私自身、列挙型のキーと値を取得する方法をずっと前に知りませんでした。
implementation
//该单元必须引入
uses System.TypInfo;
{$R *.dfm}
type
TColors = (Red, Green, Blue);
procedure TForm1.Button1Click(Sender: TObject);
var
Colors: TColor;
Info: PTypeInfo;
EnumName: string;
EnumValue: Integer;
begin
Info := TypeInfo(TColors);
//获取value对应的名称
EnumName := GetEnumName(Info, 1);
//获取名称对应的value
EnumValue := GetEnumValue(Info, EnumName);
ShowMessage(EnumName + ',' + EnumValue.ToString);
end;
列挙型の値をトラバースします:列挙型は順序付き型であるため、列挙型の変数をループ変数として使用できます。
uses System.TypInfo;
{$R *.dfm}
type
TColors = (Red, Green, Blue);
procedure TForm1.Button1Click(Sender: TObject);
var
Colors: TColors;
Info: PTypeInfo;
EnumPoint: PTypeData;
EnumName: string;
EnumValue: Integer;
begin
Info := TypeInfo(TColors);
//获取PTypeInfo的指针对象
EnumPoint := GetTypeData(Info);
//利用TypeData中的MinValue和MaxValue函数实现遍历
for var I := EnumPoint.MinValue to EnumPoint.MaxValue do begin
EnumName := GetEnumName(Info, I);
EnumValue := GetEnumValue(Info, EnumName);
ShowMessage(EnumName + ',' + EnumValue.ToString);
end;
end;
アプリケーション
例:現在の色を確認します。
implementation
uses System.TypInfo;
{$R *.dfm}
type
TColors = (Red, Green, Blue);
procedure TForm1.Button1Click(Sender: TObject);
var
Colors: TColors;
begin
case Colors of
Red: begin
ShowMessage('红色');
end;
Green: begin
ShowMessage('绿色');
end;
Blue: begin
ShowMessage('蓝色');
end;
end;
end;