我将其作为自定义数据类型:
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
作为转换器...
在您的情况下,状态既不是字符串也不是数字常数。您需要明确地为每个状态返回值。一个例子可能是一个函数返回每种状态的字符串:
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;
您已将自定义数据类型定义为enumeration
。 enumeration
是一种序数类型,默认值从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。
由于这超出了您的问题范围,请在文档中查找有关这些枚举的规则和限制。