如何将WriteLn与枚举类型一起使用?

Tom*_*Tom 7 delphi pascal delphi-7

我正在尝试为一周中的几天制作自定义数据类型,但我无法写它.编译错误说明了这一点:

[Error] hours.dpr(28):Write/Writeln语句中的类型非法

program hours;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TypeDay = (Sun,Mon,Tue,Wed,Thu,Fri,Sat);

var day: TypeDay;

begin
     for day := Sun to Sat do
     begin
         writeln(day);
     end;
end.
Run Code Online (Sandbox Code Playgroud)

它在Windows上的Delphi 7中.

Ger*_*lí- 17

你不需要为此编写汇编程序; TypInfo包含执行此操作所需的所有内容(获取与枚举值关联的字符串).

这段代码:

program hours;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  TypInfo;

type
  TypeDay = (Sun,Mon,Tue,Wed,Thu,Fri,Sat);

var
  day: TypeDay;
  Str:String;

begin
     for day := Sun to Sat do begin
        Str := GetEnumName(TypeInfo(TypeDay),ord(day));
         writeln(Str);
     end;
end.
Run Code Online (Sandbox Code Playgroud)

这是输出:

替代文字

问候.

  • 请注意,如果为枚举成员分配了特定的序数值,则此操作无效,在这种情况下,编译器会剥离RTTI.(至少在我使用的每个版本的Delphi中都是如此)不确定原因.在这些情况下,键/值对是合理的解决方案. (3认同)
  • `TypeDay =(Sun = 1,Mon = 2,Tue = 3,Wed = 4,Thu = 5,Fri = 6,Sat = 7);`应该这样做. (2认同)

RRU*_*RUZ 11

Tom,Writeln不支持Enum作为参数.你必须调用Ord函数来获得序数表示.如果你想显示你的名字TypeDay你可以写这样的代码.

program hours;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TypeDay     = (Sun,Mon,Tue,Wed,Thu,Fri,Sat);
const
  TypeDayStr  : Array[TypeDay] of string = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');

var day: TypeDay;

begin
     for day := Sun to Sat do
       writeln( Ord(day));

     for day := Sun to Sat do
       writeln( TypeDayStr[day]);

     Readln;
end.
Run Code Online (Sandbox Code Playgroud)