代码之家  ›  专栏  ›  技术社区  ›  Khang

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

  •  0
  • Khang  · 技术社区  · 6 年前

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

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

    我想用 DrawText 来自Swingame图书馆:

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

    它说 "Got "Status", expected "AnsiString" 这是可以理解的,因为它只接受字符串,而且 arrayOfStatus 有一个 Status 类型。那么如何将其转换为字符串呢?我只知道 IntToStr 作为转换器…

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nicolás NC    6 年前

    在您的情况下,状态既不是字符串也不是数字常量。对于每个状态,您都需要明确的返回值。例如,函数返回每个状态的字符串:

    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;
    
        2
  •  1
  •   Tom Brunberg    6 年前

    您已将自定义数据类型定义为 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。

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

    推荐文章