Delphi 解决字符串型的枚举值设置和读取的方法

需求:

对于枚举类型字段,一般数据库中存储的是整型值,但在业务处理中使用整型值可读性不强,且显示对应中文描述不方便。

例如订单状态的枚举值为:0:未支付   1:支付中    2:已支付    3:已退款,现在有一个需求需要在业务中判断订单的状态,处理相应的逻辑,并将订单状态对应的中文描述提示给用户。

那么普通的处理方式可能如下:

function HandleOrderStaus(orderStatus: integer): string;
begin
  case orderStatus of
    0: begin
       //...此处处理未支付的逻辑
       result := '未支付';
    end;
    1: begin
       //...此处处理支付中的逻辑
       result := '支付中';
    end;
    2: begin
       //...此处处理已支付的逻辑
       result := '已支付';
    end;
    3: begin
       //...此处处理已退款的逻辑
       result := '已退款';
    end;
    default:
      result := '未知的支付状态';
  end;
end;

此方法的缺点:在代码中用0、1、2、3表示订单状态,可读性不强,且对应中文描述不方便管理

解决方案:

一、枚举类型+常量数组

定义订单状态的枚举类型:

type
  //订单状态   0:未支付   1:支付中    2:已支付    3:已退款
  TOrderStatus = (osUnpaid=0, osPaying=1, osPaid=2, osRefund=3);

定义常量数组表示订单状态对应的中文描述,数组的下标用枚举类型:

const
  //订单状态中文描述常量数组
  ARR_ORDERSTATUS: array[TOrderStatus] of string = ('未支付', '支付中', '已支付', '已退款');

用枚举值进行业务逻辑处理:

function HandleOrderStaus(status: Integer): string;
begin
  case TOrderStatus(status) of
    osUnpaid: begin
       //...此处处理未支付的逻辑
       result := ARR_ORDERSTATUS[osUnpaid];
    end;
    osPaying: begin
       //...此处处理支付中的逻辑
       result := ARR_ORDERSTATUS[osPaying];
    end;
    osPaid: begin
       //...此处处理已支付的逻辑
       result := ARR_ORDERSTATUS[osPaid];
    end;
    osRefund: begin
       //...此处处理已退款的逻辑
       result := ARR_ORDERSTATUS[osRefund];
    end;
    default:
      result := '未知的支付状态';
  end;
end;

遍历显示所有订单状态中文描述:

function ShowAllOrderStatus: string;
var
  val: string;
begin
  Result := '';
  //遍历数组,返回所有订单状态中文描述
  for val in ARR_ORDERSTATUS do
  begin
    Result := Result + ' -- ' + val;
  end;
end;

枚举值和整形相互转换:

//将枚举值转为整形
Ord(osPaid)
//将整形转为对应枚举值
TOrderStatus(0)
二、枚举类型+字典类型

 定义订单状态的枚举类型:

type
  //订单状态   0:未支付   1:支付中    2:已支付    3:已退款
  TOrderStatus = (osUnpaid=0, osPaying=1, osPaid=2, osRefund=3);

初始化订单状态字典、遍历:

procedure ShowAllOrderStatus;
var
  val: string;
  orderStatusDict: TDictionary<TOrderStatus, string>;   //订单状态字典
  pair: TPair<TOrderStatus, string>;                    //用于存储临时键值对的变量
begin
  orderStatusDict := TDictionary<TOrderStatus, string>.Create;
  try
    //初始化字典
    orderStatusDict.Add(osUnpaid, '未支付');
    orderStatusDict.Add(osPaying, '支付中');
    orderStatusDict.Add(osPaid, '已支付');
    orderStatusDict.Add(osRefund, '已退款');

    //使用 pair 遍历字典,显示到 TMemo 控件(mmoOrderStatus)
    for pair in orderStatusDict do
    begin
      mmoOrderStatus.Lines.Add(IntToStr(Ord(pair.Key)) + ': ' + pair.Value);
    end;

    //仅遍历字典的 values 值
    for val in orderStatusDict.Values do
    begin
      mmoOrderStatus.Lines.Add(val);
    end;

    //显示“未支付”
    mmoOrderStatus.Lines.Add(orderStatusDict[osUnpaid]);

  finally
    orderStatusDict.Free;
  end;
end;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值