如何将自定义数据类型转换为字符串

问题描述 投票:0回答:2

我将其作为自定义数据类型:

type
    Status = (Playing, Pausing, Stopping, Display, Selected);

而且我想使用SwinGame库中的DrawText输出其中的一些:

arrayOfStatus[0] := Playing;
DrawText(arrayOfStatus[0], 'arial.ttf', 14, 55, 55);

它说"Got "Status", expected "AnsiString"有点可理解,因为它只接受字符串,而arrayOfStatus具有Status类型。那么如何将其转换为字符串?我只知道IntToStr作为转换器...

pascal custom-data-type
2个回答
1
投票

在您的情况下,状态既不是字符串也不是数字常数。您需要明确地为每个状态返回值。一个例子可能是一个函数返回每种状态的字符串:

Function Str_Status(St: Status): String;
Begin
Result:= '';
Case St Of
Playing: Result:= 'Playing';
Pausing: Result:= 'Pausing';
Stopping: Result:= 'Stopping';
// ... and so on
End; //Of case
End; //Of function

//Usage example:

Var State: String;
Begin
State:= Str_Status(arrayOfStatus[0]);
If State <> '' Then
  DrawText(State, 'arial.ttf', 14, 55, 55);
End;

1
投票

您已将自定义数据类型定义为enumerationenumeration是一种序数类型,默认值从0(零)开始,并且对于每个声明的成员,其默认值都从1开始递增。 (有关此方案的变体,请参见下面的注释)。

type
  Status = (Playing, Pausing, Stopping, Display, Selected);

由于它是序数类型,因此可用于为数组建立索引,因此,您可以声明const数组以保存每个Status的字符串表示形式:

const
  StatusStr:array[Status] of string =
    ('Playing', 'Pausing', 'Stopping', 'Display', 'Selected');

这里是一个简单的测试,可以将它们打印在TMemo

procedure TForm3.Button1Click(Sender: TObject);
var
  i: status;
begin
  for i := Low(Status) to High(Status) do
    Memo1.Lines.Add(StatusStr[i]);
end;

或分配标签的标题

StatusLabel.Caption := StatusStr[Playing];

注意!可以通过向成员声明特定值来更改枚举成员的顺序,例如:

type
  TMyEnum = (First = 1, Second, Third = 10);

这里,成员的序号为1、2、10。

由于这超出了您的问题范围,请在文档中查找有关这些枚举的规则和限制。

© www.soinside.com 2019 - 2024. All rights reserved.