複合データ型のDelphi基本チュートリアルグラフィックバージョン(列挙)

複雑なデータ型は複合データ型とも呼ばれ、単純なデータ型(または基本的なデータ型)に関連しています。私はそれを複合データ型と呼ぶことを好みます、明らかにそれは実際には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;

おすすめ

転載: blog.csdn.net/farmer_city/article/details/110121939