在Delphi中定义如下一记录类型
type
  TEmployee = record
  FirstName, LastName: string[40];
  BirthDate: TDate;
  case Salaried: Boolean of
    True: (AnnualSalary: Currency);
    False: (HourlyWage: Currency);
end;
小弟不明白的是Salaried的值从何而来??

解决方案 »

  1.   

    这是一个变体记录
    就像是c语言里面的union(记不清楚了)
      

  2.   

    我的理解是,Salaried只是增加可读性,没有实际用途。
      

  3.   

    case Salaried: Boolean of定义Salaried为布尔类型,(就和BirthDate: TDate;是定义BirthDate是日期类型一个道理)
    因为是布尔类型,所以值肯定为true或false,如此而已。
      

  4.   

    如何确定Salaried: Boolean 这个布尔类型的值呢,
    这样的记录类型如何使用呢?
      

  5.   

    可以直接使用
    e.g
    var
       te:TEmployee;
    te.AnnualSalary:=...
    也可以
    te.HourlyWage:=...
    其实AnnualSalary域和HourlyWage域是重叠在一起的,你想使用那个就使用那个,当然啦,具体使用那一个根据你的程序代码而定了。
      

  6.   

    type
    TwzExp=record
    case Tag:boolean of
    True:(x:integer);
    false:(y:array[0..3] of char);
    end;
    end; 


    e.g.
    var
    wz:TwzExp;
    wz.x:=$41424344;
    那么
    读取wz.y时
    wz.y[0]='A';
    wz.y[0]='B';
    wz.y[0]='C';
    wz.y[0]='D';

    同样给wz.y赋值为'ABCD'时
    wz.x=$41424344;

    因为asc('A')=$41

    好久没有写Pascal代码了
    以上可能有错,但是可以参考一下
      

  7.   

    其实很简单type
      TEmployee = record
      FirstName, LastName: string[40];
      BirthDate: TDate;
      case Salaried: Boolean of
        True: (AnnualSalary: Currency);
        False: (HourlyWage: Currency);
    end;Salaried是一逻辑型变量,该变量由TEmployee的实例变量进行维护,可设置为TRUE或FALSE
    当设置为TRUE时, TEmployee实例变量会声明一个Currency类型的AnnualSalary变量
    当设置为FALSE时,TEmployee实例变量会声明一个Currency类型的HourlyWage变量
      

  8.   

    to risingsoft(一苇渡江) :  Salaried是一逻辑型变量,该变量由TEmployee的实例变量进行维护,可设置为TRUE或FALSE
      当设置为TRUE时, TEmployee实例变量会声明一个Currency类型的AnnualSalary变量
      当设置为FALSE时,TEmployee实例变量会声明一个Currency类型的HourlyWage变量如何设置Salaried变量的值呢??
      

  9.   

    你根本不用去设置Salaried变量的值,这是自动维护的
    如果你用AnnualSalary变量,它的值就是true ,HourlyWage变量它的值就为false不过这两个变量使用了同一空间,所以使用时要注意
      

  10.   

    带有变体的记录类型
    Salaried: Boolean 相当于声明了一个变量(就像是var ...),目的是:通过对Salaried赋值来确定变体部分。
    如:
    Salaried := True 则记录变为:TEmployee = record
      FirstName, LastName: string[40];
      BirthDate: TDate;
      AnnualSalary: Currency);
      

  11.   

    带有变体的记录类型
    语法结构如下:
    type recordTypeName = record  fieldList1: type1;
      ...
      fieldListn: typen;
    case tag: ordinalType of
      constantList1: (variant1);
      ...
      constantListn: (variantn);
    end;
    tag是一个可选项,可以是任何合法的标识符,如果你忽略这个tag,那么直接写
    case :ordinalType  of 也一样 
    如:type
      TEmployee = record
      FirstName, LastName: string[40];
      BirthDate: TDate;
      case Boolean of
        True: (AnnualSalary: Currency);
        False: (HourlyWage: Currency);
    end;ordinalType 代表了一个序数类型type.
    每一个constantList代表序数类型的一个常量值
    如:
    type  TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
      TFigure = record
        case TShapeList of
          Rectangle: (Height, Width: Real);
          Triangle: (Side1, Side2, Angle: Real);
          Circle: (Radius: Real);
          Ellipse, Other: ();
      end;
     
    记录的变体字段部分共享相同的内存空间。
      

  12.   

    记录体内的case of 部分是变体类型,同c中的union一致。
    变体类型共享同一块内存。
      

  13.   

    type
      TEmployee = record
      FirstName, LastName: string[40];
      BirthDate: TDate;
      case Salaried: Boolean of
        True: (AnnualSalary: Currency);
        False: (HourlyWage: Currency);
      end;
    var
      employee:Temployee;
    begin
      employee.Salaried:=true;//存储salaried值
      employee.AnnualSalary:=122;
      //读出时
      if employee.salaried then
      write(employee.AnnualSalary)
      else
      write(employee.HourlyWage);
    end;
    //当然这个例子没体现出重要性
    //当变体里的变量类型不一样时就有用的必要了
    下面的结构中就不能存储变体选择项,只能靠自己定义什么情况用哪种
    type  TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
      TFigure = record
        case TShapeList of
          Rectangle: (Height, Width: Real);
          Triangle: (Side1, Side2, Angle: Real);
          Circle: (Radius: Real);
          Ellipse, Other: ();
      end;
      

  14.   

    我是这样理解以下记录类型的
     type
      TEmployee = record
      FirstName, LastName: string[40];
      BirthDate: TDate;
      case Salaried: Boolean of
        True: (AnnualSalary: Currency);
        False: (HourlyWage: Currency);
      end;
    1 AnnualSalary、HourlyWage放在一起;
    2 不管Salaried为true或false,都可以对AnnualSalary、HourlyWage进行读写;
    3 Salaried的取值无关紧要;可以省掉,只写case Boolean of就可以;
    4 AnnualSalary、HourlyWage前面谁为true、谁为false同样无所谓
      

  15.   

    risingsoft(一苇渡江) 和 wan_ming(wan ming) 说的对